কোডকে প্রসারিত করা খুব বেশি বিমূর্ততা


9

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

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


10
নিরক্ষর করতে একটি কোড নমুনা যুক্ত করুন "" সমস্যা "" পরিস্থিতি আরও অনেক কিছু বুঝতে সাহায্য করবে
Seabizkit

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

আমি সন্দেহ করি যে পদ্ধতিটি বেশ দীর্ঘ এবং এটি একাধিক জিনিস করে। এটাই কি?
Rad80

উত্তর:


27

আমি বি কে অন্যভাবে পরিচালনা করার জন্য যদি একটি নতুন পদ্ধতি তৈরি করার চেষ্টা করি তবে এটি কোড নকলের জন্য ডেকে আনে।

সমস্ত কোড সদৃশ সমান তৈরি হয় না।

বলুন আপনার কাছে এমন একটি পদ্ধতি রয়েছে যা দুটি পরামিতি নেয় এবং এগুলিকে একসাথে ডাকা হয় total()। বলুন আপনার আরেকজন ফোন করেছেন add()। তাদের বাস্তবায়ন সম্পূর্ণ অভিন্ন দেখায়। এগুলি কি এক পদ্ধতিতে একীভূত করা উচিত? কোন !!!

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

ডিআরওয়াই (নিজেকে পুনরাবৃত্তি করবেন না) নীতিতে বলা হয়েছে:

জ্ঞানের প্রতিটি অংশের অবশ্যই একটি সিস্টেমের মধ্যে একক, দ্ব্যর্থহীন, অনুমোদনমূলক প্রতিনিধিত্ব থাকতে হবে।

wiki.c2.com - নিজেকে পুনরাবৃত্তি করবেন না

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

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

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

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

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

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

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

না, আপনি যে সমস্যার মুখোমুখি হয়েছেন বলে মনে করছেন তা হ'ল খারাপ বিমূর্ততা। আপনার প্রয়োজনের চেয়ে আলাদা উদ্দেশ্যে পরিবেশন তৈরি করা হয়েছে। জটিল বস্তুগুলির জন্য আপনার সাধারণ ইন্টারফেসের প্রয়োজন যা আপনাকে অনুরোধ করতে দেয় যে needs অবজেক্টগুলি কখনও না বুঝে আপনার চাহিদা পূরণ হবে।

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

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

এটি কীভাবে ব্যবহার করতে হয় তা বুঝতে আমাকে যদি কোনও বিমূর্তির ভিতরে দেখতে হয় তবে বিমূর্তিটি ব্যর্থ হয়েছে। এটি কীভাবে কাজ করে তা আমার জানা উচিত নয়। এটি যে কাজ করে। এটির একটি ভাল নাম দিন এবং আমি যদি ভিতরে দেখতে চাই তবে যা খুজে পেয়েছি তাতে অবাক হওয়া উচিত নয়। কীভাবে এটি ব্যবহার করবেন তা মনে রাখার জন্য আমাকে ভিতরে তাকাতে রাখবেন না।

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

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

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


আমি আন্তরিকভাবে একমত। শুকনো তিন শব্দ-catchphrase নিজেকে পুনরাবৃত্তি না, যেটা ঘুরে ফিরে একটি 14 পৃষ্ঠা নিবন্ধ জন্য একটি তিন অক্ষর-আদ্যক্ষরা উইকি । আপনি যদি সমস্ত কিছু 14 পৃষ্ঠার নিবন্ধটি না পড়ে এবং না বুঝে অন্ধভাবে এই তিনটি অক্ষরকে নষ্ট করে দিচ্ছেন তবে আপনি সমস্যার মধ্যে পড়ে যাবেন । এটি ওয়ান ও ওনল ওনস ওনস (ওএইওও) এর সাথে আরও ঘনিষ্ঠভাবে সম্পর্কিত এবং সিঙ্গেল পয়েন্ট অফ ট্রুথ (এসপট) / সত্যের একক উত্স (এসএসওটি) এর সাথে আরও আলগাভাবে সম্পর্কিত ।
Jörg ডব্লু মিটাগ

"তাদের বাস্তবায়ন সম্পূর্ণ অভিন্ন দেখায় they সেগুলি কি কোনও পদ্ধতিতে একীভূত করা উচিত? না !!!" - কথোপকথনটিও সত্য: কেবলমাত্র দুটি টুকরো কোড আলাদা হওয়ার অর্থ এই নয় যে সেগুলি সদৃশ নয়। ওএইউইউ উইকির পৃষ্ঠায় রন জেফরিসের একটি দুর্দান্ত উক্তি রয়েছে : "আমি একবার বেককে দেখতে পেয়েছিলাম যে প্রায় সম্পূর্ণ ভিন্ন কোডের দুটি প্যাচকে" সদৃশ "বলে ঘোষণা করা হয়েছে, সেগুলি পরিবর্তন করুন যাতে তারা নকল করেছিলেন এবং তারপরে নতুন সন্নিবেশকৃত অনুলিপিটি সরিয়ে ফেলুন স্পষ্টতই আরও ভাল কিছু সঙ্গে। "
Jörg ডব্লু মিটাগ

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

নিজেকে পুনরাবৃত্তি না করার বিষয়ে 14 পৃষ্ঠার একটি নিবন্ধটি কল্পনা করতে হবে যে এটি নিজেকে অনেক বার পুনরায় বলবে।
চক অ্যাডামস

7

সাধারণ কথাটি যা আমরা সকলেই এখানে পড়ি এবং তা এখানে রয়েছে:

বিমূর্তনের আরও একটি স্তর যুক্ত করে সমস্ত সমস্যার সমাধান করা যেতে পারে।

ঠিক আছে, এটা সত্য নয়! আপনার উদাহরণ এটি দেখায়। অতএব আমি সামান্য পরিবর্তিত বিবৃতিটি প্রস্তাব করবো (পুনরায় ব্যবহারের জন্য নির্দ্বিধায় ;-)):

বিমূর্ততার সঠিক স্তরের ব্যবহার করে প্রতিটি সমস্যা সমাধান করা যেতে পারে।

আপনার ক্ষেত্রে দুটি ভিন্ন সমস্যা রয়েছে:

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

উভয়ই কোর্টলেটেড:

  • আপনি যদি এমন কোনও পদ্ধতি বিমূর্ত করেন যেখানে প্রতিটি বিশেষীকরণ এটি আলাদাভাবে করে, সমস্ত কিছু ঠিক আছে। কারও বুঝতে সমস্যা হয় Shapeনা যে একটি surface()এটি একটি বিশেষ উপায়ে গণনা করতে পারে ।
  • আপনি যদি এমন কিছু অপারেশন বিমূর্ত করেন যেখানে সাধারণ সাধারণ আচরণের ধরণ থাকে তবে আপনার দুটি পছন্দ আছে:

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

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

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


5

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

public void sort(List values) {
    if (values instanceof LinkedList) {
        // do efficient linked list sort
    } else { // ArrayList
        // do efficient array list sort
    }
}

আমি এটি করব:

values.sort();

// ...

class ArrayList {
    public void sort() {
        // do efficient array list sort
    }
}

class LinkedList {
    public void sort() {
        // do efficient linked list sort
    }
}

আমরা আচরণটি সেই জায়গায় স্থানান্তর করি যা জানে কখন এটি ব্যবহার করতে হয়। আমরা একটি বাস্তব বিমূর্ততা তৈরি করি যেখানে আপনাকে প্রয়োগের ধরণ বা বিশদ জানার দরকার নেই। আপনার পরিস্থিতির জন্য, এই পদ্ধতিটি Oটাইপ করে টাইপ করে Aওভাররাইড করতে মূল ক্লাসটি (যা আমি ডাকব ) থেকে এই পদ্ধতিটি সরিয়ে নেওয়া আরও বুদ্ধিমান হতে পারে B। পদ্ধতি বলা হয় তাহলে doItকিছু বস্তুর উপর সরানো doItথেকে Aবিভিন্ন আচরণ সঙ্গে এবং ওভাররাইড BdoItমূলত যেখানে বলা হয় সেখান থেকে যদি ডেটা বিট থাকে বা পদ্ধতিটি যথেষ্ট জায়গায় ব্যবহার করা হয় তবে আপনি মূল পদ্ধতিটি ছেড়ে দিয়ে প্রতিনিধি দিতে পারেন:

class O {
    int x;
    int y;

    public void doIt(A a) {
        a.doIt(this.x, this.y);
    }
}

যদিও আমরা কিছুটা গভীর ডুব দিতে পারি। এর পরিবর্তে বুলিয়ান প্যারামিটারটি ব্যবহার করার পরামর্শটি দেখুন এবং আমরা দেখুন যে আপনার সহকর্মী কীভাবে ভাবছেন সে সম্পর্কে আমরা কী শিখতে পারি। তাঁর প্রস্তাবটি হ'ল:

public void doIt(A a, boolean isTypeB) {
    if (isTypeB) {
        // do B stuff
    } else { 
        // do A stuff
    }
}

এটি instanceofআমার প্রথম উদাহরণে আমি যেমন ব্যবহার করেছি এর মতো একটি ভয়াবহ দেখাচ্ছে , আমরা সেই চেকটিকে বহিরাগত করছি। এর অর্থ হ'ল আমাদের এটি দুটি উপায়ে একটিতে কল করতে হবে:

o.doIt(a, a instanceof B);

বা:

o.doIt(a, true); //or false

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

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

Aএবং এর মধ্যে সম্পর্কের দিকে আমাদের আরও নিবিড়ভাবে নজর দেওয়া দরকার B। সাধারণত, আমাদের বলা হয় যে উত্তরাধিকারের তুলনায় আমাদের রচনাটির পক্ষে হওয়া উচিত । এটি প্রতিটি ক্ষেত্রেই সত্য নয়, তবে একবার খনন করার পরে অবাক করা সংখ্যক ক্ষেত্রে এটি সত্য Binher উত্তরাধিকার সূত্রে প্রাপ্ত A, যার অর্থ আমরা বিশ্বাস করি Bএটি একটি A। এটি কিছুটা ভিন্নভাবে কাজ করে, Bঠিক Aতেমন ব্যবহার করা উচিত । কিন্তু এই পার্থক্য কি? আমরা কি পার্থক্যগুলিকে আরও দৃ concrete় নাম দিতে পারি? এটি কি Bএকটি নয় A, তবে সত্যিই Aএটি Xহতে পারে A'বা হতে পারে B'? আমরা যদি তা করি তবে আমাদের কোডটি কেমন হবে?

আমরা সম্মুখের দিকে পদ্ধতি সরানো তাহলে Aযেমন তার আগে প্রস্তাবিত, আমরা একটি দৃষ্টান্ত উদ্বুদ্ধ পারে Xমধ্যে A, এবং যে পদ্ধতি প্রতিনিধি X:

class A {
    X x;
    A(X x) {
        this.x = x;
    }

    public void doIt(int x, int y) {
        x.doIt(x, y);
    }
}

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

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

B b = new B();
o.doIt(b, true);

আমরা ধরে নিয়েছিলাম যখন এটি রচনা করার সময় Aএর একটি Xহয় A'বা হয় B'। তবে এমনকি এই অনুমানটিও সঠিক নয়। এই একমাত্র স্থান যেখানে এই পার্থক্য Aএবং Bবিষয়গুলির মধ্যে পার্থক্য রয়েছে ? যদি এটি হয়, তবে সম্ভবত আমরা কিছুটা ভিন্ন পদ্ধতির গ্রহণ করতে পারি। আমাদের এখনও একটি আছে Xযা হয় A'বা হয় B'তবে এটি এর সাথে সম্পর্কিত নয় A। কেবল O.doItএটির জন্য যত্নশীল, সুতরাং আসুন কেবল এটির কাছে প্রেরণ করুন O.doIt:

class O {
    int x;
    int y;

    public void doIt(A a, X x) {
        x.doIt(a, x, y);
    }
}

এখন আমাদের কল সাইটটি দেখে মনে হচ্ছে:

A a = new A();
o.doIt(a, new B'());

আবার, Bঅদৃশ্য হয়ে যায় এবং বিমূর্তি আরও বেশি কেন্দ্রীভূত হয় X। এবার যদিও Aকম জেনেও সরল। এটি এমনকি কম বিমূর্ত।

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


1
এটি আমাকে আঘাত করে যে আপনি এখানে যে "খারাপ" কোডটি দিচ্ছেন তা আমি কোনও OO ভাষায় কী করতে চাইবে তার অনুরূপ। আমি ভাবছি যে তারা যদি ভুল পাঠ শিখেছে এবং তাদের কোডের মতো ওও বিশ্বে এনেছে?
বাল্ড্রিক

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

1
এটা সঠিক উত্তর. যে পদ্ধতিতে এটি পরিচালিত হয় তার উপর ভিত্তি করে বাস্তবায়ন পরিবর্তন করে এমন একটি পদ্ধতি সেই ধরণের একটি পদ্ধতি হওয়া উচিত।
রোমান রেইনার

0

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

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

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

এই এক্সটেনডিবিলিটি এক্সটেনডেবল অবজেক্ট বেস ক্লাসে এক্সটেনশন ধারণ করে কাজ করে:

void f(CreditorBO creditor) {
    creditor.as(AllowedCreditorBO.class).ifPresent(allowedCreditor -> ...);
}

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

আংশিকভাবে উত্তরাধিকার সহ জিইউআই ক্লাস এবং উপাদানগুলির জন্য একই প্রসারিতা ibility বোতাম এবং এই জাতীয় যুক্ত করা হচ্ছে।

আপনার ক্ষেত্রে একটি বৈধতা এটি প্রসারিত কিনা এবং এক্সটেনশনের বিরুদ্ধে নিজেকে বৈধতা দেওয়া উচিত look কেবল একটি মামলার জন্য এক্সটেনশন পয়েন্টগুলি উপস্থাপন করা থেকে বোঝা যায় না এমন কোড যুক্ত করুন, ভাল নয়।

সুতরাং বর্তমান প্রসঙ্গে কাজ করার চেষ্টা করা ছাড়া কোনও সমাধান নেই।


0

'লুকানো প্রবাহ নিয়ন্ত্রণ' আমার কাছে খুব বেশি বাহিত বলে মনে হচ্ছে।
প্রসঙ্গের বাইরে নেওয়া কোনও নির্মাণ বা উপাদানগুলির বৈশিষ্ট্যটি থাকতে পারে।

বিমূর্ততা ভাল। আমি তাদের দুটি নির্দেশিকা দ্বারা মেজাজ:

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

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

উভয় ক্ষেত্রে 'বেশি এবং' অনেকগুলি 'নির্দিষ্ট সংখ্যা নয়। এটা নির্ভর করে. এটাই তা শক্ত করে তোলে।

আমি এই লেখার আপটি স্যান্ডি মেটজ থেকেও পছন্দ করি

https://www.sandimetz.com/blog/2016/1/20/the-wrong-abstraction

সদৃশ ভুল বিমূর্ততা
এবং তুলনায় সস্তা
ভুল বিমূর্ততা উপর অনুলিপি পছন্দ

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