কোনও ব্যক্তিগত পদ্ধতি যদি জনসাধারণকে কল করে তবে কি এটি কোডের গন্ধ?


25

একই বস্তুর উদাহরণের ব্যক্তিগত পদ্ধতিতে জনসাধারণকে কল করা কি কোডের গন্ধ?


AAMOI আপনার একটি নির্দিষ্ট উদাহরণ আছে?
ocodo

না, বর্তমানে নেই। সবেমাত্র একটি মামলার কথা মনে পড়ে গেল যা আমি আমার সহকর্মীদের সাথে আলোচনা করেছি। এখানেও কিছু মতামত পেতে চেয়েছিলেন।
আইমান্তাস

5
সাধারণত আমি প্রসঙ্গে একটি সংক্ষিপ্ত রূপটি বের করতে পারি, তবে এএএমওআই আমাকে অবশ্যই সন্ধান করতে হয়েছিল
কারসন মায়ার্স

@ কারসন - আপনি কি কিছু খুঁজে পেয়েছেন?
আইমান্তাস

4
আগ্রহের বিষয় হিসাবে
কারসন মায়ার্স

উত্তর:


32

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


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

19

কোড গন্ধ? হ্যাঁ, সত্যই খারাপ নয়, তবে একটি ভাল সূচক যে বর্গের অনেক বেশি দায়িত্ব থাকতে পারে।

এটিকে একটি চিহ্ন হিসাবে ধরুন যে ক্লাসটি বিভিন্ন অবজেক্টে বিভক্ত হওয়ার প্রয়োজন হতে পারে, ব্যক্তিগত পদ্ধতিগুলিতে অবশ্যই সত্য ওও ডিজাইনে একই বস্তুর পাবলিক পদ্ধতিগুলি কল করার দরকার নেই।

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

সমস্ত কোডের গন্ধ মতো, এটি আরও কোড পরিদর্শন, যৌক্তিক এবং সম্ভবত রিফ্যাক্টর জন্য প্রেরণা, তবে অ্যালার্মের কারণ নয়।


5
'অ্যালার্মের কারণ নয়' এর জন্য +1। অনেক সময় আমরা একটি 'গন্ধ' দেখতে পাই এবং তাত্ক্ষণিকভাবে চিন্তা না করে রিফেক্টর মোডে চলে যাই।
মাইকেল কে

এসআরপি জন্য +1। আমি কেবল এমন একটি মামলায় ছুঁড়েছি যেখানে সাজসজ্জার কাজ করছে না কারণ সজ্জিত শ্রেণি ডেকরেটারকে বাইপাস করে তার নিজস্ব পাবলিক ফাংশনটি ডেকেছিল। সমাধান: ক্লাসটিকে দুটি ভাঙ্গা করুন এবং সজ্জিত নির্ভরতা ইনজেকশন করুন।
জন হুল্কা

18

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


কেন? যদি ওভাররাইট করা জনসাধারণের পদ্ধতিটি অপ্রীতিকর আশ্চর্যের দিকে পরিচালিত করে তবে পদ্ধতিটি কে ডেকেছে তা কি সত্যই আসে যায় না?
ব্যবহারকারী 281377

4
হ্যাঁ এটা করে. যদি একটি জনসাধারণের পদ্ধতিকে ওভাররাইড করা অন্য জনসাধারণের পদ্ধতিটিকে ভেঙে দেয় তবে আমি সেই অন্যান্য পদ্ধতিটিকেও ওভাররাইড করতে পারি। যদি এটি একটি ব্যক্তিগত পদ্ধতি ভঙ্গ করে, আমি পারি ....?
কিম

5
একটি পাবলিক পদ্ধতির ওভাররাইডের ফলস্বরূপ একটি অপ্রীতিকর আশ্চর্য হ'ল নিজের মধ্যে একটি গন্ধ। একটি কোড দুর্গন্ধ, আসলে।
ল্যারি কোলেম্যান

কিম: যদি পদ্ধতিটি সর্বজনীন হয় তবে আপনাকে অবশ্যই ধরে নিতে হবে যে অন্যান্য শ্রেণিগুলিও সেই পদ্ধতিটিকে কল করে ...
ব্যবহারকারীর জন্য 13134

@ ল্যারি: হুবহু! একটি ব্যক্তিগত পদ্ধতি (যা সাধারণত প্রয়োগ-নির্দিষ্ট অনুমানগুলি ধারণ করে) একটি জনসাধারণকে ডেকে আনা এটির আরও বেশি সম্ভাবনা তৈরি করে যে জনসাধারণের পদ্ধতিটি ওভাররাইড করা জিনিসগুলিকে ভেঙে ফেলবে।
কিম

5

আমি মনে করি না আমরা জেনারালাইজ করতে পারি।

এটি সমস্ত প্রসঙ্গে খুব ভারী নির্ভর করে।

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


5

না, সে ক্ষেত্রে আর কী করা উচিত? বেসরকারী পদ্ধতিটি জনসাধারণকে বা জনসাধারণের পদ্ধতিটিকে বেসরকারী করবেন? পাবলিক পদ্ধতি থেকে কোডটি প্রাইভেটকে কোডটি কপি-পেস্ট করুন?


অথবা সরকারী পদ্ধতির কোনও (নতুন) বেসরকারী পদ্ধতিতে প্রতিনিধিত্ব করুন যা অন্য ব্যক্তিগত পদ্ধতি দ্বারা প্রেরণ করা হয়েছে। তবে, কেন বিরক্ত করবেন?
লরেন্স ডল

4

না , এখানে দুর্গন্ধ নেই।

যদি আমরা তালিকার সাথে একটি কাতারের ইন্টারফেস প্রয়োগ করি তবে সহজেই কিউটির বাস্তবায়ন অর্জনের জন্য সঠিক তালিকা কার্যকারিতাটি কল করা কি দুর্গন্ধযুক্ত?

যদি আপনার কিছু থাকে এবং আপনি এটিকে অন্য কিছুতে রূপান্তর করতে চান (যেমন মোড়কের মতো) তবে এটি কোনও দুর্গন্ধ নয়, এর কোডটি ফাংশন স্তরে অভিনয় করে নকশার প্যাটার্নের সাথে পুনরায় ব্যবহারের যোগ্যতা (কোনও ফাংশন কী কোনও বস্তু?)


2

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

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

  2. সর্বজনীন কল করার পরে আপনার যদি প্রয়োজন হয় যে আপনি অবজেক্টটি লক করে ফেলতে পারেন, যদি আপনি থ্রেডিং ব্যবহার করছেন তবে অভ্যন্তরীণভাবে, আপনি কোনও সার্বজনীন পদ্ধতিতে আবার কল করতে চাইবেন না।

  3. আমার মতে বিজ্ঞপ্তি ত্রুটি এবং অসীম লুপগুলি এবং স্মৃতি ব্যতিক্রমগুলি প্রবর্তনের আরও বেশি সম্ভাবনা।

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


1
বিদ্যমান পাবলিক পদ্ধতিটি যদি আরও অনেক শ্রেণি দ্বারা ডাকা হয় তবে কী হবে? এটিকে বেসরকারী করে তোলা হবে। মনে রাখবেন যে সার্বজনীন পদ্ধতিগুলি এই ক্লাসটি নয়, অন্যান্য কারণে অন্যান্য ক্লাস দ্বারা ডাকা হয়। কেন্ডা কেন জনসাধারণের পদ্ধতি বিদ্যমান।
মাইকেল ডুরান্ট

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

সুতরাং আপনি অন্য কোনও কারণ ছাড়াই অন্য পদ্ধতি যুক্ত করছেন - ভাল, কারণ আপনি এটিকে "কোড গন্ধ" হিসাবে ঘোষণা করেছেন। অর্থহীন পদ্ধতিতে আরও খারাপ কোড গন্ধ।
gnasher729

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

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

2

বিপরীতে কল্পনা করুন। আপনি একটি বেসরকারী পদ্ধতিতে রয়েছেন এবং আপনার একটি সার্বজনীন পদ্ধতিতে কার্যকারিতা প্রয়োজন যদি আপনি ব্যক্তিগত থেকে এই পাবলিক পদ্ধতিটি কল করতে না পারেন তবে কী হবে । আপনি কি করতে চান?

  • একটি সদৃশ বেসরকারী পদ্ধতি তৈরি? না
  • উপলক্ষের জন্য একটি বিশেষ পাবলিক পদ্ধতি তৈরি করবেন? না
  • একটি বিশেষ বেসরকারী পদ্ধতি কল করুন যা জনসাধারণের পদ্ধতিগুলিতে কল করতে পারে? না
  • কিছু সুপার এটি করতে পারেন যে? না

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


1

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

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

সুতরাং আপনার প্রশ্নের উত্তর দেওয়ার জন্য, আপনি যদি এটি সঠিকভাবে ব্যবহার করেন তবে এটি অবশ্যই খারাপ কোড নয়।


1

আপনার নিজের কাছে প্রশ্নটি জিজ্ঞাসা করা দরকার কেন আপনার ক্লাসটির ক্লায়েন্টগুলির ক্লায়েন্টগুলির সমান প্রয়োজন কেন? সাধারণত একটি ক্লাসের ক্লায়েন্টদের থেকে খুব আলাদা প্রয়োজন হয়। হ্যাঁ, এটি আপনার কাছে একটি ইঙ্গিত দেয়

(ক) প্রকাশ্যে এমন কিছু প্রকাশ করা যা ব্যক্তিগত হওয়া উচিত; অথবা

(খ) শ্রেণীর আচরণ যথেষ্ট সংকীর্ণ নয় (একক দায়িত্বের নীতিটি ভাবেন)।

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