"উত্তরাধিকারের উপরের রচনা" "শুকনো নীতি" লঙ্ঘন করছে?


36

উদাহরণস্বরূপ, বিবেচনা করুন আমার অন্যান্য ক্লাসগুলির প্রসারিত করার জন্য একটি ক্লাস রয়েছে:

public class LoginPage {
    public String userId;
    public String session;
    public boolean checkSessionValid() {
    }
}

এবং কিছু উপশ্রেণী:

public class HomePage extends LoginPage {

}

public class EditInfoPage extends LoginPage {

}

প্রকৃতপক্ষে, সাবক্লাসের ওভাররাইড করার কোনও পদ্ধতি নেই, এছাড়াও আমি জেনেরিক উপায়ে হোমপেজ অ্যাক্সেস করতে পারি না, যেমন: আমি এর মতো কিছু করব না:

for (int i = 0; i < loginPages.length; i++) {
    loginPages[i].doSomething();
}

আমি শুধু লগইন পৃষ্ঠা পুনরায় ব্যবহার করতে চাই। তবে https://stackoverflow.com/a/53354 অনুসারে আমার এখানে রচনাটি পছন্দ করা উচিত কারণ আমার লগইনপেজ ইন্টারফেসের প্রয়োজন নেই, তাই আমি এখানে উত্তরাধিকার ব্যবহার করি না:

public class HomePage {
    public LoginPage loginPage;
}

public class EditInfoPage {
    public LoginPage loginPage;
}

তবে সমস্যাটি এখানে আসে নতুন সংস্করণে কোডটি:

public LoginPage loginPage;

সদৃশ যখন একটি নতুন ক্লাস যুক্ত করা হয়। এবং যদি লগইনপেজের সেটার এবং গেটর দরকার হয় তবে আরও কোড অনুলিপি করা দরকার:

public LoginPage loginPage;

private LoginPage getLoginPage() {
    return this.loginPage;
}
private void setLoginPage(LoginPage loginPage) {
    this.loginPage = loginPage;
}

সুতরাং আমার প্রশ্নটি হচ্ছে, "শুকনো নীতি" লঙ্ঘন করে কি "রচনা ওভার ইনরিয়েন্স"?


13
কখনও কখনও আপনার উত্তরাধিকার বা সংমিশ্রণের প্রয়োজন হয় না, যা কখনও কখনও কয়েকটি জিনিস সহ একটি শ্রেণি কাজ করে।
এরিক tদ

23
আপনি কেন আপনার সমস্ত পৃষ্ঠাগুলি লগইন পৃষ্ঠা হতে চান? সম্ভবত একটি লগইন পৃষ্ঠা আছে।
মিঃ কোচি

29
তবে, উত্তরাধিকার সহ, আপনি extends LoginPageপুরো জায়গা জুড়ে সদৃশ । মেট চেক করুন!
el.pescado

2
শেষ স্নিপেটে আপনার যদি সমস্যাটি থাকে তবে আপনি সম্ভবত গ্রাহক এবং সেটটারকে অতিরিক্ত ব্যবহার করছেন। তারা encapsulation লঙ্ঘন ঝোঁক।
ব্রায়ান ম্যাকচ্যাটন

4
সুতরাং, আপনার পৃষ্ঠাকে সজ্জিত করতে সক্ষম করুন এবং আপনার LoginPageডেকরেটার তৈরি করুন। আর কোনও সদৃশ হবে না, কেবল একটি সরল page = new LoginPage(new EditInfoPage())এবং আপনার কাজ শেষ। অথবা আপনি প্রমাণীকরণ মডিউলটি যে কোনও পৃষ্ঠাতে গতিশীলভাবে যুক্ত হতে পারে তা করতে ওপেন-ক্লোজড-নীতিটি ব্যবহার করেন। কোড ডুপ্লিকেশনকে মোকাবেলা করার প্রচুর উপায় রয়েছে, মূলত একটি নতুন বিমূর্ততা সন্ধানের সাথে জড়িত। LoginPageসম্ভবত একটি খারাপ নাম, আপনি যা নিশ্চিত করতে চান সেটি হ'ল ব্যবহারকারীটি সেই পৃষ্ঠাটি ব্রাউজ করার সময় প্রমাণীকরণ করা হয় , যখন তাকে পুনঃনির্দেশিত করা হয় LoginPageবা তিনি না থাকলে একটি সঠিক ত্রুটি বার্তা দেখানো হয়।
13:38

উত্তর:


46

আপনি অপেক্ষা করছেন যে পুনরাবৃত্তি সম্পর্কে উদ্বিগ্ন

public LoginPage loginPage;

দুটি জায়গায় DRY লঙ্ঘন? সেই যুক্তি দ্বারা

int x;

পুরো কোড বেসে এখন কেবলমাত্র একটি অবজেক্টে থাকতে পারে। Bleh।

DRY মনে রাখা ভাল জিনিস তবে আসুন। ব্যতীত

... extends LoginPage

আপনার বিকল্পটিতে নকল হচ্ছে তাই এমনকি DRY সম্পর্কে মলদ্বার হওয়াও এটিকে বোঝায় না।

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

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

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

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

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

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

এখন এমন নয় যে আমি কখনও উত্তরাধিকার ব্যবহার করতে অস্বীকার করি। আমার প্রিয় ব্যবহারগুলির একটি হ'ল ব্যতিক্রমগুলি নতুন নাম দেওয়া:

public class MyLoginPageWasNull extends NullPointerException{}

int x;কোনও কোডবেসে শূন্যের বেশি আর অস্তিত্ব থাকতে পারে না
কে। অ্যালান বেটস

@ কে। অ্যালানবাটস আমাকে ক্ষমা করবেন ?
candied_orange

... আমি জানতাম আপনি পয়েন্ট ক্লাসের সাথে প্রতিশোধ নিতে যাবেন। পয়েন্ট ক্লাসের কথা কেউ পাত্তা দেয় না। যদি আমি আপনার কোডবেজে প্রবেশ করি এবং দেখি int a; int b; int x;আমি 'আপনি' সরিয়ে ফেলতে চাই push
কে। অ্যালান বেটস

@ কে.এলানবেটস বাহ এটি দুঃখজনক যে আপনি মনে করেন যে এই ধরণের আচরণ আপনাকে একটি ভাল কোডার করে তুলবে। সেরা কোডার এমনটি নয় যা অন্যদের সম্পর্কে সর্বাধিক জিনিসগুলি খুঁজে পেতে পারে। এটিই যা বিশ্রামগুলি আরও ভাল করে তোলে।
candied_orange

অর্থহীন নাম ব্যবহার করা একটি অ-স্টার্টার এবং সম্ভবত সেই কোডটির বিকাশকারীকে সম্পদের পরিবর্তে দায়বদ্ধ করে তোলে।
কে। অ্যালান বেটস

127

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

LoginPageলগ ইন করার জন্য পৃষ্ঠাটি কীভাবে আঁকতে হয় তা সম্পর্কে জানেন EditInfoPagethis সহ LoginPageরচনা মারফত না কোন ভাবেই শুষ্ক নীতি লঙ্ঘন।

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


27
"একক দায়িত্বের নীতি" আরও অনেক বেশি ব্যবহৃত হয়। "নিজেকে পুনরাবৃত্তি করবেন না" সহজেই দ্বিতীয় নম্বর হিসাবে আসতে পারে :-)
gnasher729

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

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

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

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

12

সংক্ষিপ্ত উত্তর: হ্যাঁ, এটি - কিছু গৌণ, গ্রহণযোগ্য ডিগ্রি পর্যন্ত।

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

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

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

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

আপনার উদাহরণের জন্য একটি নোট: আপনার HomePageএবং আপনার EditInfoPageচেহারাটি কেমন তা আমি জানি না , তবে যদি তাদের লগইন কার্যকারিতা থাকে এবং একটি HomePage(বা একটি EditInfoPage) হয় LoginPage তবে উত্তরাধিকার এখানে সঠিক সরঞ্জাম হতে পারে। একটি কম বিতর্কযোগ্য উদাহরণ, যেখানে রচনা আরও স্পষ্টভাবে উপায়ে আরও ভাল হাতিয়ার হবে, সম্ভবত বিষয়গুলি আরও পরিষ্কার করে দেবে।

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

  • এর পুনরায় ব্যবহারযোগ্য অংশটি LoginPageএর নিজস্ব একটি উপাদানতে বের করুন

  • সেই উপাদানটি পুনরায় ব্যবহার করুন HomePageএবং EditInfoPageএকইভাবে এটি এখন ভিতরে ব্যবহার করা হয়LoginPage

এইভাবে, এটি সাধারণত আরও স্পষ্ট হয়ে উঠবে কেন এবং কখন উত্তরাধিকারের উপর রচনাটি সঠিক পন্থা।

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