惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

S
Secure Thoughts
Recent Commits to openclaw:main
Recent Commits to openclaw:main
H
Heimdal Security Blog
SecWiki News
SecWiki News
H
Hacker News: Front Page
N
News | PayPal Newsroom
L
LINUX DO - 最新话题
N
News and Events Feed by Topic
TaoSecurity Blog
TaoSecurity Blog
AI
AI
C
Cybersecurity and Infrastructure Security Agency CISA
Scott Helme
Scott Helme
PCI Perspectives
PCI Perspectives
S
Securelist
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
Cyberwarzone
Cyberwarzone
A
Arctic Wolf
Forbes - Security
Forbes - Security
T
Tor Project blog
Spread Privacy
Spread Privacy
WordPress大学
WordPress大学
I
Intezer
Martin Fowler
Martin Fowler
Help Net Security
Help Net Security
P
Proofpoint News Feed
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Cisco Talos Blog
Cisco Talos Blog
Latest news
Latest news
博客园 - 司徒正美
W
WeLiveSecurity
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
V
V2EX
P
Palo Alto Networks Blog
Google DeepMind News
Google DeepMind News
IT之家
IT之家
阮一峰的网络日志
阮一峰的网络日志
V
Vulnerabilities – Threatpost
Jina AI
Jina AI
S
Security Affairs
Hacker News - Newest:
Hacker News - Newest: "LLM"
Simon Willison's Weblog
Simon Willison's Weblog
Project Zero
Project Zero
T
Threatpost
P
Privacy International News Feed
人人都是产品经理
人人都是产品经理
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
Application and Cybersecurity Blog
Application and Cybersecurity Blog
博客园 - Franky
Hugging Face - Blog
Hugging Face - Blog
Apple Machine Learning Research
Apple Machine Learning Research

Yusuf Aytas

When Code Is Cheap, Does Quality Still Matter? Why Crouching Tiger, Hidden Dragon Is a Masterpiece Why We Ignore Advice The Mirror Is Part of the Machine When Too Many Maps Overlap on One Person The Work Runs on Different Maps Your Work Introduces You Trial By Fire The Dude Why Headcount Math Lies Capacity Is the Roadmap The Roadmap Is Not the System Torres del Paine W Trek Escaping Status Theater Incentives Drive Everything Scaling Culture Without Dilution What Good Looks Like Why Airport Security Feels Random Why Politics Appear How to Work with Me The Janus Protocol Multi-Horizon Delivery Framework What Good Execution Looks Like Managing Your Manager Why Kingdom of Heaven’s Director’s Cut Is Better AI Broke Interviews Most of What We Call Progress Managers Have Been Vibe Coding All Along Stop Wasting Brainpower Why Over-Engineering Happens Prisoner's Dilemma Climbing No More The Weekly Win Mevlana Candy Brewing Turkish Tea Onboarding Your Engineering Manager Technical Deep Dives Yapay Zekâ Çağında Bilgisayar Mühendisliği Building Remote Teams From Idea to Launch in 2 Weeks Reflecting on Software Engineering Handbook Representing the Business New Manager Survival Guide Take Self Reviews Seriously Chasing Real Respect The Invisible Difference Learning the Johari Window Management is a Lonely Place Simple Task Management AI Balance in Work PIP Manager Insights Engineering Manager Interview Preparation Work-Life Balance as a Manager Bridging the Management Disconnect Tech Hiring Bubble Bursts Traits for EMs Simple Acts of Recognition Matter The Question I Ask Every New Report The Reality of an Employer's Market Bridging Ideals and Reality Hiring Red Flags Why The Godfather Is So Damn Good Subteam Tenets No Fluff Please Losing a Top Performer Balancing Act of Reliability Building Trust in Engineering Teams Ideal Number of Direct Reports Overriding a People Leader’s Decision From Misperception to Promotion Perception vs Perspective Setting Goals From Engineer to Manager Getting Delegation Right Interviewing Your Future Boss Celebrating Our Book in Iceland Operational Skills Needed On Writing Software Engineering Handbook Charlie Munger Quotes Working with Dependencies From Las Vegas to Canyons Navigating Layoffs Handling Competitive Dynamics A Weekend Getaway to Malta Engineering Health Essentials Should Dev Managers Code? Confronting the Life on Pause Winning Eleven Kindness is A Choice Bireysel Katılımcılar ve Yöneticiler Leading from Where You Are The Subtle Art of Listening Coding in Leadership The Power of Consistency The Making of a Leader The Path to Leadership Embracing TikTok Talent Sourcing Journey Leading Self Managing Teams Cracking Coding Bottlenecks
Cepheye Yönelik Programlama
Yusuf Aytas · 2012-01-30 · via Yusuf Aytas

Published · 4 min read

Yazılım dünyasında başlıca endişelerinden biri, yazılımdaki parçaların biri birine çok bağlanmasıdır(high coupling, cross-cutting concerns). Bu durum yazılımın belirli bir noktadan sonra anlaşılmaz, ayrıştırılamaz, ilerletilebilemez hale gelmesine yol açar. Çare olarak yazılımcılar, en yaygın yöntem olan yazılım şablonlarını kullanırlar. Fakat, bazen işler o kadar karmaşık bir hal alır ki artık, yazılım şablonları da karmaşayı sonlandıramaz. Bu noktada cepheye yönelik programlama(aspect-oriented programming, AOSD) yazılımcıların imdadına yetişmektedir. Cepheye yönelik programlama, destekleyen yada yardımcı olarak görev yapan kısımların, asıl parçalardan arındırılmasıdır. AOSD, farklı işlevlere sahip kısımların, biri birinden ayrı(seperation of concerns) programlanmasına olanak tanıyarak karmaşayı giderebilir. Yazımın devamında, biri birine bağlanan parçalarından, AOSD'den ve son olarakta AOSD uygulamalarından bahsedeceğim. Parçaların biri birine bağlı olması, gerçek hayatta karşımıza sıkça çıkan sorunlardan biridir. Çoğu zaman, yazılımın içindeki bağlılıkların(dependency) ortaya çıkmasında başlıca rol oynamaktadır. Bu duruma örnek verecek olursak, bir fonksiyonun güvenlik(security), kayıt düşme(logging) ve veri işleme(transaction processing) bağlılıkları olabilir. Bunları aynı yerde yazmak, yazılımın çok karmaşık bir hale gelmesine neden olur. Bu durum, önemli bir dez avantaja, yazılım yeniden kullanılmasına yada varolanın değiştirilmesine engel teşkil eder. Aşağıdaki örnekte bu duruma örnek verebileceğimiz bir fonksiyon görebilirsiniz.

public boolean saveStory(String story) throws Exception{
	if (user.isAuthenticatedUser()) {
		if (persister.save(user.id, story)) {
			logger.info("Story for the user has been added.");
			return true;
		} else{
			logger.error("Story is not saved.");
			throw new StoryNotSavedException();
		}
	} else{
		logger.error("User is not authorized.");
		throw new UnAuthorizedUserException();
	}
}

Yazılımdaki kısımların biri birine bağlı olması sorununu AOSD ile etkili bir şekilde çözebiliriz. AOSD bizim asıl fonksiyonu hayata geçirip, yardımcı fonksiyonlardan kurtulmamızı sağlayan bir yaklaşımdır. Yukarıdaki örnek üzerinden gidecek olursak, fonksiyondaki asıl amaç kullanıcı hikayesini başarılı bir şekilde kaydetmektir. Ama hikayeyi kaydederken, hikayenin kaydedildiğine dair kayıt düşme, kullanıcının bu işlem için yetkili olup olmadığına bakma ve veri işleme fonksiyona yardımcı yada fonksiyonu destekleyen işlevlerdir. AOSD, bizim asıl fonksiyona yoğunlarşıken, dışarıdan müdahale ile(by the help of pointcut) gerekli diğer işlevleri yerine getirmemizi sağlar. Bu bağlamda Spring framework ile AOSD, nasıl uygulanabileceğine değinmek istiyorum. Spring Framework AOSD'ye aspectj paketiyle destek oluyor. Dahası, Spring Framework kendiliğinden bazı cepheleri(aspect) sağlıyor çünkü Spring'in uyguladığı annotation'lar  cepheye yönelik programlamanın parçalarıdır denebilir. Mesela, @Autowired-Spring Bean olan bir nesnenin başka bir nesne içinden kısa yoldan çağrılmasına yarar yada @Component-Sınıfın Spring Bean olduğunu gösterir. Bu tip kullanımlar koddaki bağımlılığı azaltarak, fonksiyonların yada sınıfların daha basit olmasına yardımcı olur. Cepheye yönelik programlamanın uygulamasını Spring Framework'un AspectJ paketini kullanarak yapabiliriz.  Aşağıdaki kodda size yukarıda verilen fonksiyonun, cephe yardımıyla nasıl kayıt düşme bağımlılığından kurtaracağımızı görebilirsiniz. Kısaca bir kaç kavramdan bahsetmek istiyorum. AOSD'de fonksiyonlara erişim noktası pointcut adıyla tanımlanmıştır. Belirli bir erişim noktasıyla, istediğiniz fonksiyona ulaşıp fonksiyonun işleyişine(@AfterReturning) göre işlem yapabiliriz. Verdiğimiz örnekte within ve execution erişim noktalarını kullanarak fonksiyona ulaşıp, işleyişine göre kayıt düşme işlemini gerçekleştirdik. Kullanım detayları için Spring AOSD referansına bakabilirsiniz.

package com.yusufaytas.ao;

import org.apache.log4j.Logger;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;

import com.yusufaytas.example.StoryNotSavedException;
import com.yusufaytas.example.UnAuthorizedUserException;

@Aspect
public class LoggingAspect {

	Logger logger = Logger.getLogger(LoggingAspect.class.getName());

	@Pointcut("execution(public \* saveStory(..))")
	public void saveStory(){}

	@Pointcut("within(com.yusufaytas.example.LoggingExample)")
	public void inLoggingExample(){}

	@Pointcut("saveStory()&&inLoggingExample()")
	public void saveStoryInLoggingExample(){}

	@AfterThrowing(pointcut="saveStoryInLoggingExample()",throwing="ex")
	public void logUnAuthorizedUserException(UnAuthorizedUserException ex){
		logger.error("User is not authorized.");
	}

	@AfterThrowing(pointcut = "saveStoryInLoggingExample()",throwing="ex")
	public void logStoryNotSavedException(StoryNotSavedException ex) {
		logger.error("Story is not saved.");
	}

	@AfterReturning(pointcut="saveStoryInLoggingExample()",returning="isSaved")
	public void logDatabaseAccess(boolean isSaved) {
		logger.info("Story for the user has been added.");
	}

}

Yazılımda öncelikli amacımız, yazdığımız kodun basit ve olabildiğince geliştirilebilir, sürdürülebilir yada rahat bir yapıya sahip olmasıdır. Bu durum göze alındığında, cepheye yönelik programlama, bu ihtiyaçları karşılamak için kullandığımız bir yöntemdir. Bunun haricinde daha öncede bahsettiğimiz, yazılım şablonları yada kullanılan kütüphaneler yine yukarıda saydığımız gereksinimleri karşılamaya yöneliktir. Yazıda sıkça bahsettiğim Spring Framework de sınıfların biri birine bağlanmasını önleyen bir şablonu(inversion of control) hayata geçirerek yazılımcıya basit bir ortam sunarak gereksinimlerimizi karşılamaktadır. Sonuç olarak, cepheye yönelik programlama bazı noktalarda iyi bir yöntem olsa da öncelikli tercihin yazılım şablonları yada kütüphane desteğini kullanmak olduğuna inanmaktayım. Her konuda olduğu gibi değişik yaklaşımlar arasından en iyisini seçmenin yada birden fazla yaklaşıma sahip olmanın fark yaratacağını düşünüyorum.