দেরিতে উত্তর কিন্তু আমি প্রতিহত করতে পারি না।
এক্স বেশিরভাগ ক্লাস ওয়াইতে ভাল বা একটি অ্যান্টি-প্যাটার্নে রয়েছে?
বেশিরভাগ ক্ষেত্রে, বেশিরভাগ বিধিগুলি, চিন্তা না করে প্রয়োগ করা হয়, বেশিরভাগ ক্ষেত্রে মারাত্মক ভুল হয়ে যায় (এটি সহ) one
আমি আপনাকে কিছু ডান, তাত্ক্ষণিক ও নোংরা, পদ্ধতিগত কোডের বিশৃঙ্খলার মাঝে একটি অবজেক্টের জন্মের একটি গল্প বলতে দেব যা ডিজাইনের মাধ্যমে নয়, হতাশার বাইরে।
একটি ওয়েবপৃষ্ঠা স্ক্র্যাপ করার জন্য কিছু থ্রো অ্যাড কোড দ্রুত তৈরি করতে আমার এবং আমার ইন্টার্ন জোড় প্রোগ্রামিং। এই কোডটি দীর্ঘকাল বেঁচে থাকবে এমন প্রত্যাশা করার কোনও কারণ আমাদের নেই, সুতরাং আমরা কেবল এমন কিছু কাজ করি যা কার্যকর হয়। আমরা পুরো পৃষ্ঠাটিকে স্ট্রিং হিসাবে ধরলাম এবং আপনার কল্পনা করতে পারে এমন সবচেয়ে আশ্চর্যজনকভাবে ভঙ্গুর উপায়ে আমাদের প্রয়োজনীয় জিনিসগুলি কেটে ফেলুন। বিচার করবেন না। এটা কাজ করে।
এখন এটি করার সময় আমি কাটা কাটা করার কিছু স্থিতিশীল পদ্ধতি তৈরি করেছি। আমার ইন্টার্নটি একটি ডিটিও ক্লাস তৈরি করেছে যা আপনার মত অনেকটা ছিল CatData
।
আমি যখন ডিটিওর দিকে প্রথম তাকালাম তখন তা আমাকে বুগিয়ে উঠল। জাভা আমার মস্তিস্কের ক্ষয়ক্ষতিগুলির বছরগুলি আমাকে সরকারী ক্ষেত্রগুলিতে ফিরে আসতে বাধ্য করেছে। তবে আমরা সি # তে কাজ করছিলাম। সি # এর অকাল গেটস এবং সেটটারগুলির কোনও প্রয়োজন নেই যা আপনার ডেটাকে অপরিবর্তনীয় করে তোলার জন্য বা পরে এনক্যাপসুলেটেড করার অধিকার সংরক্ষণ করে। ইন্টারফেস পরিবর্তন না করে আপনি যখনই চান এগুলি যুক্ত করতে পারেন। সম্ভবত ঠিক তাই আপনি একটি ব্রেকপয়েন্ট সেট করতে পারেন। আপনার ক্লায়েন্টদের সম্পর্কে এটি সম্পর্কে কিছু না বলে সব। হ্যা সি #। বু জাভা
তাই আমি আমার জিভ ধরলাম। তিনি দেখেছেন যে তিনি আমার স্থির পদ্ধতিগুলি ব্যবহার করার আগে এই জিনিসটি আরম্ভ করার জন্য ব্যবহার করেছিলেন। আমরা তাদের মধ্যে প্রায় 14 ছিল। এটি ছিল কুরুচিপূর্ণ, তবে আমাদের যত্ন নেওয়ার কোনও কারণ ছিল না।
তারপরে আমাদের অন্য জায়গায় এটি দরকার ছিল। আমরা কোডটি অনুলিপি করে আটকে দিতে চেয়েছি। প্রারম্ভিকতার 14 লাইন চারপাশে প্রবাহিত হচ্ছে। এটি বেদনাদায়ক হতে শুরু করেছিল। তিনি ইতস্তত করে আমাকে আইডিয়া চেয়েছিলেন।
অনিচ্ছায় আমি জিজ্ঞাসা করলাম, "আপনি কি কোনও বিষয় বিবেচনা করবেন?"
সে তার ডিটিওর দিকে ফিরে তাকাল এবং বিভ্রান্তিতে তার মুখটি চেপে ধরল। "এটি একটি বস্তু"।
"আমি বলতে চাই একটি আসল বস্তু"
"হাহ?"
"আমাকে আপনাকে কিছু দেখাতে দাও You আপনি এটি কার্যকর কিনা তা স্থির করুন"
আমি একটি নতুন নাম চয়ন করেছি এবং দ্রুত এমন কিছু দেখলাম যা দেখে মনে হচ্ছে:
public class Cat{
CatData(string catPage) {
this.catPage = catPage
}
private readonly string catPage;
public string name() { return chop("name prefix", "name suffix"); }
public string weight() { return chop("weight prefix", "weight suffix"); }
public string image() { return chop("image prefix", "image suffix"); }
private string chop(string prefix, string suffix) {
int start = catPage.indexOf(prefix) + prefix.Length;
int end = catPage.indexOf(suffix);
int length = end - start;
return catPage.Substring(start, length);
}
}
এটি স্থির পদ্ধতিগুলি ইতিমধ্যে করছে না এমন কিছুই করেনি। তবে এখন আমি 14 স্ট্যাটিক পদ্ধতিগুলিকে এমন একটি ক্লাসে চুষলাম যেখানে তারা কাজ করেছিল এমন ডেটা দিয়ে তারা একা থাকতে পারে।
আমি আমার ইন্টার্নটি এটি ব্যবহার করতে বাধ্য করিনি। আমি কেবল এটির প্রস্তাব দিয়েছিলাম এবং স্থির পদ্ধতিগুলির সাথে তাল মিলাতে চাইলে তাকে সিদ্ধান্ত নিতে দিন। আমি সম্ভবত ভেবেছিলাম যে সে ইতিমধ্যে কাজ করে যাচ্ছিল সেটির সাথে লেগে থাকবে। পরের দিন আমি দেখতে পেলাম যে তিনি এটি বেশ কয়েকটি জায়গায় ব্যবহার করছেন using এটি বাকী কোডটি decluttered যা এখনও কুশ্রী এবং পদ্ধতিগত ছিল তবে জটিলতার এই বিটটি এখন আমাদের কাছে কোনও বস্তুর পিছনে লুকিয়ে ছিল। এটা একটু ভাল ছিল।
এখন নিশ্চিত যে প্রতিবার আপনি এটি অ্যাক্সেস করছেন এটি মোটামুটি কাজ করছে। একটি ডিটিও একটি দুর্দান্ত দ্রুত ক্যাশেড মান। আমি এটি সম্পর্কে উদ্বিগ্ন কিন্তু বুঝতে পেরেছিলাম যে যদি আমাদের কোনও ইউজিং কোড স্পর্শ না করেই প্রয়োজন হয় তবে আমি ক্যাচিংটি যুক্ত করতে পারি। সুতরাং আমরা যত্ন না করা পর্যন্ত আমি বিরক্ত করব না।
আমি কি বলছি আপনার সবসময় ডিটিওর ওও অবজেক্টের সাথে লেগে থাকা উচিত? না। ডিটিওর জ্বলজ্বল যখন আপনাকে এমন একটি সীমানা অতিক্রম করতে হবে যা আপনাকে চলমান পদ্ধতি থেকে দূরে রাখে। ডিটিওর জায়গা আছে।
তবে তাই OO অবজেক্ট। উভয় সরঞ্জাম কীভাবে ব্যবহার করবেন তা শিখুন। প্রতিটি খরচ কি শিখুন। সমস্যা, পরিস্থিতি এবং ইন্টার্ন সিদ্ধান্ত নিতে দিতে শিখুন। দোগমা এখানে আপনার বন্ধু নয়।
যেহেতু আমার উত্তর ইতিমধ্যে হাস্যকরভাবে দীর্ঘ হয়েছে আমাকে আপনার কোডের পর্যালোচনা দিয়ে কিছু ভুল ধারণা থেকে আপনাকে নিষ্ক্রিয় করতে দিন।
উদাহরণস্বরূপ, একটি শ্রেণীর সাধারণত ক্লাস সদস্য এবং পদ্ধতি থাকে, যেমন:
public class Cat{
private String name;
private int weight;
private Image image;
public void printInfo(){
System.out.println("Name:"+this.name+",weight:"+this.weight);
}
public void draw(){
//some draw code which uses this.image
}
}
তোমার নির্মাতা কোথায়? এটি দরকারী কিনা তা জানার জন্য এটি আমাকে যথেষ্ট দেখাচ্ছে না।
তবে একক দায়িত্বের নীতি এবং ওপেন বন্ধ নীতি সম্পর্কে পড়ার পরে, আমি কেবল স্থিতিশীল পদ্ধতি সহ ডিটিও এবং সহায়ক শ্রেণিতে পৃথক পৃথক পছন্দ করি, যেমন:
public class CatData{
public String name;
public int weight;
public Image image;
}
public class CatMethods{
public static void printInfo(Cat cat){
System.out.println("Name:"+cat.name+",weight:"+cat.weight);
}
public static void draw(Cat cat){
//some draw code which uses cat.image
}
}
আমি মনে করি এটি একক দায়িত্বের নীতির সাথে খাপ খায় কারণ এখন কেবল ডেটা রাখা ক্যাটডাটার দায়িত্ব, পদ্ধতিগুলি (ক্যাটমেথডসের জন্যও) যত্ন করে না।
আপনি একক দায়িত্বের নীতিমালার নামে অনেক নির্বোধ কাজ করতে পারেন। আমি যুক্তি দিতে পারি যে ক্যাট স্ট্রিংস এবং ক্যাট ইনটগুলি পৃথক করা উচিত। এই অঙ্কন পদ্ধতি এবং চিত্রগুলির অবশ্যই তাদের নিজস্ব বর্গ থাকতে হবে। আপনার চলমান প্রোগ্রামটি একক দায়িত্ব তাই আপনার কেবলমাত্র একটি বর্গ থাকা উচিত। : P: P
আমার কাছে, একক দায়িত্বের নীতি অনুসরণ করার সর্বোত্তম উপায় হ'ল একটি ভাল বিমূর্ততা খুঁজে পাওয়া যা আপনাকে একটি বাক্সে জটিলতা দেয় যাতে আপনি এটি আড়াল করতে পারেন। আপনি যদি এটির একটি ভাল নাম দিতে পারেন যা লোকেরা ভিতরে lookুকে দেখে তারা যা আবিষ্কার করে তাতে অবাক হতে না পারে আপনি এটিকে মোটামুটি অনুসরণ করেছেন followed এটি আরও সিদ্ধান্তের নির্দেশ দেওয়ার প্রত্যাশা করা হলে এটি সমস্যার জন্য বলছে। সত্যই, আপনার কোডের তালিকা উভয়ই তাই করে তবে এসআরপি কেন এখানে গুরুত্বপূর্ণ তা আমি দেখতে পাচ্ছি না।
এবং এটি ওপেন বদ্ধ নীতিটিও ফিট করে কারণ নতুন পদ্ধতি যুক্ত করার জন্য ক্যাটডাটা ক্লাস পরিবর্তন করার প্রয়োজন হয় না।
ভাল না। উন্মুক্ত নীতিটি নতুন পদ্ধতি যুক্ত করার বিষয়ে নয় isn't এটি পুরানো পদ্ধতিগুলির বাস্তবায়ন পরিবর্তন করতে সক্ষম এবং কোনও কিছুই সম্পাদনা করার বিষয়ে নয়। এমন কিছু যা আপনাকে ব্যবহার করে না এবং আপনার পুরানো পদ্ধতিগুলি নয়। পরিবর্তে আপনি অন্য কোথাও কিছু নতুন কোড লিখুন। পলিমারফিজমের কিছু রূপ এটি দুর্দান্তভাবে করবে। এখানে দেখুন না।
আমার প্রশ্ন হ'ল এটি কি ভাল বা অ্যান্টি-প্যাটার্ন?
আচ্ছা জাহান্নাম আমি কিভাবে জানব? দেখুন, এটি কোনওভাবেই করার সুবিধা এবং ব্যয় রয়েছে। আপনি যখন কোড থেকে কোড আলাদা করেন আপনি অন্যটিকে পুনরায় সংকলন না করেই পরিবর্তন করতে পারেন। সম্ভবত এটি আপনার কাছে সমালোচনামূলকভাবে গুরুত্বপূর্ণ। হতে পারে এটি কেবল আপনার কোডকে অর্থহীন জটিল করে তুলেছে।
যদি এটি আপনাকে আরও ভাল অনুভব করে তবে আপনি মার্টিন ফোলারকে প্যারামিটার অবজেক্ট বলে এমন কিছু থেকে দূরে নয় । আপনাকে কেবল নিজের বস্তুর মধ্যে আদিম পদক্ষেপ নিতে হবে না।
আপনি যা করতে চাই তা হ'ল কোডিং স্টাইলে আপনার বিচ্ছেদ কীভাবে করা যায় সে সম্পর্কে একটি ধারণা তৈরি করা। কারণ এটি বিশ্বাস করুন বা করবেন না আপনাকে কোনও স্টাইল বেছে নিতে বাধ্য করা হচ্ছে না। আপনাকে কেবল নিজের পছন্দ অনুযায়ী বাঁচতে হবে।