ডিআরওয়াই নীতির ব্যাখ্যা pret


10

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

createTrajectoryFromPoint(A a,B b,C c,boolean doesSomething,boolean doesSomething2)

এই ফাংশনটি আমি বলেছি 3 ইনপুট পরামিতি লাগে, এবং তারপরে বুলিয়ান সংমিশ্রণগুলি doesSomethingএবং প্রদত্ত ফাংশনটি কিছুটা আলাদা করবে doesSomething2। তবে আমার যে সমস্যা হচ্ছে তা হ'ল এই ফাংশনটি যুক্ত হওয়া প্রতিটি নতুন বুলিয়ান প্যারামিটারের সাথে জটিলতায় বেড়ে চলেছে।

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


3
ভাগ করা / সাধারণ যুক্তি কি ব্যক্তিগত ফাংশনগুলিতে আলাদা করা যায় যা বিভিন্ন পাবলিক createTrajectory...ফাংশন সমস্ত কল করে?
হতাশ

এটি হতে পারে তবে সেই ব্যক্তিগত ফাংশনগুলিতে এখনও সেই বুলিয়ান প্যারামিটারগুলি পাওয়া দরকার
Albinoswordfish

2
আমি মনে করি এটির / উত্তর দেওয়া সহজ হবে যে কোনও ধরণের দৃ some় উদাহরণ দেওয়া হয়েছে। আমার তাত্ক্ষণিক প্রতিক্রিয়াটি হ'ল যে দ্বৈতত্ত্বটি আপনি চিত্রিত করছেন তা সম্পূর্ণ বাস্তব নয় - যেমন, কেবল দুটি পছন্দ নয়। অন্যদিকে, আমি booleanপ্যারামিটার হিসাবে কোনও ব্যবহারকে বিবেচনা করব কিছুটা সন্দেহজনক suspect
জেরি কফিন


আহ, আপনি শর্তযুক্ত জিনিসগুলিকে তাদের নিজস্ব কার্যাবলীতে সন্ধান করছেন না কেন?
রিগ

উত্তর:


19

একক ফাংশন / পদ্ধতিতে বিভিন্ন কোড পাথ ট্রিগার করতে বুলিয়ান আর্গুমেন্টগুলি একটি ভয়ানক কোড গন্ধ

আপনি যা করছেন তা লুজ কাপলিং এবং উচ্চ সংহতি এবং একক দায়িত্বের নীতি লঙ্ঘন করে, যা ডিআরওয়ির চেয়ে অগ্রাধিকারের চেয়ে অনেক বেশি গুরুত্বপূর্ণ

এর অর্থ হল যে জিনিসগুলি কেবল তখনই ( অন্যত্র সংযুক্ত করা ) যখন অন্য জিনিসগুলির উপর নির্ভর করে এবং তাদের কেবল একটি জিনিস করা উচিত এবং কেবলমাত্র একটি জিনিস (খুব ভাল) ( সংহতি )।

আপনার নিজের বাদ দিয়ে, এটি খুব শক্তভাবে মিলিত হয়েছে (সমস্ত বুলিয়ান পতাকাগুলি এক ধরণের রাষ্ট্র নির্ভরতা, যা সবচেয়ে খারাপ একটি!) এবং অনেকগুলি পৃথক দায়িত্ব অন্তর্নিহিত (অত্যধিক জটিল) রয়েছে।

আপনি যা করছেন তা কোনওভাবেই ডিআরওয়ির আত্মায় নয় । DRY পুনরাবৃত্তি সম্পর্কে আরও বেশি ( Rস্ট্যান্ডস REPEAT)) অনুলিপি এবং পেস্ট এড়ানো এটি এর সবচেয়ে প্রাথমিক ফর্ম is আপনি যা করছেন তা পুনরাবৃত্তির সাথে সম্পর্কিত নয়।

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


ঠিক আছে বলে মনে হচ্ছে যেভাবে আমি লিখছি তা খুব ভাল নয় (আমার প্রাথমিক সন্দেহ) এই '
স্প্রিট অফ ডিআরআই


4

আপনি যে কাজটি বিভিন্ন কাজ করতে বুলিয়ানগুলিতে যাচ্ছেন তা একক দায়িত্বের নীতি লঙ্ঘন। একটি ফাংশন একটি জিনিস করা উচিত। এটি কেবল একটি কাজ করা উচিত এবং এটি এটি ভালভাবে করা উচিত।

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

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

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


3

আপনি কিছু বা কিছু করার সিদ্ধান্ত নেওয়ার আগে আপনার ফাংশনে সমস্ত যুক্তি যুক্ত একটি ফাংশন কেন তৈরি করবেন না এবং তারপরে তিনটি ফাংশন যেমন:

createTrajectoryFromPoint(A a,B b,C c){...}

dosomething(A a, B b, C c){...}

dosomething2(A a, B b, C c){...}

এবং এখন তিনটি পৃথক ফাংশনে তিনটি একই পরামিতি প্রকারগুলি পাস করে আপনি আবার নিজেকে পুনরাবৃত্তি করবেন, সুতরাং আপনার A, B, C যুক্ত স্ট্রাক্ট বা শ্রেণীর সংজ্ঞা দেওয়া উচিত।

বিকল্পভাবে আপনি প্যারামিটার এ, বি, সি এবং একটি অপারেশন তালিকা তৈরি করতে একটি ক্লাস তৈরি করতে পারেন। অবজেক্টের সাথে ক্রিয়াকলাপগুলি নিবন্ধভুক্ত করে এই প্যারামিটারগুলির সাথে (ক, কিছু 2) আপনি কী করতে চান তা যুক্ত করুন। তারপরে আপনার অবজেক্টে সমস্ত নিবন্ধিত ক্রিয়াকলাপ কল করার জন্য একটি পদ্ধতি রয়েছে।

public class MyComplexType
{
    public A a{get;set;}
    public B b{get;set;}
    public C c{get;set;}

    public delegate void Operation(A a, B b, C c);
    public List<Operation> Operations{get;set;}

    public MyComplexType(A a, B b, C c)
    {
        this.a = a;
        this.b = b;
        this.c = c   
        Operations = new List<Operation>();
    }

    public CallMyOperations()
    {
        foreach(var operation in Operations)
        {
            operation(a,b,c);
        }
    }
}

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

2

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


1

আমি সাধারণত এই সমস্যাটি নিয়ে বেশ কয়েকটি পদক্ষেপ নিয়ে চলেছি, যখন কীভাবে আরও এগিয়ে যাবেন তা কখন বুঝতে পারছেন না stop

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

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

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

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


0

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

createTrajectoryFromPoint(A a,B b,C c,IX x,IY y)

যেখানে আপনার কাছে আইএক্স এবং আইওয়াই বাস্তবায়ন রয়েছে যা বুলিয়ানদের জন্য বিভিন্ন মানকে উপস্থাপন করে। আপনার যেখানেই থাকুন ফাংশনটির শরীরে

if (doesSomething)
{
     ...
}
else
{
     ...
}

আপনি বাদ দেওয়া কোড ব্লক সহ বাস্তবায়ন সহ আইএক্স-এ সংজ্ঞায়িত পদ্ধতিতে কল দিয়ে এটি প্রতিস্থাপন করবেন।

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