কখন একটি সাধারণ ক্ষেত্রকে বেস শ্রেণিতে স্থানান্তর করতে?


16

আমার বর্তমানে দুটি উদ্ভূত ক্লাস রয়েছে Aএবং Bএটি উভয়েরই একটি ক্ষেত্র রয়েছে এবং এটি নির্ধারণের চেষ্টা করছি যে এটি বেস বর্গের মধ্যে যেতে হবে কিনা।

এটি কখনই বেস বর্গ থেকে রেফারেন্স করা হয় না, এবং বলুন যে যদি রাস্তার এক পর্যায়ে অন্য শ্রেণীর উত্পন্ন হয়, যদি এর কোনটি Cনা থাকে _field1তবে "ন্যূনতম সুবিধাবঞ্চিত" (বা কিছু) প্রধানকে যদি লঙ্ঘন করা হয় না তবে কে ছিলেন?

public abstract class Base
{
    // Should _field1 be brought up to Base?
    //protected int Field1 { get; set; }
}

public class A : Base
{
    private int _field1;
}

public class B : Base
{
    private int _field1;
}

public class C : Base
{
    // Doesn't have/reference _field1
}

18
আমি মনে করি এই প্রশ্ন স্পষ্ট নয় কারণ আপনার কী কোন ধারণা না দিয়েছি Base, A, B, C, এবং _field1হয়। সেগুলি গুরুত্বপূর্ণ বিবরণ যা বাদ দেওয়া উচিত নয়; আমি মনে করি আপনার প্রশ্নটি সম্পাদনা করা উচিত সেগুলি কী তা নিয়ে কথা বলার জন্য।
ট্যানার সোয়েট

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

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

আপনার সাথে বেস ক্লাস কেন শুরু হবে?
jpmc26

উত্তর:


34

আপনি যে সমস্যার সমাধান করতে চাইছেন তার উপর এটি নির্ভর করে।

একটি কংক্রিট উদাহরণ বিবেচনা করুন: আপনার বিমূর্ত বেস ক্লাস Vehicleএবং আপনার বর্তমানে কংক্রিট বাস্তবায়ন Bicycleএবং Car। আপনি চলন্ত বিবেচনাধীন numberOfWheelsথেকে Bicycleএবং Carগাড়ির। আপনার এই করা উচিত? না! কারণ সমস্ত যানবাহনের চাকা থাকে না। আপনি ইতিমধ্যে বলতে পারেন যে আপনি যদি একটি Boatক্লাস যুক্ত করার চেষ্টা করেন তবে এটি ব্রেক হয়ে যাচ্ছে।

এখন, যদি আপনার বিমূর্ত বেস শ্রেণিটি হয় WheeledVehicleতবে numberOfWheelsসেখানে সদস্যের পরিবর্তনশীল থাকা যুক্তিযুক্ত ছিল।

আপনার সমস্যার জন্য আপনাকে একই যুক্তি প্রয়োগ করতে হবে, কারণ আপনি দেখতে পাচ্ছেন যে এটি কোনও হ্যাঁ বা কোনও উত্তর নয়।


3
কেউ অস্থায়ীভাবে মেনে নিতে পারে যে 0টি একটি বৈধ নম্বর অফ-ওয়েল। যাইহোক, শেষ পর্যন্ত আপনি একটি roll()পদ্ধতি যুক্ত করতে পারেন , যার পয়েন্টে সাবক্লাস ধারণাটি প্রাকৃতিক দেখায়।
user949300

11
একটি নৌকায় 0 টি চাকা রয়েছে। কি ভেঙে যায়?
ডি ড্রিমার

14
@ ডিডিআরএমআর এটি এমন নয় যে একটি নৌকার কাছে 0 টি চাকা থাকে, এটি একটি নৌকার ধারণার মতো চাকারও অস্তিত্ব নেই - সুতরাং আপনার মডেলগুলিকে এটির জন্য অনুমতি দেওয়া উচিত নয়।
পিটার এম

10
আমার বক্তব্যটি উদাহরণটি খারাপ। কোনও যানবাহনের সাথে ধারণাটিগতভাবে কোনও ভুল নেই (এটি একটি নৌকা হতে পারে) উল্লেখ করে যে এর 0 টি চাকা রয়েছে।
ডি Drmmr

10
আপনার যখন প্যাডেল বোটটি সংরক্ষণ করা দরকার তখন এটি সমস্ত জাহান্নামে চলে যায়।
IllusiveBrian

13

যৌক্তিকভাবে বলতে গেলে, বেস ক্লাসে বনাম সাবক্ল্যাসে সাধারণভাবে প্রতিলিপিযুক্ত ক্ষেত্র স্থাপনের বাইরে একটি তৃতীয় বিকল্প রয়েছে: এটি হায়ারার্কিতে একটি নতুন সাবক্লাস প্রবর্তন করা হয় যার মধ্যে দুটির মধ্যে সাধারণ বৈশিষ্ট্য রয়েছে। @ পিট সম্পূর্ণরূপে সেখানে না গিয়ে এ দিকে ইঙ্গিত দেয়।

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

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


এটি আসলে আমি যা করার সিদ্ধান্ত নিয়েছি (এ এবং বি বেশিরভাগই ওভারল্যাপ করে, তাই বি এ থেকে নেওয়া হবে)।
সমিস

9

আমি এখানে শয়তানের উকিল খেলতে যাচ্ছি।

এই মুহূর্তে আপনার কিছুই করা উচিত নয়

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

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


2
সিদ্ধান্ত নেওয়ার জন্য একটি বুদ্ধিমান পর্যবেক্ষণ, যা আমি বলব।
রাডারবাব

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

2

সাধারণভাবে, আমি এটি বেস শ্রেণিতে স্থানান্তর করব। আমি মনে করি না হ্যাঁ / না এর কোনও উদ্দেশ্য আছে, কারণ এখানে একটি বাণিজ্য বন্ধ রয়েছে - অব্যবহৃত ক্ষেত্রগুলি বনাম জটিলতা হ্রাস করা।

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

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


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

1
@ সামিস: আপনি "এ, বি, সি" এবং "বেস" নামের ক্লাসগুলি কেবল একটি ক্ষেত্র এবং প্রডাকশন কোডে কোনও পদ্ধতি ব্যবহার করে না? আমি যে প্রশ্ন।
ডক ব্রাউন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.