সাবক্লাসিং কেন খুব বেশি খারাপ হয় (এবং সেজন্য আমরা কেন প্রোটোটাইপ ব্যবহার করব)?


10

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

সাবক্লাসিং খারাপ কেন? প্রোটোটাইপ ব্যবহার করে উপক্লাসিংয়ের ওপরে কী সুবিধা হবে?


বল কে ? আপনার কি লিংক আছে ?
ক্যামাস

আমি এই বইয়ের p.118 পড়ছিলাম। goo.gl/6JGw1
ডেভিড ফক্স

উত্তর:


19

সাবক্লাসিং কেন খুব খারাপ

"খুব বেশি" একটি রায় আহ্বান; তবে আমার কাছ থেকে নেও এটা খারাপ। আমি যে কোডটি দিয়ে কাজ করি তার ডিইপিইপি উত্তরাধিকার রয়েছে এবং কোডটি পড়তে, বুঝতে, অনুসরণ করতে, ট্রেস করা, ডিবাগ করা ইত্যাদি খুব জঘন্য etc.

প্রোটোটাইপ প্যাটার্ন সাবক্লাসিংয়ের সাথে দূরে থাকে

বা প্রশ্নের অর্থ কি "খুব বেশি সাবক্লাসিং দিয়ে দূরে রয়েছে?"। এই প্যাটার্নটি কমপক্ষে সেই সময়ে সাবক্লাসিং এড়াতে একটি "টেমপ্লেট" অবজেক্টকে ক্লোনিং করার জন্য কল করে। "টেমপ্লেট" সাবক্লাস হতে পারে না বলে কোনও নিয়ম নেই।

উত্তরাধিকারের উপর পছন্দসই রচনা

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

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

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

পার্শ্ব প্রতিক্রিয়া এবং অনিশ্চয়তার সাথে পরিবর্তনগুলি আসে - ভাল বা খারাপের জন্য ক্লাসটি আরও "বেস" তত বেশি প্রভাব ফেলবে widespread পার্শ্ব প্রতিক্রিয়া অনিশ্চয়তার কারণে আপনার পছন্দসই পরিবর্তন হতে পারে না। বা আমাদের উত্তরাধিকার শৃঙ্খলে কিছু স্থানের জন্য ভাল এমন পরিবর্তন অন্যটির পক্ষে খারাপ। এটি অবশ্যই আমার অভিজ্ঞতা।


উত্তরাধিকার পরীক্ষা করার সময় (বিশেষত বিদ্রূপ করা) কঠিন করে তোলে এবং এতে রচনা কীভাবে সহায়তা করে তার কয়েকটি উদাহরণ দেখতে আমি আগ্রহী হব।
আরমান্ড

@ অ্যালিসন: উত্পন্ন শ্রেণীর একটি পদ্ধতি যা বেস ক্লাস থেকে অন্য পদ্ধতি ব্যবহার করে যেখানে বেস শ্রেণিতে প্রয়োগের ফলে ত্রুটির পরিস্থিতি পরীক্ষা করা কার্যত অসম্ভব হয়ে পড়ে। যদি এই রচনাটি তৈরি করা হত তবে কোনও বস্তু ইনজেকশন করা সহজ হয়েছিল যার ফলে ত্রুটি দেখা দেয়
Rune FS

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

8

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

আমি এ সম্পর্কে অজ্ঞেয়বাদী। এটাকে খারাপ বলা ঠিক মনে হচ্ছে না। অপব্যবহার করলে যে কোনও কিছু খারাপ হয়।


2

দুটি কারণ।

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

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


6
-1: আপনি ঠিক # 2 সম্পর্কে ঠিক বলেছেন; তবে প্রায় # 1 নয়। উত্তরাধিকারের কয়েকটি স্তর অগত্যা রানটাইম কর্মক্ষমতাকে প্রভাবিত করে না ।
জিম জি

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

@JimG। এটি নাও পারে, তবে তা পারে। :) উদ্বেগের জন্য মেমরির ব্যবহারেরও সম্ভাব্য সম্ভাবনা রয়েছে: আপনি যদি বেসের সমস্ত ভেরিয়েবলগুলি পুনরায় ব্যবহার না করেন তবে তারা এখনও অবজেক্টটি তৈরির অংশ হিসাবে বরাদ্দ পেতে পারে।
অ্যাডাম শিখুন

2

"খুব বেশি" একটি রায় আহ্বান।

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

এটি বলেছে যে উত্তরাধিকারের তুলনায় রচনাকে সমর্থন করা থাম্বের একটি ভাল নিয়ম।

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

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

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

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


2

উত্তরাধিকার কিছু ক্ষেত্রে এনক্যাপসুলেশন ভেঙে ফেলতে পারে এবং যদি তা ঘটে তবে তা খারাপ। আরও পড়ুন।


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

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

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

মূলত যদিও এটি সর্বদা ক্ষেত্রে নাও হতে পারে তবে,

এনক্যাপসুলেশন ভাঙতে উত্তরাধিকারের অপব্যবহার করা সহজ

সাবক্লাসিং মঞ্জুরি দেওয়া যদি সেই বিন্দুতে ভুল হতে পারে।


1

সংক্ষিপ্ত দ্রুত উত্তর:

এটি আপনি কী করছেন তার উপর নির্ভর করে।

বর্ধিত বোরিং উত্তর:

একজন বিকাশকারী একটি অ্যাপ্লিকেশন তৈরি করতে পারেন। হয়, সাবক্লাসিং বা (প্রোটোটাইপাল) টেম্পলেট ব্যবহার করে। কখনও কখনও একটি কৌশল আরও ভাল কাজ করে। কখনও কখনও অন্য টেকিনেক আরও ভাল কাজ করে।

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

পরিপূরক নোট:

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

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