আমি ডিজাইনের ধরণগুলি পড়ছিলাম এবং আমি পড়েছিলাম যে প্রোটোটাইপ ডিজাইনের ধরণটি অতিরিক্ত সাবক্লাসিংয়ের সাথে দূরে থাকে।
সাবক্লাসিং খারাপ কেন? প্রোটোটাইপ ব্যবহার করে উপক্লাসিংয়ের ওপরে কী সুবিধা হবে?
আমি ডিজাইনের ধরণগুলি পড়ছিলাম এবং আমি পড়েছিলাম যে প্রোটোটাইপ ডিজাইনের ধরণটি অতিরিক্ত সাবক্লাসিংয়ের সাথে দূরে থাকে।
সাবক্লাসিং খারাপ কেন? প্রোটোটাইপ ব্যবহার করে উপক্লাসিংয়ের ওপরে কী সুবিধা হবে?
উত্তর:
সাবক্লাসিং কেন খুব খারাপ
"খুব বেশি" একটি রায় আহ্বান; তবে আমার কাছ থেকে নেও এটা খারাপ। আমি যে কোডটি দিয়ে কাজ করি তার ডিইপিইপি উত্তরাধিকার রয়েছে এবং কোডটি পড়তে, বুঝতে, অনুসরণ করতে, ট্রেস করা, ডিবাগ করা ইত্যাদি খুব জঘন্য etc.
প্রোটোটাইপ প্যাটার্ন সাবক্লাসিংয়ের সাথে দূরে থাকে
বা প্রশ্নের অর্থ কি "খুব বেশি সাবক্লাসিং দিয়ে দূরে রয়েছে?"। এই প্যাটার্নটি কমপক্ষে সেই সময়ে সাবক্লাসিং এড়াতে একটি "টেমপ্লেট" অবজেক্টকে ক্লোনিং করার জন্য কল করে। "টেমপ্লেট" সাবক্লাস হতে পারে না বলে কোনও নিয়ম নেই।
উত্তরাধিকারের উপর পছন্দসই রচনা
এখানে এই ধারণার মধ্যে প্রতিনিধি এবং সমষ্টিও অন্তর্ভুক্ত রয়েছে। এই হিউরিস্টিক অনুসরণ করে আপনার সফ্টওয়্যারটি আরও নমনীয়, বজায় রাখা সহজ, প্রসারিত এবং পুনঃব্যবহারের দিকে ঝোঁক।
যখন কোনও শ্রেণি অংশগুলির সমন্বয়ে গঠিত হয় আপনি রানটাইমে সেই অংশগুলি প্রতিস্থাপন করতে পারেন । এটি পরীক্ষার উপর গভীর প্রভাব ফেলে।
পরীক্ষা সহজ । আপনি জাল অংশ (যেমন "মকস", "ডাবলস" এবং অন্যান্য টেস্টিং-টক) ব্যবহার করতে পারেন। আমাদের কোডের গভীর উত্তরাধিকারের অর্থ এটির যে কোনও বিট পরীক্ষা করার জন্য আমাদের অবশ্যই পুরো হায়ারার্কি ইনস্ট্যান্ট করতে হবে। আমাদের ক্ষেত্রে এটি কোডটি আসল পরিবেশে চালানো ছাড়া সম্ভব নয়। উদাহরণস্বরূপ ব্যবসায়ের অবজেক্টগুলি ইনস্ট্যান্ট করার জন্য আমাদের একটি ডাটাবেস প্রয়োজন।
পার্শ্ব প্রতিক্রিয়া এবং অনিশ্চয়তার সাথে পরিবর্তনগুলি আসে - ভাল বা খারাপের জন্য ক্লাসটি আরও "বেস" তত বেশি প্রভাব ফেলবে widespread পার্শ্ব প্রতিক্রিয়া অনিশ্চয়তার কারণে আপনার পছন্দসই পরিবর্তন হতে পারে না। বা আমাদের উত্তরাধিকার শৃঙ্খলে কিছু স্থানের জন্য ভাল এমন পরিবর্তন অন্যটির পক্ষে খারাপ। এটি অবশ্যই আমার অভিজ্ঞতা।
আমি মনে করি এটির একটি খারাপ অভ্যাস হিসাবে দেখা হওয়ার কারণগুলির মধ্যে একটি হ'ল সময়ের সাথে সাথে প্রতিটি উপক্লাসে এমন বৈশিষ্ট্য এবং পদ্ধতি থাকতে পারে যা সেই অবজেক্টটির জন্য কোনও ধারণা রাখে না যতগুলি আপনি আরও শৃঙ্খলে নিচে চলে যান (একটি দুর্বল বিকশিত শ্রেণিবদ্ধে)। আপনি একটি ফুলে যাওয়া শ্রেণীর সাথে শেষ করতে পারেন যাতে এমন আইটেম রয়েছে যা সেই শ্রেণীর জন্য কোনও অর্থ দেয় না।
আমি এ সম্পর্কে অজ্ঞেয়বাদী। এটাকে খারাপ বলা ঠিক মনে হচ্ছে না। অপব্যবহার করলে যে কোনও কিছু খারাপ হয়।
দুটি কারণ।
রানটাইম পারফরম্যান্স হয়। প্রতিবার আপনি যখন একটি সুপারক্লাস থেকে সাবক্লাসের জন্য আবেদন করেন তখন আপনি একটি মেথড কল করছেন তাই আপনি যদি পাঁচটি ক্লাস নেস্ট করে থাকেন এবং বেস ক্লাসে কোনও পদ্ধতির আবেদন করেন তবে আপনি পাঁচটি পদ্ধতিতে অনুরোধ করবেন। বেশিরভাগ সংকলক / রানটাইম এটিকে স্বীকৃতি দেওয়ার এবং অতিরিক্ত কলগুলি দূরে সরিয়ে নেওয়ার চেষ্টা করবে তবে খুব সাধারণ ক্ষেত্রে এটি করা কেবল নিরাপদ।
আপনার সহকর্মী প্রোগ্রামারদের সন্তুষ্টি হয়। আপনি যদি পাঁচটি ক্লাসে বাসা বেঁধে থাকেন তবে আমাকে চারটি প্যারেন্ট ক্লাস পরীক্ষা করতে হবে যাতে আপনি সত্যিই বেস ক্লাসে কোনও পদ্ধতি কল করছেন, এটি ক্লান্তিকর হয়ে ওঠে। আমি প্রোগ্রামটি ডিবাগ করার সময় আমাকে পাঁচটি পদ্ধতিতে অনুরোধ জানাতে হবে।
"খুব বেশি" একটি রায় আহ্বান।
প্রোগ্রামিংয়ের বেশিরভাগ জিনিসের মতোই, সাব-ক্লাসিংটি বুদ্ধিমান হয়ে উঠলে অন্তর্নিহিত খারাপ হয় না । যখন আপনার সমস্যার সমাধানের মডেল অংশগুলির সংমিশ্রণের পরিবর্তে শ্রেণিবিন্যাস হিসাবে আরও বোধগম্য হয়, সাবক্লাসিং পছন্দসই বিকল্প হতে পারে।
এটি বলেছে যে উত্তরাধিকারের তুলনায় রচনাকে সমর্থন করা থাম্বের একটি ভাল নিয়ম।
আপনি যখন সাবক্লাস করেন, পরীক্ষা আরও কঠিন হতে পারে (যেমন রেডারবব উল্লেখ করেছেন )। একটি গভীর শ্রেণিবিন্যাসের মধ্যে, সমস্যাযুক্ত কোডকে বিচ্ছিন্ন করা আরও কঠিন কারণ একটি সাবক্লাসটি ইনস্ট্যান্ট করার জন্য পুরো সুপারক্লাসের স্তরক্রম এবং অতিরিক্ত কোডের একগুচ্ছ আনতে হবে। একটি গঠনমূলক পদ্ধতির সাহায্যে, আপনি ইউনিট টেস্ট, মক অবজেক্টস ইত্যাদির সাহায্যে আপনার সামগ্রিক সামগ্রীর প্রতিটি উপাদান পৃথক করে পরীক্ষা করতে পারেন
সাবক্লাসিংয়ের ফলে আপনার প্রয়োগের বিশদটি আপনাকে প্রকাশ করতে নাও পারে যা আপনি নাও চান। এটি আপনার ডেটার অন্তর্নিহিত উপস্থাপনার অ্যাক্সেস নিয়ন্ত্রণ করতে অসুবিধা সৃষ্টি করে এবং এটি আপনাকে আপনার ব্যাকিং মডেলের একটি বিশেষ প্রয়োগের সাথে যুক্ত করে।
একটি উদাহরণ আমি ভাবতে পারি java.util.Properties, যা হ্যাশটেবলের উত্তরাধিকার সূত্রে প্রাপ্ত। প্রোপার্টি ক্লাসটি কেবল স্ট্রিং-স্ট্রিং জোড়গুলি সংরক্ষণ করার উদ্দেশ্যে করা হয়েছে (এটি জাভাদোকসে উল্লেখ করা আছে)। উত্তরাধিকারের কারণে, হ্যাশটেবল থেকে পুট এবং পুটএল সমস্ত পদ্ধতি সম্পত্তিগুলির ব্যবহারকারীদের কাছে প্রকাশিত হয়েছিল। কোনও সম্পত্তি সংরক্ষণের "ডান" উপায়টি সেটপ্রোপার্টি () সহ থাকলেও, ব্যবহারকারীকে পুট () কল করতে এবং স্ট্রিং এবং অবজেক্টে পাস করা বাধা দেওয়ার মতো কিছুই নেই।
মূলত, সম্পত্তিগুলির শব্দার্থক উত্তরাধিকারের কারণে খারাপভাবে সংজ্ঞায়িত হয়। তদ্ব্যতীত, যে কেউ যদি কখনও সম্পত্তিগুলির জন্য ব্যাকিং অবজেক্ট পরিবর্তন করতে চান, তবে সম্পত্তিগুলি আরও গঠনমূলক পদ্ধতির অবলম্বন না করে প্রোপার্টি ব্যবহার করে এমন কোডের উপর প্রভাবটি আরও বেশি প্রভাব ফেলবে।
উত্তরাধিকার কিছু ক্ষেত্রে এনক্যাপসুলেশন ভেঙে ফেলতে পারে এবং যদি তা ঘটে তবে তা খারাপ। আরও পড়ুন।
উত্তরাধিকার ব্যতীত পুরানো দিনগুলিতে, একটি লাইব্রেরি একটি এপিআই এবং অ্যাপ্লিকেশন প্রকাশ করে যা এটি প্রকাশ্যে দৃশ্যমান যা ব্যবহার করে তা ব্যবহার করে এবং লাইব্রেরিতে এখন অভ্যন্তরীণ গিয়ারগুলি পরিচালনা করার নিজস্ব উপায় রয়েছে যা অ্যাপ্লিকেশনটি না ভেঙে পরিবর্তন করে চলে।
প্রয়োজনীয়তাগুলি বিকশিত হওয়ার সাথে সাথে গ্রন্থাগারটি বিকশিত হতে পারে এবং আরও বেশি গ্রাহক থাকতে পারে; অথবা এটি অন্যান্য স্বাদের সাথে নিজস্ব শ্রেণি থেকে উত্তরাধিকার সূত্রে বর্ধিত কার্যকারিতা সরবরাহ করতে পারে। এ পর্যন্ত সব ঠিকই.
তবে মৌলিক বিষয় হ'ল, যদি কোনও অ্যাপ্লিকেশনটি ক্লাস গ্রহণ করে এবং এটি সাবক্লাস করা শুরু করে, এখন একটি সাবক্লাস আসলে অভ্যন্তরীণ অংশীদার না হয়ে ক্লায়েন্ট । তবে, পাবলিক এপিআই সংজ্ঞায়িত স্পষ্ট দ্ব্যর্থহীন উপায়ের বিপরীতে সাবক্লাসটি এখন লাইব্রেরির অভ্যন্তরে অনেক গভীর (সমস্ত ব্যক্তিগত ভেরিয়েবলগুলিতে অ্যাক্সেস)। এটি এখনও খারাপ নয়, তবে একটি দুষ্টু চরিত্র এমন একটি API ব্রিজ করতে পারে যা অ্যাপ্লিকেশন এবং লাইব্রেরিতে অনেক বেশি রয়েছে-
মূলত যদিও এটি সর্বদা ক্ষেত্রে নাও হতে পারে তবে,
এনক্যাপসুলেশন ভাঙতে উত্তরাধিকারের অপব্যবহার করা সহজ
সাবক্লাসিং মঞ্জুরি দেওয়া যদি সেই বিন্দুতে ভুল হতে পারে।
সংক্ষিপ্ত দ্রুত উত্তর:
এটি আপনি কী করছেন তার উপর নির্ভর করে।
বর্ধিত বোরিং উত্তর:
একজন বিকাশকারী একটি অ্যাপ্লিকেশন তৈরি করতে পারেন। হয়, সাবক্লাসিং বা (প্রোটোটাইপাল) টেম্পলেট ব্যবহার করে। কখনও কখনও একটি কৌশল আরও ভাল কাজ করে। কখনও কখনও অন্য টেকিনেক আরও ভাল কাজ করে।
কৌশলটির সাথে নির্বাচন করা সবচেয়ে ভাল কাজ করে, এটিও বিবেচনা করে বিবেচনা করা উচিত যে "একাধিক উত্তরাধিকার" পরিস্থিতি যদি এটির উপস্থিত থাকে। এমনকি যদি প্রোগ্রামিং ভাষাটি কেবল একক উত্তরাধিকার, টেমপ্লেট বা প্রোটোটাইপগুলিকে সমর্থন করে।
পরিপূরক নোট:
কিছু উত্তর "একাধিক উত্তরাধিকার" সম্পর্কিত। চিন্তা, মূল প্রশ্ন নয়, এটি বিষয়ের সাথে সম্পর্কিত। "একাধিক উত্তরাধিকার বনাম রচনা" সম্পর্কে একাধিক, অনুরূপ পোস্ট রয়েছে। আমার একটি মামলা ছিল যেখানে আমি দুজনকেই মিশ্রিত করি।