আমরা এখন ক্লিন আর্কিটেকচার পাজলটির এমন একটি অংশে পৌঁছেছি যা ছাড়া আপনার অ্যাপের লেয়ারগুলো একে অপরের সাথে কথা বলতে পারবে না। ৬ষ্ঠ পর্বে আমরা আলোচনা করবো Mappers নিয়ে। এটি মূলত একটি অনুবাদক (Translator) হিসেবে কাজ করে।
Mappers: ডোমেইন ও ডাটা লেয়ারের মধ্যে নিপুণ অনুবাদক
ক্লিন আর্কিটেকচার সিরিজের আগের পর্বে আমরা ডাটা সোর্স নিয়ে কথা বলেছি। সেখান থেকে আমরা UserModel বা ProductModel-এর মতো ডেটা পাই। কিন্তু সমস্যা হলো, আমাদের ২ নম্বর আর্টিকেলে আমরা দেখেছি যে ডোমেইন লেয়ার শুধু Entity-কে চেনে।
এখন প্রশ্ন হলো, ডাটা লেয়ার থেকে আসা এই Model-কে ডোমেইন লেয়ারের Entity-তে রূপান্তর করবে কে? এই কাজটিই করে Clean Architecture Mappers।
ম্যাপার কেন প্রয়োজন? (The “Why”)
অনেকে ভাবতে পারেন, “ভাই, মডেল আর এনটিটি তো প্রায় একই রকম দেখতে, সরাসরি মডেল ব্যবহার করলেই তো হয়!”
কিন্তু মনে রাখবেন, আপনার Model সরাসরি API-এর রেসপন্স (JSON) এর ওপর নির্ভরশীল। যদি কালকে API-এর ফিল্ডের নাম বদলে যায়, আপনার মডেলেও পরিবর্তন আনতে হবে। আপনি কি চান আপনার API-এর পরিবর্তনের কারণে আপনার বিজনেস লজিক বা এনটিটিও বদলে যাক? নিশ্চয়ই না।
Clean Architecture Mappers ব্যবহারের সুবিধা:
- Decoupling: এটি ডোমেইন লেয়ারকে ডাটা লেয়ারের পরিবর্তন থেকে সুরক্ষিত রাখে।
- Clean Entities: আপনার এনটিটিতে কোনো
fromJsonবাtoJsonমেথড রাখার দরকার পড়ে না। এনটিটি থাকে একদম পিওর (Plain Old Object)। - Data Transformation: অনেক সময় API থেকে আসা ডেটা আমাদের ইউআই-এর উপযোগী থাকে না। ম্যাপার সেই ডেটাকে সুন্দরভাবে প্রসেস করে এনটিটিতে রূপান্তর করতে পারে।
প্র্যাকটিক্যাল কোড ইমপ্লিমেন্টেশন
ফ্লাটারে আমরা দুইভাবে ম্যাপার ব্যবহার করতে পারি। সবচাইতে আধুনিক এবং ক্লিন উপায় হলো Extension ব্যবহার করা।
ধাপ ১: মডেল থেকে এনটিটি রূপান্তর
ধরা যাক, API থেকে আসা মডেলের নাম UserModel এবং ডোমেইন লেয়ারের এনটিটির নাম UserEntity।
// Data Layer: mappers/user_mapper.dart
extension UserMapper on UserModel {
UserEntity toEntity() {
return UserEntity(
id: this.id,
fullName: this.firstName + " " + this.lastName, // ডেটা ট্রান্সফরমেশন
email: this.emailAddress,
);
}
}
ধাপ ২: এনটিটি থেকে মডেল রূপান্তর (যদি পোস্ট করতে হয়)
extension UserEntityMapper on UserEntity {
UserModel toModel() {
return UserModel(
id: this.id,
firstName: this.fullName.split(" ")[0],
lastName: this.fullName.split(" ")[1],
emailAddress: this.email,
);
}
}
সারকথা
Clean Architecture Mappers হলো সেই অদৃশ্য দেয়াল যা আপনার অ্যাপের লেয়ারগুলোর মধ্যে স্বাধীনতা নিশ্চিত করে। ম্যাপার ছাড়া আপনার ক্লিন আর্কিটেকচার অসম্পূর্ণ। এটি আপনার কোডকে করে তোলে আরও বেশি ডিবাগ-ফ্রেন্ডলি এবং প্রফেশনাল।
পরবর্তী পর্বে আমরা শিখবো Dependency Injection (DI)—কীভাবে এই সবগুলোকে (Repository, Use Case, Mapper) অটোমেটিক একে অপরের সাথে কানেক্ট করতে হয়।
ডেটা ম্যাপিং প্যাটার্ন নিয়ে আরও বিস্তারিত জানতে Data Mapper Pattern উইকিপিডিয়া পেজটি দেখতে পারেন।