এর আগের পোস্ট-এ ইনভার্সন অব কন্ট্রোল এবং ডিপেনডেন্সি ইনজেকশান এর ভেতরের কথা গুলো বলার চেষ্টা করেছি, এবার একটি উদাহরণ দেওয়া যাক।
এই উদাহরণটির জন্যে আমি স্প্রিং ফ্রেমওয়ার্ক ব্যবহার করবো। আমি একটি ছোট্ট এপ্লিকেশান লিখেছি যার নাম টকার এপ, যে বিভিন্ন ভাষায় হ্যালোওয়ার্ল্ড বলতে পারে। শুরুতে একটা ITalkable ইন্টারফেইস আছে যা একটি talk() মেথড এক্সপোজ করে।
package org.codexplo;
public interface ITalkable {
public void talk();
}
তারপর EnglishTalker এবং JapaniTalker ক্লাস Italkable কে ইম্প্লিমেন্ট করে এবং তারা দুই ভাষায় কথা বলে।
package org.codexplo;
public class EnglishTalker implements ITalkable {
@Override
public void talk() {
System.out.println("Hello world");
}
}
package org.codexplo;
public class JapaniTalker implements ITalkable {
@Override
public void talk() {
System.out.println("こんにちは、世界");
}
}
এখন মনে করি আমাদের একটি TalkerService আছে যে নির্ধারণ করে দেয় এই মুহূর্তে আমাদের এপ কোন টকারটি ব্যবহার করবে। আমাদের TalkerService এ একটি মেথড আছে, sayHelloworld() এবং এর উপরে একটি ITalkable এর রেফারেন্স আছে, যেখানে আমরা সরাসরি এর এর ইনসটেন্স ক্রিয়েট করেছি।
package org.codexplo;
public class TalkerService {
private ITalkable talkable = new EnglishTalker();
public void sayHelloworld() {
talkable.talk();
}
}
এখন আমরা আমাদের মেইন এপটা লিখি ।
package org.codexplo;
public class TalkerApp {
public static void main(String[] args) {
TalkerService talkerService = new TalkerService();
talkerService.sayHelloworld();
}
}
এখন আমরা একটু ক্লাস ডায়াগ্রাম দেখি।
আমরা খুব সহজেই দেখতে পারছি, আমাদের সিস্টেম খুব টাইটলি কাপল্ড। কারণ আমরা কোন ভাষায় হ্যালো ওয়াল্ড বলবো আমাদেরকে হার্ড কোড করে বলে দিতে হচ্ছে প্রতিবার।
যেহেতু আমাদের উদ্দেশ্য একটি লুজলি কাপলড সিস্টেম তৈরি করা, এখন দেখি কিভাবে এই জিনিসটি ইনভার্সন অব কন্ট্রোল ব্যবহার করে করা যায়। স্প্রিং ফ্রেমওয়ার্ক একটি একটি কনটেইনার প্রোভাইড করে কম্পোনেন্ট ম্যনেজ করার জন্যে। আমরা এগুলো আগের পোস্টে বলেছি। আমরা আমাদের TalkerService টাকে একটু পরিবর্তন করি।
package org.codexplo;
public class TalkerService {
private ITalkable talkable;
public void setTalkable(ITalkable talkable) {
this.talkable = talkable;
}
public void sayHelloworld() {
talkable.talk();
}
}
আমরা এখনে সরাসরি অবজেক্ট ক্রিয়েট না করে একটি সেটার ইনজেকশান ব্যবহার করেছি। অবজেক্ট ক্রিয়েট এর কাজটি ছেড়ে দিলাম কনটেইনার এর কাছে। এই TalkerService কখনোই ITalkable এর ইম্প্লিমেন্টেশানের এর অবজেক্ট ক্রিয়েট করবে না, বরং তাকে তা প্রভাইড করা হবে। অর্থাৎ সে রানটাইমে জেনে যাবে তাকে কোন ভাষায় কথা বলতে হবে।
এখন একটু ক্লাস ডায়াগ্রাম দেখি।
এখন সিস্টেম অনেক লোজলি কাপল্ড। এখানে সেটার ইনজেকশান ব্যবহার করা হয়েছে।
এই কাজটি করতে হলে আমাদের কে একটি কনফিগারেশান ফাইল মেইনটেইন করতে হয়
<!--?<span class="hiddenSpellError" pre=""-->xml version="1.0" encoding="UTF-8"?> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd" > <bean id="englishTalker" > <!--<span class="hiddenSpellError" pre=""-->bean> <bean id="japaniTalker" > </bean> <bean id="talkerService" > <property name="talkable" > <ref local="englishTalker" /> </property> </bean> </beans>
আর আমাদের মেইনএপ ক্লাসটি দেখতে এখন হবে …
</pre>
package org.codexplo;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class IOCTalkerApp {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext(
"beans.xml");
TalkerService talkerService = (TalkerService) context
.getBean("talkerService");
talkerService.sayHelloworld();
}
}
<pre>
এই প্রোগ্রামটি রান করতে তোমার যা যা লাগবে
antlr-runtime-3.0.jar commons-logging-1.0.4.jar org.springframework.asm-3.0.0.M3.jar org.springframework.beans-3.0.0.M3.jar org.springframework.context-3.0.0.M3.jar org.springframework.context.support-3.0.0.M3.jar org.springframework.core-3.0.0.M3.jar org.springframework.expression-3.0.0.M3.jar
এই যারগুলো ক্লাসপাথ এ এড করতে হবে।
ডাউনলোড: Full Source & Libs
খুব সুন্দর করে বুঝিয়েছিস। কিন্তু এখানে Container Provide করছে Spring.
আমার ঐ লুজলি কাপলড ডায়াগ্রাম পর্যন্ত সহজ লেগেছে। একটা কি Container নিজে বানিয়ে দেখানো সম্ভব?
defiantly বানানো সম্ভব, কিন্তু জিনিসটি খুব বেশি সহজ হবে না, তাছাড়া অনেক ভাল ভাল Container বানানোই আছে, গুগুল গুইস আমরা যেকোন প্রজেক্টের জন্যে ব্যবহার করতে পারি। ডট নেটের জন্যে ninject সবচেয়ে ভাল। আমি ninject ব্যবহার করি।
Nice explanation.
But I failed to understand the symbols you used in the class diagram. I tried these:
http://www.holub.com/goodies/uml/
http://loufranco.com/blog/assets/cheatsheet.pdf
Can you please suggest me some resource to understand your class diagram?
Thanks in advance