পদ্ধতি প্যারামিটার হিসাবে সদস্য ভেরিয়েবল পাস করা


33

একটি প্রকল্পে আমি এই জাতীয় কোড পেয়েছি:

class SomeClass
{
    private SomeType _someField;

    public SomeType SomeField
    {
        get { return _someField; }
        set { _someField = value; }
    }

    protected virtual void SomeMethod(/*...., */SomeType someVar)
    {
    }

    private void SomeAnotherMethod()
    {
        //.............
        SomeMethod(_someField);
        //.............
    }

};

আমি কীভাবে আমার সতীর্থদের বোঝাতে পারি যে এটি খারাপ কোড?

আমি বিশ্বাস করি এটি একটি অপ্রয়োজনীয় জটিলতা। আপনার যদি ইতিমধ্যে যদি কোনও সদস্যের ভেরিয়েবলটি প্যারামিটার হিসাবে অ্যাক্সেস থাকে তবে কেন পাস করবেন? এটি encapsulation লঙ্ঘনও।

আপনি এই কোডটি দিয়ে অন্য কোনও সমস্যা দেখতে পাচ্ছেন?


21
কী খারাপ লাগছে মনে করে?
ইয়ানিস

@ ইয়ানিস রিজস, আপনি কি মনে করেন এটি ভাল? কমপক্ষে এটি অপ্রয়োজনীয় জটিলতা। আপনার যদি এর মধ্যে ইতিমধ্যে অ্যাক্সেস থাকে তবে কেন পদ্ধতি প্যারামিটার হিসাবে ভেরিয়েবল পাস করবেন? এটি পাশাপাশি encapsulation লঙ্ঘন।
টিকা

2
বৈধ পয়েন্ট, দয়া করে এগুলি অন্তর্ভুক্ত করার জন্য প্রশ্নটি সম্পাদনা করুন। আমরা আপনাকে আপনার দলের সঙ্গীদের বোঝাতে সাহায্য করতে পারি না, তবে আমরা কোডটি মূল্যায়নে সহায়তা করতে পারি, আপনার প্রশ্নটি এটাই হওয়া উচিত।
ইয়ানিস

8
আমি বরং এমন একটি পদ্ধতি করব যা ধ্রুবক 2 + 2 করে এমন পদ্ধতির চেয়ে বিভিন্ন ভেরিয়েবল যোগ করতে পারে the পদ্ধতির পরামিতিটি পুনরায় ব্যবহারযোগ্যতার জন্য।
দান্তে

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

উত্তর:


3

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

আমি একটি পদক্ষেপ পিছনে নেওয়ার পরামর্শ দিচ্ছি এবং পরামিতি হিসাবে সদস্য পাস করার ক্ষেত্রে ঠিক মনোনিবেশ করার পরিবর্তে স্পষ্টতা এবং পাঠযোগ্যতার বিষয়ে আপনার দলের সাথে আলোচনা শুরু করব। হয় আরও আনুষ্ঠানিকভাবে, বা কেবল হলওয়েতে, কিছু কোড বিভাগগুলি পড়া সহজ করে এবং অন্যান্য কোড বিভাগগুলিকে আরও কঠিন করে তোলে তা নিয়ে আলোচনা করুন। তারপরে গুণমানের ব্যবস্থা বা পরিষ্কার কোডের বৈশিষ্ট্যগুলি সনাক্ত করুন যা একটি দল হিসাবে আপনি চেষ্টা করতে চান। সর্বোপরি, সবুজ ক্ষেত্রের প্রকল্পগুলিতে কাজ করার পরেও আমরা 90% এর বেশি সময় পড়ার জন্য ব্যয় করি এবং কোডটি লেখা মাত্রই (আসুন 10-15 মিনিট পরে বলি) এটি রক্ষণাবেক্ষণে যায় যেখানে পাঠযোগ্যতা আরও গুরুত্বপূর্ণ।

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

আরও গোলাবারুদ এবং ধারণা জন্য, আমি চাচা বব এর পরিষ্কার কোড একটি অনুলিপি বাছাই সুপারিশ করব ।


রেফারেন্সযুক্ত বইয়ের প্রভাব দেখে অবহেলিত।
ফ্রাঙ্ক হিলিমান

যদিও আমার ছোট্ট অংশটি অত্যন্ত দুঃখের বিষয় যে উত্তরটি লেখার 5 বছর পরেও আপনি আমার কাছ থেকে মাত্র 2 টি ইন্টারনেট পয়েন্ট ছিনিয়ে নিয়েছেন, আমার আরও একটি ছোট্ট অংশ কৌতূহলযুক্ত রয়েছে যদি আপনি এমন কিছু উল্লেখ প্রদান করতে পারেন যা (সম্ভবতঃ খারাপ) ইঙ্গিত দেবে আমি উল্লেখ করেছি যে বইটি প্রভাবিত।
এটিকে

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

মস্তিষ্ক প্রক্রিয়াজাতকরণের চ্যালেঞ্জগুলি সম্পর্কে, জ্ঞানীয় লোডের
jxramos

30

আমি কোনও (ব্যক্তিগত) পদ্ধতিতে প্যারামিটার হিসাবে সদস্য ক্ষেত্রটি পাস করার ন্যায়সঙ্গততার কথা ভাবতে পারি: এটি আপনার পদ্ধতির উপর নির্ভর করে তা স্পষ্ট করে দেয়।

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

আমি জনসাধারণের পদ্ধতিগুলির জন্য একই যুক্তি করব না, কারণ কলার অবজেক্টের কোন অংশটি ফলাফল গণনা করার জন্য প্রাসঙ্গিক তা জানে না বা যত্ন করে না ...


2
বাকি অন্তর্নিহিত নির্ভরতা কি হবে? আমি আপনার উদাহরণ থেকে ধরে নিয়েছি যে _someFieldফলাফলটি গণনা করার জন্য কেবলমাত্র পরামিতি প্রয়োজন এবং আমরা এটি স্পষ্ট করে দিয়েছি। (দ্রষ্টব্য: এটি গুরুত্বপূর্ণ We আমরা কোনও নির্ভরতা যুক্ত করি নি , আমরা কেবল এটি স্পষ্ট করে দিয়েছি!)
Andres F.

11
-1 যদি উদাহরণস্বরূপ সদস্যদের সাথে কোনও অন্তর্নিহিত নির্ভরতা না থাকে, তবে এটি একটি স্থির সদস্য হওয়া উচিত যা প্যারামিটার হিসাবে মান গ্রহণ করে। এই উদাহরণস্বরূপ, যদিও আপনি একটি কারণ নিয়ে এসেছেন, আমি মনে করি এটি একটি বৈধ সমর্থনযোগ্যতা নয়। এটি খারাপ কোড।
স্টিভেন এভার্স

2
@ এসএনআরফাস আমি বাস্তবে ক্লাসের বাইরে পুরোপুরি পদ্ধতিটি পুনঃনির্ধারণের পরামর্শ দিয়েছিলাম
আন্দ্রেস এফ।

5
+1 টি। "... এর জন্য এই নির্ভরতা সুস্পষ্ট করা কি পরিষ্কার নয়?" Abso-freaking-loutely। এখানে কে বলবে "সাধারণ নিয়ম হিসাবে গ্লোবাল ভেরিয়েবলগুলি ভাল"? এটি তাই কোবোল -68। এখনই আমার কথা শুনুন এবং আমাকে বিশ্বাস করুন। আমাদের অ-তুচ্ছ কোডে আমি মাঝে মাঝে ক্লাস-গ্লোবাল ভেরিয়েবল ব্যবহার করা হয় সেখানে স্পষ্টভাবে বোঝাতে রিফ্যাক্টর করব। ক) বেসরকারীভাবে বেসরকারী ক্ষেত্রের ব্যবহার এবং এটি জনসাধারণের সম্পত্তি খ) "নির্ভরতাগুলি লুকিয়ে রেখে" ক্ষেত্রের রূপান্তরকে ঘৃণা করে আমরা বহু ক্ষেত্রে পোচটিকে ত্রুটিযুক্ত করেছি। এখন এটি 3-5 গভীর উত্তরাধিকার শৃঙ্খলে গুন করুন।
রাডারবব

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

28

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

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

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


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

@ ম্যাটনজ এমন কি উপায় আছে যে আপনি আদর্শ প্রোগ্রামিং সম্পর্কে হাওয়াতের গ্রন্থপঞ্জি বা তাঁর কোনও বইয়ের লিঙ্ক সরবরাহ করতে পারবেন? আমি ইন্টারনেটে ঘাটাঘাটি করছি এবং তার কিছুই খুঁজে পাচ্ছি না। গুগল এটিকে "কী" দিয়ে স্বতঃসংশোধনের চেষ্টা চালিয়ে যাচ্ছে।
বাটাল বাটকাস

8

যদি ফাংশনটিকে বিভিন্ন সময় বলা হয়, কখনও কখনও সেই সদস্যের পরিবর্তনশীলটি পাস করা হয় এবং কখনও কখনও অন্য কোনও কিছু পাস করা হয় তবে ঠিক আছে OK উদাহরণস্বরূপ, আমি এটিকে খারাপ বিবেচনা করব না:

if ( CalculateCharges(newStartDate) > CalculateCharges(m_StartDate) )
{
     //handle increase in charges
}

যেখানে newStartDateকিছু স্থানীয় পরিবর্তনশীল এবং m_StartDateএটি একটি সদস্য ভেরিয়েবল।

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


3
এটা কোন ব্যাপার না যে পদ্ধতি হয় সদস্য পরিবর্তনশীল ছাড়া অন্য পরামিতি সঙ্গে বলা হয়। কী গুরুত্বপূর্ণ তা এটিকে বলা যেতে পারে । আপনি সর্বদা জানেন না যে কোনও পদ্ধতি তৈরির সময় কীভাবে শেষ পর্যন্ত তাকে ডাকা হবে।
কালেব

হতে পারে আপনার "ifH" শর্তটি "needHandleIncreaseChages (newStartDate)" এর চেয়ে ভাল প্রতিস্থাপন করা উচিত এবং তারপরে আপনার যুক্তিটি আর ধরে না।
টারিয়ন

2

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


আপনি যা অনুপস্থিত তা হ'ল এই ব্যক্তিগত সদস্যের ভেরিয়েবলটির পাবলিক অ্যাক্সেসর রয়েছে।
টিকা

সুতরাং আপনি বলছেন যে সুরক্ষিত ভার্চুয়াল পদ্ধতিটি কোনও ব্যক্তিগত ভেরিয়েবলের পাবলিক অ্যাক্সেসরের উপর নির্ভরতা নেবে? এবং আপনার বর্তমান কোড নিয়ে সমস্যা আছে?
মাইকেল ব্রাউন

পাবলিক অ্যাক্সেসর ব্যবহার করার জন্য তৈরি করা হয়েছে। সময়কাল।
টিকা

1

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

invalidateRect(m_frame);

পুরো অঞ্চল পুনরায় আঁকার কারণ। উদাহরণস্বরূপ, এটি যখন ভিউ হায়ারার্কিতে প্রথম যুক্ত হয় তখন এটি এটি করতে পারে।

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

invalidateFrame();

আপনি যখন আরও সাধারণ ব্যবহার করতে পারেন তবে কেন এই জন্য একটি বিশেষ পদ্ধতি যুক্ত করবেন invalidateRect()? বা, আপনি যদি সরবরাহ করা বেছে নিয়ে থাকেন তবে আপনি invalidateFrame()সম্ভবত এটি আরও সাধারণ হিসাবে প্রয়োগ করতে পারেন invalidateRect():

View::invalidateFrame(void)
{
    invalidateRect(m_frame)
}

আপনার যদি এর মধ্যে ইতিমধ্যে অ্যাক্সেস থাকে তবে কেন পদ্ধতি প্যারামিটার হিসাবে ভেরিয়েবল পাস করবেন?

আপনি উচিত আপনার নিজের পদ্ধতি প্যারামিটার হিসাবে উদাহরণস্বরূপ ভেরিয়েবল পাস যদি পদ্ধতি যা উদাহরণস্বরূপ পরিবর্তনশীল উপর বিশেষভাবে কাজ করে না। উপরের উদাহরণে, ভিউটির ফ্রেমটি যতটা invalidateRect()পদ্ধতি সম্পর্কিত তেমনই অন্য একটি আয়তক্ষেত্র ।


1

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

আপনি প্রতিটি স্ট্রিংয়ের জন্য পৃথক বাস্তবায়ন কোডিং করতে চাইবেন না, পরিবর্তে স্ট্রিংটিকে একটি সাধারণ পদ্ধতিতে পাস করা অর্থপূর্ণ হয়ে উঠবে।

তবে পদ্ধতিটি যদি সর্বদা কোনও একক সদস্যের সাথে কাজ করে তবে প্যারামিটার হিসাবে এটি পাস করতে কিছুটা বোবা মনে হয়।


1

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

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

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


1

এটি সম্পর্কে চিন্তা করার সময় আমার কাছে কিছু জিনিস আসে:

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

0

প্যারামিটার ("যুক্তি") যদি রেফারেন্স হয় বা কেবল পঠন হয় তবে আপনি অনুপস্থিত।

class SomeClass
{
    protected SomeType _someField;
    public SomeType SomeField
    {
        get { return _someField; }

        set {
          if (doSomeValidation(value))
          {
            _someField = value;
          }
        }
    }

    protected virtual void ModifyMethod(/*...., */ ref SomeType someVar)
    { 
      // ...
    }    

    protected virtual void ReadMethod(/*...., */ SomeType someVar)
    { 
      // ...
    }

    private void SomeAnotherMethod()
    {
        //.............

        // not recommended, but, may be required in some cases
        ModifyMethod(ref this._someField);

        //.............

        // recommended, but, verbose
        SomeType SomeVar = this.someField;
        ModifyMethod(ref SomeVar);
        this.someField = SomeVar;

        //.............

        ReadMethod(this.someField);
        //.............
    }

};

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

মনে রাখবেন যে "সেটটারগুলি" অতিরিক্ত অ্যাসিস্ট্যান্ট নয়, এবং কখনও কখনও ভার্চুয়াল পদ্ধতিও হতে পারে, বা ভার্চুয়াল পদ্ধতিগুলি কল করে অতিরিক্ত পদ্ধতি থাকতে পারে।

দ্রষ্টব্য: আমি পরামর্শ দিচ্ছি যে সম্পত্তিগুলির অভ্যন্তরীণ ক্ষেত্রগুলি "সুরক্ষিত" হিসাবে রাখা উচিত।

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