বেশিরভাগ শ্রেণীর ডেটা ক্ষেত্রের মধ্যে কেবল শ্রেণি এবং পদ্ধতি কেবল ক্লাসে পৃথক করা (যদি সম্ভব হয়) একটি ভাল বা একটি অ্যান্টি-প্যাটার্ন?


10

উদাহরণস্বরূপ, একটি শ্রেণীর সাধারণত ক্লাস সদস্য এবং পদ্ধতি থাকে, যেমন:

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
    }
}

আমি মনে করি এটি একক দায়িত্বের নীতির সাথে খাপ খায় কারণ এখন কেবল ডেটা রাখা ক্যাটডাটার দায়িত্ব, পদ্ধতিগুলি (ক্যাটমেথডসের জন্যও) যত্ন করে না। এবং এটি ওপেন বদ্ধ নীতিটিও ফিট করে কারণ নতুন পদ্ধতি যুক্ত করার জন্য ক্যাটডাটা ক্লাস পরিবর্তন করার প্রয়োজন হয় না।

আমার প্রশ্ন হ'ল এটি কি ভাল বা অ্যান্টি-প্যাটার্ন?


15
যে কোনও জায়গায় অন্ধভাবে কিছু করা কারণ আপনি একটি নতুন ধারণাটি শিখলেন সর্বদা একটি বিরোধী ধরণ।
কায়মন

4
শ্রেণিগুলির বিন্দুটি কী হবে যদি সেগুলি পরিবর্তিত পদ্ধতিগুলির চেয়ে ডেটা আলাদা রাখা ভাল? এটি অ-অবজেক্ট-ভিত্তিক প্রোগ্রামিংয়ের মতো শোনাচ্ছে (যার অবশ্যই এটির জায়গা আছে)। যেহেতু এটি "অবজেক্ট ভিত্তিক" ট্যাগ করা হয়েছে আমি ধরে নিয়েছি যে আপনি ওওপি সরবরাহকারী সরঞ্জামগুলি ব্যবহার করতে চান?
ব্যবহারকারী 1118321

4
আরেকটি প্রশ্ন প্রমাণ করে যে এসআরপি এত খারাপভাবে ভুল বুঝে গেছে যে এটি নিষিদ্ধ করা উচিত। একগুচ্ছ সার্বজনীন ক্ষেত্রে ডেটা রাখা কোনও দায়বদ্ধতা নয়
user949300

1
@ user949300, যদি এই ক্ষেত্রগুলির জন্য শ্রেণি দায়বদ্ধ হয় তবে তাদের অ্যাপে অন্য কোথাও স্থানান্তর করা অবশ্যই শূন্যের সাথে প্রভাব ফেলবে। বা অন্য কোনও উপায়ে বলতে গেলে, আপনি ভুল করছেন: এগুলি 100% দায়বদ্ধ।
ডেভিড আরনো

2
@ ডেভিড আর্নো এবং আর শ্মিটজ: ক্ষেত্রগুলি অন্তর্ভুক্ত করে এসআরপি-র উদ্দেশ্যে কোনও দায়বদ্ধতা হিসাবে গণ্য হয় না। যদি এটি হয়, তবে কোনও ওওপি থাকতে পারে না, কারণ সবকিছুই ডিটিও হবে এবং তারপরে পৃথক শ্রেণিতে ডেটাতে কাজ করার পদ্ধতি থাকবে। একটি একক দায়িত্ব একক অংশীদারের সাথে সম্পর্কিত । (যদিও এটি অধ্যক্ষের প্রতিটি পুনরাবৃত্তির তুলনায় কিছুটা পরিবর্তিত হয়েছে বলে মনে হয়)
user949300

উত্তর:


10

আপনি দুটি চূড়ান্ত চিত্র দেখিয়েছেন ("সমস্ত কিছু ব্যক্তিগত এবং সমস্ত (সম্ভবত সম্পর্কিত নয়) একটি পদ্ধতিতে" বনাম "সমস্ত কিছু প্রকাশ্য এবং বস্তুর ভিতরে কোনও পদ্ধতি নেই")। আইএমএইচও ভাল ওও মডেলিং এগুলির কোনওটিই নয় , মিষ্টি স্পটটি মাঝখানে কোথাও।

কোন পদ্ধতি বা যুক্তি কোন শ্রেণীর অন্তর্গত এবং এর বাইরে কী রয়েছে তার একটি লিটমাস পরীক্ষা পদ্ধতিগুলি যে প্রবর্তন করবে তার উপর নির্ভরশীলতাগুলি দেখুন। অতিরিক্ত নির্ভরতাগুলির পরিচয় দেয় না এমন পদ্ধতিগুলি যতক্ষণ না প্রদত্ত বস্তুর বিমূর্ততায় ভাল ফিট হয় । অতিরিক্ত, বাহ্যিক নির্ভরতা (যেমন একটি অঙ্কন গ্রন্থাগার বা I / O গ্রন্থাগার) প্রয়োজন এমন পদ্ধতিগুলি খুব কমই উপযুক্ত। এমনকি যদি আপনি নির্ভরতা ইনজেকশন ব্যবহার করে নির্ভরতাগুলি বিলুপ্ত করে দেন তবে আমি ডোমেন ক্লাসের মধ্যে এই জাতীয় পদ্ধতি স্থাপন করা যদি সত্যিই প্রয়োজনীয় হয় তবে আমি দু'বার ভাবি।

সুতরাং আপনার প্রত্যেক সদস্যকেই জনসাধারণ হিসাবে প্রকাশ করা উচিত নয়, বা শ্রেণীর অভ্যন্তরে কোনও সামগ্রীতে প্রতিটি ক্রিয়াকলাপের জন্য আপনার পদ্ধতি প্রয়োগ করার দরকার নেই। এখানে বিকল্প পরামর্শ দেওয়া হল:

public class Cat{
    private String name;
    private int weight;
    private Image image;

    public String getInfo(){
        return "Name:"+this.name+",weight:"+this.weight;
    }
    public Image getImage(){
        return image;
    }
}

এখন Catঅবজেক্টটি আশেপাশের কোডগুলিকে সহজেই প্রয়োগ করতে দেওয়া printInfoএবং drawসমস্ত বৈশিষ্ট্য জনসমক্ষে প্রকাশ না করে পর্যাপ্ত যুক্তি সরবরাহ করে । এই দুটি পদ্ধতির সঠিক স্থানটি সম্ভবত কোনও classশ্বর শ্রেণি নয় CatMethods(যেহেতু printInfoএবং drawসম্ভবত বিভিন্ন উদ্বেগ, তাই আমি মনে করি এটি একই শ্রেণীর অন্তর্ভুক্ত হওয়ার খুব কম সম্ভাবনা রয়েছে)।

আমি কল্পনা করতে পারি CatDrawingControllerযা কার্যকর করে draw(এবং সম্ভবত একটি ক্যানভাস অবজেক্ট পাওয়ার জন্য নির্ভরতা ইনজেকশন ব্যবহার করে)। আমি অন্য শ্রেণীর কল্পনাও করতে পারি যা কিছু কনসোল আউটপুট প্রয়োগ করে এবং ব্যবহার করে getInfo(তাই printInfoএই প্রসঙ্গে অচল হয়ে যেতে পারে)। তবে এ সম্পর্কে বুদ্ধিমান সিদ্ধান্ত নেওয়ার জন্য, প্রসঙ্গটি এবং Catশ্রেণিটি আসলে কীভাবে ব্যবহৃত হবে তা জানতে হবে।

ফওলারের অ্যানিমিক ডোমেন মডেল সমালোচকদের আমি যেভাবে ব্যাখ্যা করেছি সেভাবেই এটি হয় - সাধারণত পুনরায় ব্যবহারযোগ্য যুক্তির জন্য (বাহ্যিক নির্ভরতা ছাড়াই) ডোমেন ক্লাসগুলি নিজেরাই একটি ভাল জায়গা, তাই তাদের জন্য এটি ব্যবহার করা উচিত। তবে এর অর্থ এখানে কোনও যুক্তি বাস্তবায়ন করা নয়, একেবারে বিপরীত।

উপরের উদাহরণটিও লক্ষ করুন যে (ইম) পরিবর্তনের বিষয়ে সিদ্ধান্ত নেওয়ার জন্য স্থির পাতার পাতা রয়েছে। যদি Catশ্রেণি কোনও সেটটার প্রকাশ না করে এবং Imageনিজেই পরিবর্তনযোগ্য হয় তবে এই নকশাটি Catঅপরিবর্তনীয় করতে দেবে (যা ডিটিও পদ্ধতির দ্বারা গ্রহণযোগ্য নয়)। তবে আপনি যদি মনে করেন যে অপরিবর্তনীয়তা আপনার ক্ষেত্রে প্রয়োজন হয় না বা সহায়ক না হয় তবে আপনিও সেই দিকে যেতে পারেন।


ট্রিগার সুখী ডাউনভোটারদের, এটি বিরক্তিকর হয়ে ওঠে। আপনার যদি কিছু সমালোচক থাকে তবে দয়া করে আমাকে জানান। আপনার যদি কিছু থাকে তবে আমি কোনও ভুল বোঝাবুঝি পরিষ্কার করতে পেরে খুশি হব।
ডক ব্রাউন

আমি সাধারণত আপনার উত্তরের সাথে একমত হওয়ার পরে ... আমি মনে করি getInfo()কারও পক্ষে এই প্রশ্ন জিজ্ঞাসা করার জন্য বিভ্রান্তিকর হতে পারে। এটি ক্লাসের printInfo()উদ্দেশ্যকে পরাভূত করে উপস্থাপনার দায়িত্বগুলি সংক্ষিপ্তভাবে মিশ্রিত করেDrawingController
অ্যাড্রিয়ানো রেপিটি

@ অ্যাড্রিয়ানো রেপিটি আমি দেখতে পাচ্ছি না যে এটি উদ্দেশ্যকে হারাচ্ছে DrawingController। আমি এটি একমত getInfo()এবং printInfo()ভয়ঙ্কর নাম। বিবেচনা করুন toString()এবংprintTo(Stream stream)
candied_orange

@ সিন্ডিড এটি নাম সম্পর্কে (কেবল) নয় তবে এটি কী করে তা সম্পর্কে। এই কোডটি কেবলমাত্র একটি উপস্থাপনার বিশদ সম্পর্কে এবং আমরা কার্যকরভাবে প্রক্রিয়াজাত সামগ্রী এবং এর যুক্তিগুলি ছাড়াই আউটপুটটিকে বিমূর্ত করে ফেলেছি।
অ্যাড্রিয়ানো রেপিটি

@ অ্যাড্রিয়ানো রেপিটি: সত্যিকার অর্থে, মূল প্রশ্নের সাথে খাপ খাইয়ে দেখা এবং আমার বক্তব্য প্রদর্শন করার জন্য এটি কেবল একটি স্বীকৃত উদাহরণ। একটি বাস্তব ব্যবস্থায় আশেপাশের প্রসঙ্গ থাকবে যা অবশ্যই আরও ভাল পদ্ধতি এবং নামগুলি সম্পর্কে সিদ্ধান্ত নিতে অনুমতি দেবে।
ডক ব্রাউন

6

দেরিতে উত্তর কিন্তু আমি প্রতিহত করতে পারি না।

এক্স বেশিরভাগ ক্লাস ওয়াইতে ভাল বা একটি অ্যান্টি-প্যাটার্নে রয়েছে?

বেশিরভাগ ক্ষেত্রে, বেশিরভাগ বিধিগুলি, চিন্তা না করে প্রয়োগ করা হয়, বেশিরভাগ ক্ষেত্রে মারাত্মক ভুল হয়ে যায় (এটি সহ) 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 এটি পুরানো পদ্ধতিগুলির বাস্তবায়ন পরিবর্তন করতে সক্ষম এবং কোনও কিছুই সম্পাদনা করার বিষয়ে নয়। এমন কিছু যা আপনাকে ব্যবহার করে না এবং আপনার পুরানো পদ্ধতিগুলি নয়। পরিবর্তে আপনি অন্য কোথাও কিছু নতুন কোড লিখুন। পলিমারফিজমের কিছু রূপ এটি দুর্দান্তভাবে করবে। এখানে দেখুন না।

আমার প্রশ্ন হ'ল এটি কি ভাল বা অ্যান্টি-প্যাটার্ন?

আচ্ছা জাহান্নাম আমি কিভাবে জানব? দেখুন, এটি কোনওভাবেই করার সুবিধা এবং ব্যয় রয়েছে। আপনি যখন কোড থেকে কোড আলাদা করেন আপনি অন্যটিকে পুনরায় সংকলন না করেই পরিবর্তন করতে পারেন। সম্ভবত এটি আপনার কাছে সমালোচনামূলকভাবে গুরুত্বপূর্ণ। হতে পারে এটি কেবল আপনার কোডকে অর্থহীন জটিল করে তুলেছে।

যদি এটি আপনাকে আরও ভাল অনুভব করে তবে আপনি মার্টিন ফোলারকে প্যারামিটার অবজেক্ট বলে এমন কিছু থেকে দূরে নয় । আপনাকে কেবল নিজের বস্তুর মধ্যে আদিম পদক্ষেপ নিতে হবে না।

আপনি যা করতে চাই তা হ'ল কোডিং স্টাইলে আপনার বিচ্ছেদ কীভাবে করা যায় সে সম্পর্কে একটি ধারণা তৈরি করা। কারণ এটি বিশ্বাস করুন বা করবেন না আপনাকে কোনও স্টাইল বেছে নিতে বাধ্য করা হচ্ছে না। আপনাকে কেবল নিজের পছন্দ অনুযায়ী বাঁচতে হবে।


2

আপনি এক দশকেরও বেশি সময় ধরে বিকাশকারীদের মধ্যে তর্ক তৈরি করে চলেছেন এমন বিতর্কের একটি বিষয়কে কেন্দ্র করে আপনি হোঁচট খেয়ে গেছেন। ২০০৩ সালে, মার্টিন ফোলার "অ্যানমিক ডোমেন মডেল" (এডিএম) এই বাক্যটি ডেটা এবং কার্যকারিতা পৃথকীকরণের জন্য বর্ণনা করেছিলেন। তিনি এবং তার সাথে সম্মত অন্যরা - যুক্তিযুক্ত যে "রিচ ডোমেন মডেলগুলি" (ডেটা এবং কার্যকারিতা মিশ্রিত করা) "যথাযথ ওও", ​​এবং এডিএম পদ্ধতির একটি অ-ওও বিরোধী-নিদর্শন।

এই যুক্তিটিকে বর্জনকারীরা সবসময়ই ছিলেন এবং যুক্তিটির সেই দিকটি সাম্প্রতিক বছরগুলিতে ক্রিয়ামূলক বিকাশের কৌশলগুলির আরও বিকাশকারীদের দ্বারা গ্রহণের সাথে আরও জোরে এবং সাহসী হয়ে উঠেছে। এই পদ্ধতিটি ডেটা এবং ফাংশন উদ্বেগগুলির পৃথকীকরণকে সক্রিয়ভাবে উত্সাহ দেয়। ডেটা যতটা সম্ভব অপরিবর্তনীয় হওয়া উচিত, সুতরাং পরিবর্তনীয় স্থিতির এনক্যাপসুলেশন অ-উদ্বেগ হয়ে যায়। এই ধরনের পরিস্থিতিতে সরাসরি ডেটাতে ফাংশন সংযুক্ত করার কোনও সুবিধা নেই। তবে "ওও নয়" বা না তা এই জাতীয় লোকের পক্ষে একেবারেই আগ্রহী নয়।

আপনি যে বেড়ার উপরে বসেছেন তা নির্বিশেষে (আমি "মার্টিন ফাউলার পুরানো টোশের বোঝা" পাশের বিটিডব্লিউয়ের উপর খুব দৃly়তার সাথে বসে), আপনার স্ট্যাটিক পদ্ধতির ব্যবহার printInfoএবং drawএর নিকট-সর্বজনীনভাবে ভ্রূণু রয়েছে । ইউনিট টেস্টগুলি লেখার সময় স্থির পদ্ধতিগুলি উপহাস করা শক্ত hard সুতরাং যদি তাদের পার্শ্ব প্রতিক্রিয়া থাকে (যেমন কোনও স্ক্রিন বা অন্য কোনও ডিভাইসে মুদ্রণ বা অঙ্কন), সেগুলি স্থির হওয়া উচিত নয়, বা পরামিতি হিসাবে আউটপুট অবস্থানটি পাস করা উচিত।

সুতরাং আপনার একটি ইন্টারফেস থাকতে পারে:

public interface CatMethods {
    void printInfo(Cat cat);
    void draw(Cat cat);
}

এবং এমন একটি বাস্তবায়ন যা রানটাইমের সময় আপনার সিস্টেমে বাকী অংশে ইঞ্জেকশন হয়ে যায় (পরীক্ষার জন্য অন্যান্য প্রয়োগগুলি ব্যবহার করে):

internal class CatMethodsForScreen implements CatMethods {
    public void printInfo(Cat cat) {
        System.out.println("Name:"+cat.name+",weight:"+cat.weight);
    }

    public void draw(Cat cat) {
        //some draw code which uses cat.image
    }
}

বা এই পদ্ধতিগুলি থেকে পার্শ্ব প্রতিক্রিয়াগুলি সরাতে অতিরিক্ত পরামিতি যুক্ত করুন:

public static class CatMethods {
    public static void printInfo(Cat cat, OutputHandler output) {
        output.println("Name:"+cat.name+",weight:"+cat.weight);
    }

    public static void draw(Cat cat, Canvas canvas) {
        //some draw code which uses cat.image and draws it on canvas
    }
}

তবে আপনি কেন জাভা জাতীয় কোনও ওও ভাষার ভাষা শুরু থেকেই কার্যকরী ভাষার পরিবর্তে কার্যকরী ভাষায় রূপ দেওয়ার চেষ্টা করবেন? এটি কি একধরণের "আমি জাভা ঘৃণা করি, তবে প্রত্যেকে এটি ব্যবহার করে তাই আমাকে করতে হবে তবে কমপক্ষে আমি এটি নিজের উপায়ে লিখতে চলেছি"। যদি আপনি দাবি করেন না যে ওও দৃষ্টান্তটি কোনওভাবে অপ্রচলিত এবং পুরানো। আমি "যদি আপনি এক্স চান, তবে এটি কোথায় পাবেন" তা আপনি বিদ্যালয়ের চিন্তার সাবস্ক্রাইব করে রেখেছি।
কেয়ামান

কায়ামান, " আমি " সাবস্ক্রাইব করে "যদি আপনি এক্স চান তবে এটি কোথায় পাবেন" চিন্তার বিদ্যালয় "তা জানেন । আমি না। আমি এই দৃষ্টিভঙ্গিটিকে স্বল্পদৃষ্টি এবং সামান্য আক্রমণাত্মক উভয় হিসাবেই পাই। আমি জাভা ব্যবহার করি না, তবে আমি সি # ব্যবহার করি এবং কিছু "বাস্তব ওও" বৈশিষ্ট্য উপেক্ষা করি। আমি উত্তরাধিকার, রাষ্ট্রীয় বস্তু এবং এর মত যত্ন নিই না এবং আমি প্রচুর স্থিতিশীল পদ্ধতি এবং সিল (চূড়ান্ত) শ্রেণি লিখি। সি # এর আশেপাশে সরঞ্জামদান এবং সম্প্রদায়ের আকার কোনওটির পরে নেই। এফ # এর পক্ষে এটি দরিদ্র। তাই আমি "যদি আপনি এক্স চান তবে এটিটিকে আপনার বর্তমান টুলিংয়ের সাথে যুক্ত করার জন্য বলুন" চিন্তার স্কুল।
ডেভিড আরনো

1
আমি বলতে চাই যে কোনও ভাষার দিকগুলি উপেক্ষা করা অন্য ভাষার বৈশিষ্ট্যগুলিকে মিশ্রিত করার এবং মেলানোর চেষ্টা থেকে অনেক আলাদা। আমি "রিয়েল ওও" লেখার চেষ্টা করি না, যেমন প্রোগ্রামিংয়ের মতো কোনও নিখুঁত বিজ্ঞানে কেবল নিয়ম (বা নীতিগুলি) অনুসরণ করার চেষ্টা করা হয় না। অবশ্যই আপনাকে নিয়মগুলি জানতে হবে যাতে আপনি সেগুলি ভঙ্গ করতে পারেন। অন্ধভাবে বৈশিষ্ট্যগুলি পরীক্ষা করা ভাষার বিকাশের জন্য খারাপ হতে পারে। কোনও অপরাধ নয়, তবে এফপি দৃশ্যের একটি অংশ আইএমএইচও মনে হয় "টুকরো টুকরো রুটি হওয়ার পরে এফপি সবচেয়ে বড় জিনিস, লোকেরা কেন তা বুঝতে পারবে না"। আমি কখনই বলি না (বা ভাবেন) ওও বা জাভা "সেরা"।
কায়মন

1
@ কেয়ামান, তবে "অন্যান্য ভাষাগুলির বৈশিষ্ট্যগুলি মিশ্রিত করতে এবং মেশানোর চেষ্টা করছেন" এর অর্থ কী? আপনি কি যুক্তি দিচ্ছেন যে জাভাতে কার্যকরী বৈশিষ্ট্যগুলি যুক্ত করা উচিত নয়, কারণ "জাভা একটি ওও ভাষা"? যদি তা হয় তবে তা আমার মতে একটি স্বল্পদৃষ্টির যুক্তি। ভাষাটি বিকাশকারীদের ইচ্ছার সাথে বিকশিত হোক। পরিবর্তে তাদের অন্য কোনও ভাষাতে যেতে বাধ্য করা হল ভুল পদ্ধতি, আমার মনে হয়। নিশ্চিতভাবেই কিছু "এফপি অ্যাডভোকেটস" এফপি সেরা জিনিস হওয়ার বিষয়ে শীর্ষে যান। এবং কিছু "ওও অ্যাডভোকেটস" ওও "যুদ্ধে জিতেছে কারণ এটি স্পষ্টতই উচ্চতর" সম্পর্কে শীর্ষস্থানে চলেছে। তাদের উভয় উপেক্ষা।
ডেভিড আরনো

1
আমি এন্টি-এফপি হচ্ছি না। আমি এটি জাভাতে ব্যবহার করি যেখানে এটি দরকারী। তবে কোনও প্রোগ্রামার যদি "আমি এটি চাই" বলে তবে এটি ক্লায়েন্টের মতো বলে "আমি এটি চাই"। প্রোগ্রামাররা ভাষা ডিজাইনার নয় এবং ক্লায়েন্টরা প্রোগ্রামার নয়। আপনি যেহেতু বলছেন যে ওপির "সমাধান" এর উপর ভিত্তি করেই আমি আপনার উত্তরটিকে অগ্রাহ্য করেছি। প্রশ্নটির মন্তব্যটি আরও সাবলীল, অর্থাত্ তিনি একটি ওও ভাষায় পদ্ধতিগত প্রোগ্রামিং পুনরায় উদ্ভাবন করেছেন। সাধারণ ধারণাটির যদিও কোনও মতামত নেই, যেমনটি আপনি দেখিয়েছেন। অ-অ্যানিমিক ডোমেন মডেলটির অর্থ এই নয় যে ডেটা এবং আচরণ একচেটিয়া, এবং বাইরের রেন্ডারার বা উপস্থাপকরা নিষিদ্ধ হবেন।
কেয়ামান

0

ডিটিও - ডেটা ট্রান্সপোর্ট অবজেক্টস

ঠিক যে জন্য দরকারী। আপনি যদি ডিটিওর চেয়ে প্রোগ্রাম বা সিস্টেমের মধ্যে ডেটা সরিয়ে ফেলতে চলেছেন তবে সেগুলি পছন্দনীয় কারণ তারা কোনও সামগ্রীর পরিচালনাযোগ্য উপ-সেট সরবরাহ করে যা কেবলমাত্র ডেটা কাঠামো এবং ফর্ম্যাটিংয়ের সাথে সম্পর্কিত। সুবিধাটি হ'ল আপনাকে বেশ কয়েকটি সিস্টেমে জটিল পদ্ধতির আপডেটগুলি সিঙ্ক্রোনাইজ করতে হবে না (যতক্ষণ না অন্তর্নিহিত ডেটা পরিবর্তন হয় না)।

ওওর পুরো বিষয়টি হ'ল ডেটা এবং কোডটি সেই ডেটাতে একত্রে অভিনয় করে। একটি লজিকাল অবজেক্টকে পৃথক শ্রেণিতে বিভক্ত করা সাধারণত একটি খারাপ ধারণা।


-1

অনেকগুলি নকশার নিদর্শন এবং নীতিগুলি দ্বন্দ্ব করে এবং শেষ পর্যন্ত কেবলমাত্র একজন ভাল প্রোগ্রামার হিসাবে আপনার রায় আপনাকে কোনও নির্দিষ্ট সমস্যার জন্য কোন প্যাটার্ন প্রয়োগ করা উচিত তা সিদ্ধান্ত নিতে সহায়তা করে।

আমার মতে, সম্ভবত সবচেয়ে সহজ কাজটি করুন যা কার্যকরীভাবে কাজ করতে পারে নীতিটি ডিফল্টরূপে জিততে হবে যদি না আপনি নকশাকে আরও জটিল করার দৃ strong় কারণ না রাখেন। সুতরাং আপনার নির্দিষ্ট উদাহরণে, আমি প্রথম ডিজাইনটি বেছে নেব, যা একই শ্রেণিতে ডেটা এবং ফাংশনগুলির সাথে আরও বেশি traditionalতিহ্যগত অবজেক্ট-ভিত্তিক পদ্ধতির approach

অ্যাপ্লিকেশন সম্পর্কে নিজেকে জিজ্ঞাসা করতে পারেন এমন কয়েকটি প্রশ্ন এখানে রইল:

  • আমাকে কি কখনও বিড়ালের চিত্র সরবরাহের বিকল্প উপায় সরবরাহ করার প্রয়োজন হবে? যদি তা হয়, তাহলে উত্তরাধিকার কি এটি করার কোনও সুবিধাজনক উপায় হবে না?
  • আমার বিড়াল শ্রেণীর কি অন্য শ্রেণীর উত্তরাধিকারী হওয়া বা ইন্টারফেসটি সন্তুষ্ট করা দরকার?

এর যে কোনওটির হ্যাঁ উত্তর দেওয়া আপনাকে আলাদা ডিটিও এবং ক্রিয়ামূলক ক্লাস সহ আরও জটিল নকশায় নিয়ে যেতে পারে।


-1

এটা কি ভাল প্যাটার্ন?

আপনি সম্ভবত এখানে বিভিন্ন উত্তর পেতে চলেছেন কারণ লোকেরা বিভিন্ন চিন্তাভাবনা অনুসরণ করে। সুতরাং আমি এমনকি শুরু করার আগে: এই উত্তরটি অবজেক্ট-ভিত্তিক প্রোগ্রামিং অনুসারে যেমন এটি "ক্লিন কোড" বইয়ে রবার্ট সি মার্টিন বর্ণনা করেছেন।


"সত্য" ওওপি

আমি যতদূর সচেতন, ওওপির 2 টি ব্যাখ্যা আছে। বেশিরভাগ লোকের জন্য, এটি "অবজেক্ট একটি শ্রেণি" তে সিদ্ধ হয়।

যাইহোক, আমি অন্য চিন্তাভাবনাটিকে আরও সহায়ক বলে মনে করেছি: "একটি বস্তু এমন কিছু যা কিছু করে"। আপনি যদি ক্লাস নিয়ে কাজ করছেন, প্রতিটি ক্লাস দুটি জিনিসের মধ্যে একটি হতে পারে: একটি " ডেটা-হোল্ডার " বা একটি অবজেক্ট । ডেটা-ধারকরা ডেটা (দুহ) ধারণ করে, বস্তুগুলি স্টাফ করে। এর অর্থ এই নয় যে কোনও ডাটা-ধারকের কাছে পদ্ধতি থাকতে পারে না! একটি চিন্তা list: একটি listসত্যিই নেই না কিছু, কিন্তু এটা পদ্ধতি আছে, জোরদার করা উপায় এটা ডেটা ঝুলিতে

তথ্যধারীরা

আপনি Catকোনও ডেটা ধারকের একটি প্রধান উদাহরণ। অবশ্যই, আপনার প্রোগ্রামের বাইরে একটি বিড়াল এমন কিছু যা কিছু করে তবে আপনার প্রোগ্রামের অভ্যন্তরে Catএকটি স্ট্রিং name, ইনট weightএবং একটি চিত্র image

যে তথ্য হোল্ডার না কি এছাড়াও কিছু মানে না যে, তারা ব্যবসা লজিক থাকে না! আপনার যদি Catবর্গ একটি কন্সট্রাকটর প্রয়োজন হয়েছে name, weightএবং image, আপনি সফলভাবে ব্যবসা নিয়ম যে বিড়াল ঐ আছে encapsulated গেছেন। আপনি যদি weightকোনও Catক্লাস তৈরির পরে পরিবর্তন করতে পারেন তবে এটি অন্য ব্যবসায়িক বিধি বিধানিত। এগুলি খুব বেসিক জিনিস, তবে এর অর্থ হ'ল এগুলি ভুল না হওয়া খুব জরুরি - এবং এইভাবে আপনি নিশ্চিত হন যে ভুলটি পাওয়া অসম্ভব

অবজেক্টস

বিষয়গুলি কিছু করে do আপনি যদি ক্লিন * অবজেক্ট চান তবে আমরা এটিকে "অবজেক্টস একটি কাজ করি" তে পরিবর্তন করতে পারি ।

বিড়ালের তথ্য মুদ্রণ করা কোনও বস্তুর কাজ। উদাহরণস্বরূপ, আপনি CatInfoLoggerএকটি পাবলিক পদ্ধতিতে এই বস্তুকে " " কল করতে পারেন Log(Cat)। আমাদের বাইরে থেকে এটি জানা দরকার: এই বস্তুটি একটি বিড়ালের তথ্য লগ করে এবং এটি করার জন্য এটির একটি দরকার Cat

ভিতরে ভিতরে, এই বস্তুর বিড়ালগুলির লগ করার জন্য তার একক দায়িত্বটি পূরণ করার জন্য যা কিছু প্রয়োজন তা উল্লেখ থাকবে । এই ক্ষেত্রে, যে শুধুমাত্র একটি রেফারেন্স এর Systemজন্য System.out.printlnকিন্তু বেশিরভাগ ক্ষেত্রেই, এটি অন্যান্য বস্তু ব্যক্তিগত রেফারেন্স হতে হবে। যদি আউটপুট মুদ্রণের আগে এটি বিন্যাস করার পক্ষে যুক্তিটি খুব জটিল হয়ে যায় তবে CatInfoLoggerকেবল একটি নতুন অবজেক্টের রেফারেন্স পেতে পারেন CatInfoFormatter। যদি পরবর্তী সময়ে, প্রতিটি লগকে একটি ফাইলও লিখতে হয় তবে আপনি এটি করতে পারেন এমন একটি CatToFileLoggerবস্তু যুক্ত করতে পারেন ।

ডেটা ধারক বনাম বস্তু - সারাংশ summary

এখন, আপনি কেন এত কিছু করবেন? কারণ এখন ক্লাস পরিবর্তন করা মাত্র একটি জিনিস পরিবর্তন করে ( উদাহরণস্বরূপ, একটি বিড়ালটি লগ ইন করার পদ্ধতি)। আপনি যদি কোনও বিষয়বস্তু পরিবর্তন করেন তবে আপনি কেবল কোনও নির্দিষ্ট কাজটি করার পদ্ধতি পরিবর্তন করছেন; আপনি যদি কোনও ডেটা ধারক পরিবর্তন করেন তবে আপনি কেবল কোনও ডেটাটি রাখা হয়েছে এবং / অথবা কোনভাবে এটি রাখা হয়েছে তা পরিবর্তন করে।

ডেটা পরিবর্তনের অর্থ হতে পারে যে কোনও কাজটি করার পদ্ধতিটিও বদলাতে হবে, তবে যতক্ষণ না আপনি নিজেকে দায়বদ্ধ বস্তুটি পরিবর্তন করে এটিকে ঘটায় না ততক্ষণ পরিবর্তন হয় না।

Overkill?

এই সমাধানটি কিছুটা ওভারকিল মনে হতে পারে। আমাকে খোলামেলা হ'ল : এটা । যদি আপনার পুরো প্রোগ্রামটি উদাহরণের মতোই বড় হয় তবে উপরের কোনওটিই করবেন না - কেবল একটি কয়েন টস দিয়ে আপনার প্রস্তাবিত উপায় বেছে নিন। সেখানে কোন বিপদ বিভ্রান্তিকর অন্য কোড যদি হয় অন্য কোন কোড।

তবে, কোনও "গুরুতর" (= স্ক্রিপ্ট বা 2 এর চেয়ে বেশি) সফ্টওয়্যার সম্ভবত এত বড় যে এটি এর মতো কাঠামো থেকে লাভ করতে পারে।


উত্তর

বেশিরভাগ ক্লাসকে ডিটিও এবং সহায়ক শ্রেণিতে বিভক্ত করা কি [...] ভাল বা বিরোধী নিদর্শন?

"বেশিরভাগ শ্রেণি" (কোনও আরও যোগ্যতা ছাড়াই) ডিটিও / ডেটাধারীদের মধ্যে পরিণত করা কোনও বিরোধী নিদর্শন নয়, কারণ এটি আসলে কোনও নিদর্শন নয় - এটি কমবেশি এলোমেলো।

আপনার কোড পরিষ্কার রাখতে * তবে ডেটা এবং অবজেক্টগুলি আলাদা রাখার একটি ভাল উপায় হিসাবে দেখা হয়। কখনও কখনও আপনার কেবল একটি ফ্ল্যাট, "রক্তাল্প" ডিটিও প্রয়োজন হবে এবং এটিই। অন্যান্য সময়, আপনার যেভাবে ডেটা রাখা হয়েছে তা প্রয়োগ করার জন্য পদ্ধতিগুলির প্রয়োজন। আপনার প্রোগ্রামটির কার্যকারিতাটি ডেটা দিয়ে রাখবেন না।


* এটি বইয়ের শিরোনামের মতো মূলধন সি সহ "পরিষ্কার", কারণ - প্রথম অনুচ্ছেদটি মনে রাখবেন - এটি প্রায় এক বিদ্যালয়ের চিন্তাভাবনা, অন্যদিকে রয়েছে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.