কি প্রাধান্য গ্রহণ করা উচিত: YAGNI বা ভাল ডিজাইন?


76

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

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

public class CustomerRepository : ICustomerRepository
{
    ICustomerFactory factory = null;

    public CustomerRepository() : this(new CustomerFactory() { }

    public CustomerRepository(ICustomerFactory factory) {
        this.factory = factory;
    }      

    public Customer Find(int customerID)
    {
        // data access stuff here
        return factory.Build(ds.Tables[0].Rows[0]);
    }
}

এখানে আমার উদ্বেগটি হ'ল আমি YAGNI লঙ্ঘন করছি কারণ আমি 99% নিশ্চিততার সাথে জানি যে এই ভাণ্ডারটিতে কংক্রিট ছাড়া আর কিছু দেওয়ার কারণ নেই CustomerFactory; যেহেতু আমাদের ইউনিট পরীক্ষা নেই আমার কোনও MockCustomerFactoryবা অনুরূপ জিনিসের দরকার নেই এবং এতগুলি ইন্টারফেস থাকা আমার সহকর্মীদের বিভ্রান্ত করতে পারে। অন্যদিকে, কারখানার একটি কংক্রিট বাস্তবায়ন ব্যবহার করে মনে হচ্ছে কোনও ডিজাইনের গন্ধ।

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


17
আপনি বলছেন "যেহেতু আমাদের ইউনিট পরীক্ষা নেই আমার কাছে মকএক্সের দরকার নেই" যা স্বাভাবিকভাবে "আমার আইএক্স দরকার নেই, আমার কেবল এক্স প্রয়োজন"। আমি টুসকি প্রায় যে, আসলে আপনি ইউনিট পরীক্ষা হবে না যে আপনি নবম ও MockX প্রয়োজন, কারণ এই জিনিস আপনাকে সাহায্য করবে হাইলাইট আছে ইউনিট পরীক্ষা। কোনও পরীক্ষা না হওয়ার বাস্তবতা গ্রহণ করবেন না, এটি একটি অস্থায়ী সমস্যা হিসাবে বিবেচনা করুন যা নিরাময় হবে (সম্ভবত একটি ভাল, দীর্ঘ) সময়ের জন্য।
অ্যান্টনি পেগ্রাম

10
এটি গুগল করা তুচ্ছ হলেও, কারও উল্লেখ করা উচিত যে YAGNI এর অর্থ দাঁড়ায় "আপনার প্রয়োজন হবে না"
Thedaian

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

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

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

উত্তর:


75

সঠিক সফ্টওয়্যার ডিজাইনের মধ্যে সমাধানের সমাধান না করে কি কোনও সমঝোতায় আসার ভাল উপায় আছে?

YAGNI।

আমি ভাল ডিজাইনের একটি বিসর্জন দিতে পারে

মিথ্যা অনুমান।

এবং বেস ইন্টারফেস এবং তারপরে একক কংক্রিট,

এটি কোনও "ত্যাগ" নয়। যে হয় ভাল নকশা।


72
পরিপূর্ণতা অর্জন করা হয়, যখন যুক্ত করার মতো আরও কিছু থাকে না, তবে যখন কিছুই কেড়ে নিতে থাকে না। এন্টোইন ডি সেন্ট-এক্সুপেরি
নিউটোপিয়ান

5
@ নিউটোপিয়ান: অ্যাপলের সর্বশেষ পণ্য সম্পর্কে লোকজনের মধ্যে মিশ্র অনুভূতি রয়েছে। :)
রায় টিঙ্কার

14
এই ধরণের উত্তরগুলির সাথে আমার একটি বিশাল সমস্যা রয়েছে। "এক্স কি সত্য কারণ ওয়াই বলেছেন, এবং ওয়াই সম্প্রদায়ের দ্বারা সমর্থনযোগ্য" বৈধ যুক্তি? যদি বাস্তব জীবনে কেউ YAGNI এর বিরুদ্ধে লড়াই করে থাকে, আপনি কি তাকে এই উত্তরটি যুক্তি হিসাবে দেখিয়ে দেবেন?
vemv

2
@vemv। এখানে কেউ YAGNI এর বিরুদ্ধে রেটিং করছে না। সমস্ত এস.লোট বলেছিলেন যে 2 টি যোগ্য লক্ষ্যগুলির মধ্যে ওপি'র দ্বন্দ্ব একটি ভুল। বিটিডাব্লু, আপনি কি আজকের সফ্টওয়্যার জগতের এমন কোনও সক্রিয় বিকাশকারীকে জানেন যা ইয়াএগএনআই-এর বিপরীতে কৌতুক করবে? আপনি যদি সত্যিকারের প্রকল্পগুলিতে কাজ করে থাকেন তবে আপনি জানেন যে প্রয়োজনীয়তা নিয়মিত পরিবর্তিত হয় এবং ব্যবহারকারী এবং পরিচালনাকারীরা সাধারণত তারা জানেন না যে তারা কী করবেন না বা না চান যতক্ষণ না আপনি এটি তাদের সামনে না রাখেন। প্রয়োজনীয়টি কার্যকর করা হ'ল কাজের স্বাচ্ছন্দ্য - কেন ভবিষ্যতের পূর্বাভাস দেওয়ার চেষ্টা করে এমন কোড লিখে কেন সময়, শক্তি এবং অপব্যয়িত অর্থ (বা আপনার চাকরীর ঝুঁকি নিয়ে) নিন?
ভেক্টর

6
আমার বক্তব্য YAGNI সম্পর্কে নয় - এটি উত্তর মানের সম্পর্কে। আমি বলতে চাই না যে বিশেষ করে কেউ বর্ষণ করছে, এটি আমার যুক্তির অংশ ছিল। আবার এটি পড়ুন।
Vemv

74

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

সর্বাধিক সহজ ডিজাইনগুলি সবচেয়ে সহজে বিকশিত হয়। অকেজো, অতিভিত্তিক বিমূর্ত স্তরগুলির মতো রক্ষণাবেক্ষণযোগ্য কিছুই হ'ল না।


8
আমি 'YAGNI কোড এড়ানো' নিরবচ্ছিন্নভাবে অস্পষ্ট দেখতে পাই। এর অর্থ হতে পারে যে কোডগুলি আপনার দরকার নেই বা কোডটি যা YAGNI নীতিটি মেনে চলে । (Cf. 'চুম্বন কোড')
sehe

2
@ সেহ: এটি মোটেও দ্ব্যর্থক নয় (যদিও "ইয়াজিএনআই নীতির প্রতি অনুগত" একেবারে স্ববিরোধী) যদি আপনি এটি বানান করে থাকেন: "আপনি-না-প্রয়োজন-এটি-কোড" সম্ভবত এর অর্থ কিন্তু কোড যা হতে পারে তোমার দরকার নেই?
মাইকেল বর্গওয়ার্ট

1
আমি এই উত্তরটি একটি বড় ফন্টে মুদ্রণ করতে যাচ্ছি এবং এটি স্থির করে রাখব যেখানে সমস্ত আর্কিটেকচার নভোচারীরা এটি পড়তে পারে। +1 টি!
kirk.burleson

1
+1 টি। আমি এখনও আমার প্রথম কর্পোরেট প্রকল্পটি মনে করতে পারি যে আমাকে কিছু নতুন বৈশিষ্ট্য সমর্থন এবং যুক্ত করার জন্য দেওয়া হয়েছিল। প্রথম জিনিসটি আমি হ'ল 40,000 লাইনের প্রোগ্রাম থেকে 32,000 লাইন অব্যবহৃত কোড কোনও কার্যকারিতা হারিয়ে না ফেলে সরিয়েছি। আসল প্রোগ্রামার এর কিছুক্ষণ পরে বরখাস্ত করা হয়েছিল।
ইজে ব্রেণন

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

62

ইয়াগনি এবং সলিড (বা অন্য কোনও ডিজাইনের পদ্ধতি) পারস্পরিক একচেটিয়া নয়। যাইহোক, তারা কাছাকাছি মেরু বিপরীত। আপনাকে উভয়কেই 100% মেনে চলতে হবে না, তবে কিছু দেওয়া-নেওয়াও হবে; আপনি এক জায়গায় এক শ্রেণীর দ্বারা ব্যবহৃত উচ্চ-বিমূর্ত প্যাটার্নটি যত বেশি তাকাবেন এবং YAGNI বলুন এবং এটিকে সরল করুন, নকশাটি তত কম স্লাইড হয়ে যাবে। বিপরীতটিও সত্য হতে পারে; বিকাশের অনেক সময়, একটি নকশা সম্পূর্ণভাবে "বিশ্বাসের উপর" প্রয়োগ করা হয়; আপনার কীভাবে এটি প্রয়োজন হবে তা আপনি দেখতে পাচ্ছেন না, তবে আপনার কাছে কেবল একটি কুঁচকী রয়েছে। এটি সত্য হতে পারে (এবং আপনি যত বেশি অভিজ্ঞতার অভিজ্ঞতা অর্জনের সত্য হতে পারেন) তবে এটি আপনাকে চড়-ড্যাশ "এটি হালকা করুন" পদ্ধতির মতো প্রযুক্তিগত debtণও দিতে পারে; একটি DIL "স্প্যাগেটি কোড" কোডবেসের পরিবর্তে, আপনি "লাসাগন কোড" দিয়ে শেষ করতে পারেন, এতগুলি স্তর রয়েছে যা কেবল কোনও পদ্ধতি বা একটি নতুন ডেটা ফিল্ড যুক্ত করা কেবলমাত্র একটি বাস্তবায়ন সহ পরিষেবা প্রক্সি এবং আলগা-যুগল নির্ভরতাগুলির মাধ্যমে ওয়াডিংয়ের দীর্ঘকালীন প্রক্রিয়াতে পরিণত হয়। অথবা আপনি "রাভিওলি কোড" দিয়ে শেষ করতে পারেন, এটি এমন ছোট ছোট কামড়-আকারের অংশে আসে যা আর্কিটেকচারে উপরে, নীচে, বাম বা ডানদিকে চলে যায় আপনাকে প্রতিটি 3 টি লাইন দিয়ে 50 টি পদ্ধতিতে নিয়ে যায়।

আমি এটি অন্য উত্তরে বলেছি, তবে এটি এখানে: প্রথম পাসে, এটি কাজ করে। দ্বিতীয় পাসে এটি মার্জিত করুন। তৃতীয় পাসে এটি সলিড করুন।

এটি ভেঙে:

আপনি যখন প্রথম কোডের একটি লাইন লিখেন, তখন এটি কেবল কাজ করতে হয়। এই মুহুর্তে, আপনারা জানেন সবার জন্য এটি একদম বন্ধ। সুতরাং, আপনি 2 এবং 2 যোগ করার জন্য "আইভরি-টাওয়ার" আর্কিটেকচার তৈরির জন্য কোনও স্টাইল পয়েন্ট পাবেন না এবং আপনি যা করতে হবে তা করুন, এবং ধরে নিন যে আপনি এটি আর কখনও দেখতে পাবেন না।

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

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

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


আমি দুর্দান্ততা দ্বিতীয়।
ফিলিপ দুপানোভিć

2
হ্যাঁ. আমি যখন পুনঃব্যবহার / এক্সটেনশন সম্মুখের জন্য ডিজাইন করতাম, তখন আমি দেখতে পেতাম যে আমি যখন এটি পুনরায় ব্যবহার বা প্রসারিত করতে চেয়েছিলাম তখন এটি আমার প্রত্যাশার চেয়ে আলাদাভাবে হবে। ভবিষ্যদ্বাণী করা কঠিন, বিশেষত ভবিষ্যতের বিষয়ে। সুতরাং আমি আপনার 3-স্ট্রাইক বিধিটিকে সমর্থন করি - ততক্ষণে এটি কীভাবে পুনরায় ব্যবহার / বাড়ানো হবে তার একটি যুক্তিসঙ্গত ধারণা আপনার রয়েছে । নোট: একটি ব্যতিক্রম হ'ল যদি আপনি ইতিমধ্যে এটি কীভাবে জানেন (উদাহরণস্বরূপ পূর্ববর্তী প্রকল্পগুলি, ডোমেন জ্ঞান, বা ইতিমধ্যে নির্দিষ্ট করা আছে)।
13ren

চতুর্থ পাসে, এটিকে দুর্দান্ত করুন।
রিচার্ড নীল ইলাগান

@ কিথস: মনে হচ্ছে জন কারম্যাক অনুরূপ কিছু করেছিলেন: "দ্বিতীয় ভূমিকম্পের সোর্স কোড ... একের পর এক সুন্দর কোড আর্কিটেকচারে কোয়েস্ট ওয়ার্ল্ড এবং কোয়েকএলকে একীভূত করুন।" fabiensanglard.net/quake2/index.php
13ren

+1 আমি মনে করি আমি আপনার নিয়মের নাম রাখব: "প্রাকটিক্যাল রিফ্যাক্টরিং" :)
স্যাঙ্গো

31

এগুলির কোনওটির পরিবর্তে, আমি WTSTWCDTUAWCROT পছন্দ করি?

(এটি কার্যকর এবং আমরা বৃহস্পতিবার মুক্তি দিতে পারি এমন সহজ জিনিসটি কী?)

সহজ সংক্ষিপ্ত বিবরণগুলি আমার করণীয় তালিকায় রয়েছে তবে সেগুলি অগ্রাধিকার নয়।


8
সেই সংক্ষিপ্ত বিবরণটি YAGNI নীতিটি লঙ্ঘন করেছে :)
রিভালক

2
আমি আমার প্রয়োজনীয় অক্ষরগুলি হুবহু ব্যবহার করেছি - কম বেশি কিছু হয় না। এইভাবে, আমি মোজার্টের মতো একরকম। হাঁ। আমি সংক্ষেপে মোজার্ট।
মাইক শেরিল 'ক্যাট রিক্যাল'

4
আমি কখনই জানতাম না মোজার্ট সংক্ষিপ্ত শব্দ তৈরিতে ভয়ানক। আমি একটি এসই সাইটে প্রতিদিন নতুন কিছু শিখি। : পি
ক্যামেরন ম্যাকফারল্যান্ড

3
@ মাইক শেরিল 'ক্যাটর্যাকাল': সম্ভবত কারও এটি ডাব্লুটিএসটিডাব্লুসিডিটিউডাব্লুক্রোটাবিবিএফ পর্যন্ত বাড়ানো উচিত = "আমরা কার্যকর যেটি করতে পারি তা সহজ কোনটি, আমরা বৃহস্পতিবার মুক্তি দিতে পারি এবং শুক্রবারে ভাঙ্গবে না?" ;-)
জর্জিও

1
@ স্টারগাজের 712 ন :) এটি পোলাকে লঙ্ঘন করে।
v.oddou

25

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

কোনও কারখানা চালু করা কি আপনার বিদ্যমান কোডটিকে সহজতর করবে? যদি না হয় তবে এটি যুক্ত করবেন না। যদি এটি হয়, উদাহরণস্বরূপ আপনি যখন পরীক্ষা যোগ করছেন (যা আপনার করা উচিত!) এটি যুক্ত করুন।

YAGNI ভবিষ্যতের ফাংশনগুলি সমর্থন করার জন্য জটিলতা যোগ করার বিষয়ে নয়
ভাল ডিজাইন জটিলতা অপসারণ সম্পর্কে যখন এখনও সমস্ত বর্তমান ফাংশন সমর্থন করে।


15

তারা বিরোধে নয়, আপনার লক্ষ্যগুলি ভুল।

আপনি কী অর্জন করার চেষ্টা করছেন?

আপনি মানের সফ্টওয়্যারটি লিখতে চান এবং এটি করার জন্য আপনি নিজের কোড বেসটি ছোট রাখতে চান এবং কোনও সমস্যা নেই।

এখন আমরা একটি বিরোধে পৌঁছেছি, আমরা ব্যবহার না করা মামলাগুলি না লিখলে আমরা কীভাবে সমস্ত মামলা কভার করব?

আপনার সমস্যাটি কেমন দেখাচ্ছে তা এখানে।

এখানে চিত্র বর্ণনা লিখুন (আগ্রহী যে কেউ, এটি বাষ্পীভূত মেঘ বলা হয় )

তো, এটি কী চালাচ্ছে?

  1. আপনি কি জানেন না আপনি কি প্রয়োজন হয় না
  2. আপনি সময় নষ্ট করতে এবং আপনার কোডটি ফুটিয়ে তুলতে চান না

এর মধ্যে কোনটি আমরা সমাধান করতে পারি? ঠিক আছে, দেখে মনে হচ্ছে এটি সময় নষ্ট করতে চান না এবং ব্লাট কোডটি একটি দুর্দান্ত লক্ষ্য, এবং তা উপলব্ধি করে। First প্রথমটির কী হবে? আমরা কোড করতে যাচ্ছি আমরা কি তা জানতে পারি?

আমি কর্মক্ষেত্রে একটি প্রকল্পে কাজ করছি এবং আস্তে আস্তে আমার সহকর্মীদের কাছে ভাল কোডের মান চালু করতে চাই (বর্তমানে কোনওটি নেই এবং সবকিছুই ছড়া বা কারণ ছাড়াই একসাথে হ্যাক হয়ে গেছে) [...] আমি এক পদক্ষেপ ফিরে নিয়েছি এবং ভেবেছি এটি YAGNI লঙ্ঘন করছে কারণ আমি দৃ much়তার সাথে জানি যে আমাদের এই শ্রেণীর কয়েকটি বাড়ানোর প্রয়োজন নেই।

এর সব আবার বাক্যবাক্য

  • কোনও কোডের মান নেই
  • কোনও প্রকল্পের পরিকল্পনা চলছে না
  • কাউবয় সর্বত্র তাদের নিজস্ব জঘন্য কাজ করে (এবং আপনি বন্য জঙ্গলে পশ্চিম দিকে শেরিফ খেলার চেষ্টা করছেন), হ্যাঁ।

সঠিক সফ্টওয়্যার ডিজাইনের মধ্যে সমাধানের সমাধান না করে কি কোনও সমঝোতায় আসার ভাল উপায় আছে?

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

একটি প্রকল্প / টিম ম্যানেজার পান যিনি এই জিনিসগুলি করতে পারেন। আপনার যদি একটি থাকে তবে আপনার কাছে তাদের একটি মানচিত্রের জন্য জিজ্ঞাসা করতে হবে এবং ম্যাপটি না থাকা উপস্থাপন করছে এমন YAGNI সমস্যাটি ব্যাখ্যা করতে হবে। যদি তারা গুরুতরভাবে অক্ষম হয় তবে নিজেই পরিকল্পনাটি লিখুন এবং বলুন "আমাদের প্রয়োজনীয় জিনিসগুলি সম্পর্কে আপনার জন্য এখানে আমার প্রতিবেদন, দয়া করে এটি পর্যালোচনা করুন এবং আপনার সিদ্ধান্তটি আমাদের জানান।"


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

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

এরম ..... আমার মনে হয় ড্রাইভিংয়ের লক্ষ্যটি 'আপনি একটি ভাল, মূল্যবান পণ্য রাখতে চান'?
sehe

@ এটি তাঁর সিদ্ধান্ত নয়: পি।
ছদ্মবেশে

3
দুর্দান্ত উত্তর। তিনি একটি উত্সাহী যুদ্ধের মুখোমুখি। কোনও পরিচালনা কেনার ব্যবস্থা না থাকলে এটি সম্পন্ন করা শক্ত হবে And এবং আপনি ঠিক বলেছেন যে প্রশ্নটি সময়কালীন এবং আসল সমস্যাটির সমাধান করে না।
শেঠ স্পিয়ারম্যান

10

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


1
গুড ডিজাইন এবং ইয়াজিএনআইয়ের মধ্যে কেবল মহাজাগতিক লড়াই এবং / বা প্রেম-ইন-এর চেয়ে প্রকৃত সমস্যা সম্পর্কে সহায়ক মন্তব্যের জন্য +1।
পিএসআর

10

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

এখন, প্রতিটি নীতিটি এই বোঝার সাথে একবার দেখে নেওয়া যাক যে তারা যখন কখনও কখনও বিভিন্ন দিকে টানতে পারে তবে তারা কোনওভাবেই সংঘাতের মধ্যে নেই।

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

অনেক লোক যা মনে করেন তার বিপরীতে, সলিড পুনঃব্যবহারযোগ্যতা, উদারতা বা এমনকি বিমূর্ততা সম্পর্কে নয় । সলিড আপনাকে নির্দিষ্ট কোড পরিবর্তন করতে সহায়তা করার উদ্দেশ্যে তৈরি করা হয়েছে যা সেই নির্দিষ্ট পরিবর্তনটি কী হতে পারে সে সম্পর্কে কিছু না বলে change সলিডের পাঁচটি নীতিই কোড তৈরির জন্য একটি কৌশল তৈরি করে যা অতিরিক্ত জেনেরিক না হয়ে নমনীয় এবং নির্বোধ না হয়ে সহজ simple SOLID কোডের যথাযথ প্রয়োগের সাথে সংজ্ঞাযুক্ত ভূমিকা ও সীমানা সহ ছোট, ফোকাসযুক্ত ক্লাস তৈরি হয়। ব্যবহারিক ফলাফলটি হ'ল যে কোনও প্রয়োজনীয় প্রয়োজনীয়তার পরিবর্তনের জন্য, ন্যূনতম সংখ্যার ক্লাস স্পর্শ করা দরকার। এবং একইভাবে, যে কোনও কোড পরিবর্তনের জন্য, অন্যান্য ক্লাসের মাধ্যমে ন্যূনতম পরিমাণে "রিপল" থাকে।

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

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

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

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

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

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

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

সুতরাং এই সমস্ত বিবেচনার পরে, আমরা দেখতে পেলাম যে ইয়াগনি এবং সলিড আসলে একটি সাধারণ, তাত্ক্ষণিক-প্রাসঙ্গিক পরামর্শ সরবরাহ করে: সম্ভবত একটি সাধারণ জেনেরিক সংগ্রহস্থল ইন্টারফেস তৈরি করার প্রয়োজন হয় না necessary

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


আমি মনে করি এই পৃষ্ঠায় সর্বাধিক আলোচনার ফলে 2 টি বৃহত্তর প্রতিযোগী "লো সংযুক্তি" এবং জিআরএসআর নীতিগুলির "উচ্চ সংহতি" খুঁজে পাবে। ব্যয়বহুল ডিজাইনের সিদ্ধান্তগুলি "লো কাপলিং" নীতি থেকে আসে। কম সংযোগের স্বার্থে কখন এসআরপি + আইএসপি + ডিআইপি "সক্রিয়" করবেন তা পছন্দ করুন। উদাহরণ: এক শ্রেণি -> এমভিসি প্যাটার্নে 3 শ্রেণি। বা আরও বেশি ব্যয়বহুল: .dll / .so মডিউল / সমাবেশগুলিতে বিভক্ত। এটি অত্যন্ত ব্যয়বহুল কারণগুলি বিল্ডিং ইমপ্লিকেশনগুলি, প্রকল্পগুলি, মেকলিস্টগুলি, সার্ভার তৈরি করতে, উত্স-
সংস্করণযুক্ত

6

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

আইএমও এটি খারাপ ডিজাইন। YAGNI ভাল ডিজাইনের একটি উপাদান, এটির সাথে কখনও কখনও কোনও দ্বন্দ্ব নেই।


2

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

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


আপনার প্রথম এবং তৃতীয় লিঙ্কগুলি একই জায়গায় যায়।
ডেভিড থর্নলি

2

কিছু লোকের যুক্তি, সেই ইন্টারফেসের নামগুলি I দিয়ে শুরু করা উচিত নয় Spec বিশেষত একটি কারণ হ'ল আপনি প্রদত্ত প্রকারটি কোনও শ্রেণি বা ইন্টারফেস কিনা তার উপর নির্ভরতা ফাঁস করছেন।

CustomerFactoryপ্রথমে আপনাকে ক্লাস হতে এবং পরে এটি একটি ইন্টারফেসে পরিবর্তন করা থেকে বাধা দেয়, তা হয় বাস্তবায়ন করবে DefaultCustormerFactoryবা দ্বারা UberMegaHappyCustomerPowerFactory3000? আপনার কেবলমাত্র সেই স্থানটি পরিবর্তন করতে হবে যা বাস্তবায়ন তাত্ক্ষণিকভাবে আসে। এবং যদি আপনার আরও কম ভাল ডিজাইন থাকে তবে এটি বেশিরভাগ স্থানে।

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

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

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

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


0

আপনি interfaceভবিষ্যতে একটি প্রত্যাশিত একাধিক বাস্তবায়ন তৈরি করছেন । I<class>আপনার কোডবেসে প্রতিটি ক্লাসের জন্য পাশাপাশি থাকতে পারে । না।

YAGNI অনুসারে কেবল একক কংক্রিটের ক্লাস ব্যবহার করুন। যদি পরীক্ষার উদ্দেশ্যে আপনার "মক" অবজেক্ট থাকা দরকার বলে মনে করেন তবে দুটি বাস্তবায়ন সহ মূল ক্লাসটি একটি বিমূর্ত শ্রেণিতে পরিণত করুন , একটি মূল কংক্রিট শ্রেণীর সাথে এবং অন্যটি মক প্রয়োগের সাথে।

নতুন কংক্রিটের ক্লাসটি ইনস্ট্যান্ট করার জন্য আপনাকে অবশ্যই স্পষ্টতই মূল শ্রেণীর সমস্ত ইনস্ট্যান্টেশন আপডেট করতে হবে। আপনি সামনে একটি স্ট্যাটিক কনস্ট্রাক্টর ব্যবহার করে এটি পেতে পারেন।

ইয়াজিএনআই বলছে কোড লেখার আগে এটি লিখতে হবে না।

ভাল ডিজাইন বিমূর্ততা ব্যবহার করতে বলে।

আপনি উভয় থাকতে পারে। একটি শ্রেণি একটি বিমূর্ততা হয়।


0

কেন মার্ক ইন্টারফেস? এটি আমাকে আঘাত করে যে এটি "ট্যাগিং" ছাড়া আর কিছুই করছে না। প্রতিটি ফ্যাক্টরি ধরণের জন্য একটি পৃথক "ট্যাগ" দিয়ে, কী লাভ?

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

ইন্টারফেসগুলি সাধারণতার ভিত্তিতে জিনিসগুলি পরিচালনা করার জন্য for তবে কাস্টম চিহ্নিতকারী ইন্টারফেসগুলি ক) কোনও আচরণ যুক্ত করবেন না। এবং খ) তাদের স্বতন্ত্রতা পরিচালনা করতে আপনাকে বাধ্য করুন।

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

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


0

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

অন্যথায়, অপেক্ষা করুন। আপনার একটি বা দুটি প্রকৃত বাস্তবায়ন হওয়ার আগে একটি ইন্টারফেসে অনুমান করা সাধারণত ব্যর্থ হয়। অন্য কথায়, সাধারণ করার জন্য আপনার বেশ কয়েকটি উদাহরণ না পাওয়া পর্যন্ত অভিনব নকশা প্যাটার্নটিকে সাধারণকরণ / বিমূর্তকরণ / ব্যবহার করবেন না।

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