Back

/ 3 min read

ইনভার্শন অব কন্ট্রোল নীতি

এই ব্লগে আমি জাভা ওয়েব প্রোগ্রামিং এবং ইনভার্শন অব কন্ট্রোল ও ডিপেন্ডেন্সি ইনজেকশনের বিষয়ে আলোচনা করতে চলেছি।

Last Updated:

সবাইকে সাগতম আমার নতুন ব্লগে। সম্প্রতি আমি একটি বই পড়ি আ ন ম বজলুর রহমান স্যারের। যার নাম জাভা ওয়েব প্রোগ্রামিং

বইয়ের বিষয়বস্তু

এখানে জাভার একদম মৌলিক কম্পোনেন্ট (যেমন: Servlet, JSP, JDBC, ইত্যাদি) দিয়ে সার্ভার সাইট জাভা ওয়েব অ্যাপ্লিকেশন তৈরির ব্যপারে আলোচনা করা হয়েছে। এখানেই শেষের একটি আধ্যয়ে আলোচনা করা ছিল ইনভার্শন অব কন্ট্রোল ও ডিপেনডেন্সি ইনজেকশন নিয়ে।

আমার কাছে মনে হয়েছে এই বইটি আমাকে ইনভার্শন অব কন্ট্রোল ও ডিপেনডেন্সি ইনজেকশনের গুরুত্বটা নিখুঁতভাবে বোঝাতে পেরেছে।

উদাহরণ: UserService ক্লাস

এখন ধরুন আমাদের একটি ক্লাস আছে UserService নামে যার কাজ হলো ইউজার রিলেটেড বিভিন্ন business লজিক হ্যান্ডেল করা।

1
public class UserService {
2
private final JdbcUserRepository userRepository = new JdbcUserRepository();
3
private final MD5PasswordEncryption passwordEncryption = new MD5PasswordEncryption();
4
5
public User saveUser(User user) {
6
user.setPassword(passwordEncryption.encrypt(user.getPassword()));
7
return userRepository.save(user);
8
}
9
}

ডিপেনডেন্সির ধরন

আমরা জানি ডিপেনডেন্সি দুই ধরনের হয়:

  1. স্টংলি কাপলড ডিপেনডেন্সি (Strongly coupled dependency)
  2. লুজলি কাপলড ডিপেনডেন্সি (Loosely coupled dependency)

লুজলি কাপলড ডিপেনডেন্সি

এখন এর সমাধান হলো এই দুইটি ক্লাসকে লুজলি কাপলড ডিপেনডেন্সি হিসেবে পরিবর্তন করা।

UserRepository ইন্টারফেস

1
public interface UserRepository {
2
User save(User user);
3
}
4
5
public class JdbcUserRepository implements UserRepository {
6
@Override
7
public User save(User user) {
8
// store user in database
9
return user;
10
}
11
}
12
13
public class RemoteUserRepository implements UserRepository{
14
@Override
15
public User save(User user) {
16
// send user in other server
17
return user;
18
}
19
}

PasswordEncryption ইন্টারফেস

1
public interface PasswordEncryption {
2
String encrypt(String password);
3
}
4
5
public class MD5PasswordEncryption implements PasswordEncryption {
6
@Override
7
public String encrypt(String password) {
8
// implement password encryption using MD5
9
return password;
10
}
11
}
12
13
public class Sha256PasswordEncryption implements PasswordEncryption{
14
@Override
15
public String encrypt(String password) {
16
// implement password encryption using SHA 256
17
return password;
18
}
19
}

পরিবর্তিত UserService ক্লাস

1
public class UserService {
2
private final UserRepository userRepository;
3
private final PasswordEncryption passwordEncryption;
4
5
public UserService(UserRepository userRepository, PasswordEncryption passwordEncryption) {
6
this.userRepository = userRepository;
7
this.passwordEncryption = passwordEncryption;
8
}
9
10
public User saveUser(User user) {
11
user.setPassword(passwordEncryption.encrypt(user.getPassword()));
12
return userRepository.save(user);
13
}
14
}

ইনভার্শন অব কন্ট্রোল

এখন UserService-কে একটু পরিবর্তন করে UserRepository এবং PasswordEncryption ইন্টারফেসের অবজেক্টে UserService-এর কনস্ট্রাক্টর এর মাধ্যেমে নিয়ে কাজ করবো।

1
UserService userService = new UserService(
2
new JdbcUserRepository(),
3
new MD5PasswordEncryption()
4
);

এখন যদি আমাদের Sha256PasswordEncryption প্রয়োজন হয়:

1
UserService userService = new UserService(
2
new JdbcUserRepository(),
3
new Sha256PasswordEncryption()
4
);

তাহলে এখানে ডিপেনডেন্সি সরবরাহ করার কন্ট্রোলটি ইনভার্ট হয়েছে। UserService-কে নিজে থেকে ডিপেনডেন্সি তৈরি করতে হচ্ছে না। বরং এটি অন্য কেউ করছে। একেই বলা হয় ইনভার্শন অব কন্ট্রোল (Inversion of Control)।

উপসংহার

এটি একটি সফটওয়্যার ইঞ্জিনিয়ারিং নীতি (software engineering principle) যার ব্যবহার ব্যপক। প্রায় সমস্ত সফটওয়্যার framework এটি ব্যবহার করেই (যেমন: Spring, .NET, Laravel, Django, Rails এত্যাদি)।

এটিই ছিল ইনভার্শন অব কন্ট্রোল নিয়ে আমার আলোচনা। অন্য কোন ব্লগে এর পরবর্তীতে বিষয় ডিপেনডেন্সি ইনজেকশন নিয়ে আলোচনা করা হবে।

সবাই করে ধন্যবাদ, খোদা হাফেজ।