কোড ডিজাইন করার সময় আপনার কাছে দুটি উপায় থাকে।
- কেবল এটি সম্পন্ন করুন, এক্ষেত্রে কোনও সমাধান আপনার পক্ষে কার্যকর হবে
- পেডেন্টিক হোন এবং এমন একটি সমাধান ডিজাইন করুন যা ভাষার ভাবগুণকে তার মতাদর্শকে কাজে লাগায় (এই ক্ষেত্রে ওও ভাষাগুলি - সিদ্ধান্ত প্রদানের জন্য বহুরূপীকরণের ব্যবহার)
আমি দুজনের প্রথমটির দিকে মনোনিবেশ করতে যাচ্ছি না, কারণ সত্যই বলার কিছু নেই। আপনি যদি এটি কেবল এটির কাজ পেতে চান, আপনি কোডটি যেমন রেখে দিতে পারেন।
তবে কী হবে, যদি আপনি পেডেন্টিক পদ্ধতিতে এটি করতে পছন্দ করেন এবং বাস্তবে আপনি যেভাবে এটি করতে চান সেটি নকশার ধরণগুলি দিয়ে সমস্যার সমাধান করেছেন?
আপনি নিম্নলিখিত প্রক্রিয়াটি খুঁজছেন হতে পারে:
ওও কোড ডিজাইন করার সময়, কোডগুলিতে থাকা বেশিরভাগ এসগুলিতে if
সেখানে থাকতে হবে না। স্বাভাবিকভাবেই, আপনি যদি দুটি স্কেলারের প্রকারের তুলনা করতে চান, যেমন int
এস বা float
এস, আপনার একটি হওয়ার সম্ভাবনা রয়েছে if
তবে আপনি যদি কনফিগারেশনের উপর ভিত্তি করে পদ্ধতিগুলি পরিবর্তন করতে চান তবে আপনি যা চান তা অর্জন করতে পলিমারফিজম ব্যবহার করতে পারেন, সিদ্ধান্তগুলি সরিয়ে নিন ( if
গুলি) আপনার ব্যবসায়ের যুক্তি থেকে এমন কোনও জায়গায়, যেখানে বস্তুগুলি তাত্ক্ষণিকভাবে তৈরি হয় - কারখানায় ।
এখন পর্যন্ত, আপনার প্রক্রিয়াটি 4 টি পৃথক পাথের মধ্য দিয়ে যেতে পারে:
data
এনক্রিপ্ট করা বা সংকুচিত হয় না (কিছুই কল করুন না, ফিরে আসুন data
)
data
সংকুচিত (কল compress(data)
এবং এটি ফিরে)
data
এনক্রিপ্ট করা হয়েছে (কল করে encrypt(data)
এটি ফিরিয়ে দিন)
data
সংকুচিত এবং এনক্রিপ্ট করা হয়েছে (কল করুন encrypt(compress(data))
এবং এটি রিটার্ন করুন)
কেবল 4 টি পথ দেখে আপনি একটি সমস্যা দেখতে পান।
আপনার কাছে একটি প্রক্রিয়া রয়েছে যা কল করে 3 (তাত্ত্বিকভাবে 4, যদি আপনি কোনওটিকে এক হিসাবে কল না করে গণনা করেন) বিভিন্ন পদ্ধতি যা ডেটা ম্যানিপুলেট করে এবং তারপরে এটি ফিরিয়ে দেয়। পদ্ধতিগুলির বিভিন্ন নাম রয়েছে , বিভিন্ন তথাকথিত পাবলিক এপিআই (পদ্ধতিগুলি তাদের আচরণের সাথে যোগাযোগ করার উপায়)।
অ্যাডাপ্টার প্যাটার্ন ব্যবহার করে , আমরা যে নামটি পেয়েছি সেগুলি (আমরা সর্বজনীন এপিআইকে একত্রিত করতে পারি) সমাধান করতে পারি। সহজভাবে বলেছিলেন, অ্যাডাপ্টার দুটি বেমানান ইন্টারফেস একসাথে কাজ করতে সহায়তা করে। এছাড়াও, অ্যাডাপ্টার একটি নতুন অ্যাডাপ্টারের ইন্টারফেসটি সংজ্ঞায়িত করে কাজ করে, যা ক্লাসগুলি তাদের এপিআই বাস্তবায়নের একত্রিত করার চেষ্টা করছে।
এটি কোন কংক্রিটের ভাষা নয়। এটি একটি জেনেরিক পন্থা, যে কোনও কীওয়ার্ডের প্রতিনিধিত্ব করার জন্য এটি যে কোনও ধরণের হতে পারে, সি # এর মতো ভাষায় আপনি এটিকে জেনেরিক ( <T>
) দিয়ে প্রতিস্থাপন করতে পারেন ।
আমি ধরে নিতে চলেছি, এই মুহুর্তে আপনার কাছে দুটি ক্লাসেশন সংক্ষেপণ এবং এনক্রিপশনের জন্য দায়ী থাকতে পারে।
class Compression
{
Compress(data : any) : any { ... }
}
class Encryption
{
Encrypt(data : any) : any { ... }
}
একটি এন্টারপ্রাইজ বিশ্বে, এমনকি এই নির্দিষ্ট ক্লাসগুলি ইন্টারফেস দ্বারা প্রতিস্থাপনের খুব সম্ভবত সম্ভাব্য, যেমন class
কীওয়ার্ডটি প্রতিস্থাপন করা হবে interface
(আপনি যদি সি #, জাভা এবং / বা পিএইচপি এর মতো ভাষার সাথে লেনদেন করেন) বা class
কীওয়ার্ডটি থাকত তবে Compress
এবং Encrypt
পদ্ধতিগুলি খাঁটি ভার্চুয়াল হিসাবে সংজ্ঞায়িত করা হবে , আপনি সি ++ এ কোড করা উচিত।
একটি অ্যাডাপ্টার তৈরি করতে, আমরা একটি সাধারণ ইন্টারফেস সংজ্ঞায়িত করি।
interface DataProcessing
{
Process(data : any) : any;
}
তারপরে ইন্টারফেসটিকে কার্যকর করতে আমাদের বাস্তবায়ন করতে হবে।
// when neither encryption nor compression is enabled
class DoNothingAdapter : DataProcessing
{
public Process(data : any) : any
{
return data;
}
}
// when only compression is enabled
class CompressionAdapter : DataProcessing
{
private compression : Compression;
public Process(data : any) : any
{
return this.compression.Compress(data);
}
}
// when only encryption is enabled
class EncryptionAdapter : DataProcessing
{
private encryption : Encryption;
public Process(data : any) : any
{
return this.encryption.Encrypt(data);
}
}
// when both, compression and encryption are enabled
class CompressionEncryptionAdapter : DataProcessing
{
private compression : Compression;
private encryption : Encryption;
public Process(data : any) : any
{
return this.encryption.Encrypt(
this.compression.Compress(data)
);
}
}
এটি করে আপনি 4 টি ক্লাস দিয়ে শেষ করেছেন, প্রত্যেকে একেবারে আলাদা কিছু করছে তবে তাদের প্রত্যেকেরই একই পাবলিক এপিআই সরবরাহ করছে। Process
পদ্ধতি।
আপনার ব্যবসায়িক যুক্তিতে, যেখানে আপনি কোনওটি / এনক্রিপশন / সংক্ষেপণ / উভয় সিদ্ধান্তই মোকাবেলা করেন না, আপনি আমাদের অবজেক্টটি ডিজাইন করবেন যাতে এটি DataProcessing
আমাদের আগে ডিজাইন করা ইন্টারফেসের উপর নির্ভর করে ।
class DataService
{
private dataProcessing : DataProcessing;
public DataService(dataProcessing : DataProcessing)
{
this.dataProcessing = dataProcessing;
}
}
প্রক্রিয়া নিজেই তখন এর মতো সহজ হতে পারে:
public ComplicatedProcess(data : any) : any
{
data = this.dataProcessing.Process(data);
// ... perhaps work with the data
return data;
}
আর শর্তসাপেক্ষ নেই। শ্রেণীর DataService
কোনও ধারণা নেই যখন ডেটাটি dataProcessing
মেম্বারের কাছে পাস করা হয় তখন ডেটা দিয়ে কী করা হবে , এবং এটি সত্যই এটি সম্পর্কে চিন্তা করে না, এটি তার দায়িত্ব নয়।
আদর্শভাবে, আপনি তৈরি করেছেন এমন 4 টি অ্যাডাপ্টারের ক্লাসগুলির পরীক্ষা করার ইউনিট পরীক্ষা করতে হবে যা তারা কাজ করে তা নিশ্চিত করার জন্য, আপনি নিজের পরীক্ষার পাস করেন। এবং যদি তারা পাস করে তবে আপনি নিশ্চিত হয়ে উঠতে পারেন যে আপনি তাদের কোডে যেখানে ফোন করেছেন তা বিবেচনা না করেই তারা কাজ করবে।
সুতরাং এইভাবে এটি করা if
আমার কোডে আর কখনও হবে না ?
না। আপনার ব্যবসায়ের যুক্তিতে শর্তসাপেক্ষ হওয়ার সম্ভাবনা কম তবে এগুলি এখনও কোথাও থাকতে হবে। জায়গাটি আপনার কারখানা।
এবং এটি ভাল। আপনি সৃষ্টির উদ্বেগগুলি পৃথক করে এবং কোডটি ব্যবহার করছেন। যদি আপনি আপনার কারখানাগুলি নির্ভরযোগ্য করে তুলেন (জাভাতে আপনি গুগলের গুয়াস ফ্রেমওয়ার্কের মতো কিছু ব্যবহার করতে পারেন ) তবে আপনার ব্যবসায়িক যুক্তিতে আপনি সঠিক শ্রেণিকে ইনজেকশন দেওয়ার জন্য পছন্দ করবেন না। কারণ আপনি জানেন যে আপনার কারখানাগুলি কাজ করে এবং যা চাওয়া হয় তা সরবরাহ করবে।
এই সমস্ত ক্লাস, ইন্টারফেস ইত্যাদির প্রয়োজন কি?
এটি আমাদের ভিক্ষার দিকে ফিরিয়ে আনে।
ওওপি-তে, আপনি যদি পলিমারফিজম ব্যবহারের পথটি বেছে নেন, সত্যিই ডিজাইনের নিদর্শনগুলি ব্যবহার করতে চান, ভাষার বৈশিষ্ট্যগুলি ব্যবহার করতে চান এবং / অথবা সমস্ত কিছু অনুসরণ করতে চান এটি একটি অবজেক্ট আদর্শ, তবে তা। এবং তারপর এমনকি এই উদাহরণে এমনকি সব কারখানা আপনি প্রয়োজন করতে যাচ্ছি প্রদর্শন করা হয় না এবং refactor যদি তুমি ছিলে Compression
এবং Encryption
ক্লাস এবং আপনি তাদের বাস্তবায়নের পাশাপাশি অন্তর্ভুক্ত করা আছে তাদের পরিবর্তে সংযোগ স্থাপিত করা।
শেষ পর্যন্ত আপনি শতভাগ ছোট্ট ক্লাস এবং ইন্টারফেস নিয়ে এসেছেন, খুব নির্দিষ্ট বিষয়গুলিতে নিবদ্ধ। যা অগত্যা খারাপ নয়, তবে আপনার পক্ষে সর্বোত্তম সমাধান নাও হতে পারে যদি আপনি যা চান তা দুটি সংখ্যা যুক্ত করার মতো সহজ কিছু করতে হবে।
আপনি এটি সম্পন্ন এবং দ্রুত পেতে চান, তাহলে আপনি দখল করতে পারেন Ixrec এর সমাধান , যারা অন্তত নিষ্কাশন পরিচালিত else if
এবং else
ব্লক, যা, আমার মতে, এমনকি একটি বাচ্চা একটি প্লেইন চেয়ে খারাপ if
।
বিবেচনার জন্য এটি আমার ওও নকশা তৈরির ভাল উপায়। বাস্তবায়নগুলির পরিবর্তে ইন্টারফেসগুলিতে কোডিং, আমি গত কয়েক বছর ধরে এটি করে এসেছি এবং এটিই আমি সবচেয়ে আরামদায়ক পদ্ধতির approach
আমি ব্যক্তিগতভাবে ই-কম প্রোগ্রামিং বেশি পছন্দ করি এবং কোডের 5 লাইন ধরে দীর্ঘ সমাধানের আরও অনেক বেশি প্রশংসা করব। কোডটি ডিজাইনিং করার জন্য আমি যেভাবে অভ্যস্ত এবং এটি পড়তে খুব স্বাচ্ছন্দ্যবোধ করি।
আপডেট 2: আমার সমাধানের প্রথম সংস্করণ সম্পর্কে বন্য আলোচনা হয়েছে। বেশিরভাগ ক্ষেত্রেই আমার দ্বারা আলোচিত আলোচনা, যার জন্য আমি ক্ষমাপ্রার্থী।
আমি উত্তরটি এমনভাবে সম্পাদনা করার সিদ্ধান্ত নিয়েছি যে সমাধানটি দেখার এক উপায় তবে এটি একমাত্র নয়। আমি সাজসজ্জার অংশটিও সরিয়েছি, যেখানে আমি তার পরিবর্তে মুখোমুখি বোঝাচ্ছি, যা শেষ পর্যন্ত আমি পুরোপুরি ছেড়ে চলে যাওয়ার সিদ্ধান্ত নিয়েছিলাম, কারণ অ্যাডাপ্টারের একটি মুখের ভিন্নতা vari
if
বিবৃতি দেওয়ার সম্ভাবনা আছে ?