title: Dependency Injection : Guice link: http://orhanbalci.net/tr/?p=1326 author: Orhan Balci description: post_id: 1326 created: 2014/11/21 21:22:46 created_gmt: 2014/11/21 18:22:46 comment_status: open post_name: dependency-injection-guice status: publish post_type: post
Dependency Injection : Guice
Dependency Injection test edilebilir, esnek, ve kontrol edilebilir kod geliştirmek için kullanılan bir tasarım kalıbıdır. Geliştirdiğiniz sınıfların bağımlılıklarının,kullanması gereken servislerin bir arayüz vasıtasıyla dışarıdan verilmesine olanak tanır. Bu makalede google tarafından geliştirilen Guice Dependency Injection kütüphanesi ile bir örnek göstereceğim. Örneğimiz yapay sinir ağlarında kullanılan nöronlar ve bunların bağımlı olduğu aktivasyon fonksiyonlarının implementasyonu şeklinde olacak. Öncelikle bağımlı olunan aktivasyon fonksiyonu için bir arayüz tanımlayalım : [java] public interface ActivationFunction { public abstract double apply(double inp); public abstract double reverse(double output); } [/java] Bu arayüzü gerçekleyen iki tane aktivasyon fonksiyon sınıfı yazalım : [java] public class ReluFunction implements ActivationFunction { @Override public double apply(double inp) { return Math.log(1 + Math.exp(inp)); } @Override public double reverse(double input) { return 1d / (1 + Math.exp(-input)); } } [/java] [java] public class IdentityFunction implements ActivationFunction { @Override public double apply(double inp) { return inp; } @Override public double reverse(double output) { return output; } } [/java] Şimdi de bu aktivasyon fonksiyonlarını kullanacak olan yapay sinir ağının nöron sınıfını geliştirelim. Bu sınıfı temel injection yöntemi olan constructor (yapıcı method) üzerinden inject edelim. ActivationFunction bağımlılğını constructor parametresi olarak geçmeliyiz ve bu constructoru @inject annotasyonu ile işaretleyelim. Dikkat etmemiz gereken noktalar constructor parametresi ve @inject annotasyonu. [java] import com.google.inject.Inject; public class Neuron { private ActivationFunction af; @Inject public Neuron(ActivationFunction pAf){ af = pAf; } public double getResult(double inp){ return af.apply(inp); } }[/java] Sonraki adımımız Guice’e Neuron nesneleri oluştururken kullanması gereken ActivationFunction implementasyon tipini bildirmek. İleride dependency değişimi yapmak gerekirse tek yapmamız gereken bu sınıfı değiştirmek olacaktır. Module arayüzünü gerçekleyen bir sınıf yazıyoruz. Burada Guice’e ActivationFunction bağımlılığı için IdentityFunction implementasyonunu kullanmasını söylüyoruz. [java] import com.google.inject.Binder; import com.google.inject.Module; public class NeuralNetworkModule implements Module { @Override public void configure(Binder binder) { binder.bind(ActivationFunction.class).to(IdentityFunction.class); } } [/java] Yeni bir Neuron nesnesi oluşturmak istediğimizde Injector sınıfının getInstance methodunu kullanıyoruz. Dependency Injection kullanırken new ile herhangi bir nesne oluşturmuyoruz. [java] import com.google.inject.Guice; import com.google.inject.Injector; public class Main { public static void main(String[] args) { Injector inj = Guice.createInjector(new NeuralNetworkModule()); Neuron n = inj.getInstance(Neuron.class); System.out.println(n.getResult(5)); } } [/java] [ad#Yazi Ici Buyuk]