শ্রেণীর সদস্যদের পছন্দ করবেন বা অভ্যন্তরীণ পদ্ধতির মধ্যে তর্কগুলি পাস করবেন?


39

ধরুন কোনও শ্রেণীর ব্যক্তিগত অংশের মধ্যে একটি মান রয়েছে যা একাধিক ব্যক্তিগত পদ্ধতি দ্বারা ব্যবহৃত হয়। লোকেরা কি ক্লাসের জন্য সদস্য ভেরিয়েবল হিসাবে এটি সংজ্ঞায়িত করা বা প্রতিটি পদ্ধতির যুক্তিরূপে এটি পাস করা পছন্দ করে - এবং কেন?

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

সম্পাদনা:

উত্থাপিত কিছু মন্তব্য / প্রশ্নগুলির স্পষ্টতা জানাতে, আমি ধ্রুবকদের বিষয়ে কথা বলছি না এবং এটি কোনও বিশেষ মামলার সাথে সম্পর্কিত নয়, বরং এটি কেবল একটি অনুমানমূলক যা আমি অন্য কয়েকজনের সাথে কথা বলছিলাম।

এক মুহুর্তের জন্য ওওপি কোণটিকে উপেক্ষা করে, বিশেষভাবে ব্যবহারের ক্ষেত্রে যে বিষয়টি আমার মনে ছিল তা হ'ল নিম্নলিখিতটি (কেবল সিউডোকোড ক্লিনার করার জন্য রেফারেন্স দিয়ে পাস অনুমান করুন)

int x
doSomething(x)
doAnotherThing(x)
doYetAnotherThing(x)
doSomethingElse(x)

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


1
এই মানটি কীভাবে ব্যবহৃত হয়? এটা কি ধ্রুব? এটা কি পরিবর্তন হয়? এটি কি সংকলনের মধ্যে পরিবর্তন সাপেক্ষে?
ওপড

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

উত্তর:


15

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

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


1
আমি সম্মত - ক্লাসের মূল নকশা / উদ্দেশ্যটি আপনাকে বলা উচিত এটি সদস্য পরিবর্তনশীল বা যুক্তি হওয়া উচিত। নির্ভরতা ইনজেকশন কোণ সম্পর্কে চিন্তা করাও মূল্যবান।
মার্টিজন ভার্গবার্গ

14

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

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


10

প্রশ্ন জিজ্ঞাসা করার জন্য ধন্যবাদ, আমি এই জিজ্ঞাসা করতে চেয়েছিলেন।

যখন আমি এই সম্পর্কে ভাবছিলাম, এটি যুক্তি হিসাবে কেন পাস করার কিছু সুবিধা রয়েছে

  • এটি পরীক্ষা করা সহজ -> বজায় রাখা সহজ (শেষ পয়েন্ট সম্পর্কিত)
  • এর কোনও পার্শ্ব প্রতিক্রিয়া নেই
  • এটা বুঝতে সহজ

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

আমি বলব এই অ্যান্টি-প্যাটার্নটির কোনও নাম থাকা উচিত, তাই না? ( এখানে তালিকাভুক্ত নয় )


কোনটি অ্যান্টি-প্যাটার্ন বলতে চান?
ওয়াহিদ গাদিরি

সংক্ষেপে, কেবল দুটি (বা আরও) ফাংশন কলগুলির মধ্যে প্যারামিটার ভাগ করে নেওয়ার জন্য সদস্যের ভেরিয়েবল রাখতে ...
বেটলিস্ট

1

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

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


1

লোকেরা কি ক্লাসের জন্য সদস্য ভেরিয়েবল হিসাবে এটি সংজ্ঞায়িত করা বা প্রতিটি পদ্ধতির যুক্তিরূপে এটি পাস করা পছন্দ করে - এবং কেন?

যদি আমি বুঝতে পারি যে আপনি কী জিজ্ঞাসা করছেন: একটি শ্রেণিতে পদ্ধতিগুলি বাস্তবায়নের বিশদটি সংজ্ঞায়িত হয়, সুতরাং কোনও পদ্ধতি থেকে সরাসরি কোনও সদস্যকে ব্যবহার করার বিষয়ে আমার কোনও মান নেই।

একদিকে আমি একটি যুক্তি দেখতে পেলাম যে একটি শ্রেণিতে রাষ্ট্রের (অর্থাত্ সদস্য ভেরিয়েবল) হ্রাস করা সাধারণত একটি ভাল জিনিস ...

private static finalধ্রুবককে সংজ্ঞায়িত করার জন্য ঘোষিত করার ক্ষেত্রে কোনও ভুল নেই । সংকলক কিছু অপ্টিমাইজেশন বিবেচনা করে মানটি ব্যবহার করতে সক্ষম হবে এবং ধ্রুবক হওয়ার কারণে তারা সত্যই শ্রেণিতে রাষ্ট্র যুক্ত করে না।

যদিও একই মানটি যদি ক্লাসের সমস্ত পদ্ধতিতে বারবার ব্যবহৃত হয় ...

এটি প্রতীকীভাবে উল্লেখ করতে সক্ষম হওয়া (যেমন, BLRFL_DURATION) এবং আপনার পদ্ধতিগুলিতে অতিরিক্ত যুক্তি যুক্ত না করা আপনার কোডটিকে আরও পঠনযোগ্য এবং তাই আরও রক্ষণাবেক্ষণযোগ্য করে তুলবে।


0

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

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