ওওপি: শ্রেণিভিত্তিক নকশাকৃত ইন্টারফেস ভিত্তিক চেয়ে আরও ভাল কিছু পরিস্থিতি কী?


10

আমি জেডিএম এর ওয়েবসাইট পড়ছিলাম ।

কেন জেডিএম এপিআই ইন্টারফেসের চেয়ে কংক্রিট ক্লাসের ক্ষেত্রে সংজ্ঞায়িত করা হয়েছে?

জেসন হান্টার জেডিএমের জন্য একটি ইন্টারফেস-ভিত্তিক এপিআইয়ের বিরুদ্ধে যুক্তিগুলির সংক্ষিপ্তসার জানায়:

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

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

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

কংক্রিট ক্লাস ব্যবহার করা নির্দিষ্ট জায়গায় উপযুক্ত হতে পারে। ডিজাইনে কংক্রিটের ক্লাস ব্যবহার করা কি ঠিক আছে?


আপনি এটি একবার দেখে নিতে পারেন: javaworld.com/javaworld/jw-09-2001/jw-0921-interface.html
NoChance

আপনি "আপনার বিমূর্ততা সীমাবদ্ধ করুন" সিরিজটিও পরীক্ষা করে দেখতে পারেন: ayende.com/blog/153889/…
হেনগিনি

"আমরা করেছি, এবং নকশা এটির জন্য আরও ভাল ছিল।" - কিভাবে ভাল ছিল?
কোডার্ট

উত্তর:


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

[সম্পাদনা] জেডিএম এর ওয়েবসাইট java.io.File উদাহরণ হিসাবে গ্রহণ করে, তবে এটি অবশ্যই একটি ইন্টারফেস ভিত্তিক নকশা কারণ কেউ একটি java.io.File উদাহরণটিকে এমনভাবে পরিচালনা করতে পারে যেন এটি কেবল সিরিয়ালাইজযোগ্য। এই পরিস্থিতিতে কেবল "স্রষ্টা" কংক্রিট শ্রেণিটি জানতেন


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

আমি "ডেটা ট্রান্সফার অবজেক্ট" বলতে চাইনি কারণ এটি নির্দেশ করার জন্য @ মিশেলবার্গওয়ার্ড থক্স: আমি আমার উত্তরটি সম্পাদনা করছি
ম্যাথিয়াস জওয়ান

1
যে কোনও সাব-টাইপিং সম্পর্ক, ইন্টারফেস প্রয়োগের পাশাপাশি উত্তরাধিকারের জন্য এলএসপি গুরুত্বপূর্ণ ।

3

জেডিএম সাইট থেকে:

জেসন (হান্টার) 2000 সালের প্রথম দিকে ব্রেট ম্যাকলফলিনের সাথে জেডিএম প্রকল্প প্রতিষ্ঠা করেছিলেন

অর্থাত, প্রায় জাভা 1.3 চালু হয়েছিল around জাভা বিকাশের ক্ষেত্রে পরিপক্কতার পথে কিছুই ছিল না - সর্বাধিক অভিজ্ঞ বিকাশকারীদের জাভা ব্যবহারের জন্য সর্বোত্তমভাবে 4 বছর ছিল। এখানে কোনও বহুল ব্যবহৃত আইওসি পাত্রে ছিল না, হাইবারনেট ছিল না। অ্যাপাচি স্ট্রুটস সবে শুরু হয়েছিল।

যা বলতে গেলে জেসন এবং ব্রেট ঠিক ভুল ছিল। অনেক লোক এখনও "এটি পেয়েছে"। যদি তাদের সি ++ ব্যাকগ্রাউন্ড থাকে তবে ভাল, আপনার সি ++ তে ইন্টারফেসের দরকার নেই (ভাল, তারা সেখানে সি ++ তে ছিলেন, তবে আপনার সত্যিই তাদের দরকার নেই, তাই না?), কেন হেক জাভাতে এগুলি ব্যবহার করে? ঠিক আছে, অনেকগুলি ভাল কারণ রয়েছে, যা অন্যরা আপনাকে নির্দেশ করতে পারে।

তারা অবশ্যই সম্পর্কে ভুল ছিল

ইন্টারফেসের সাহায্যে যে কোনও কিছু করা যায় সাবক্লাসিংয়ের মাধ্যমে করা যেতে পারে

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


3

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

এর মধ্যে অন্যতম কেস হ'ল "ইন্টারফেস" বনাম (বেস) "ক্লাস"। উভয় কৌশল দিয়ে একই লক্ষ্য অর্জন করা যায় এমন পরিস্থিতি রয়েছে।

জিনিসগুলি আরও জটিল করে তোলার জন্য ইন্টারফেসের কয়েকটি ব্যবহার রয়েছে, কেবল উল্লেখ করার জন্য:

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

আপনার প্রশ্ন প্রথম পয়েন্ট প্রযোজ্য।

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

এবং, অন্যান্য দৃশ্যের জন্য ইন্টারফেস ছেড়ে দিন।

একটি ভাল উদাহরণ উইজেট (নিয়ন্ত্রণ) লাইব্রেরি হয়।

আমি প্রস্তাব দিচ্ছি যে তারা অন্যান্য প্রোগ্রামিং ভাষাগুলি একবার দেখে নিন যে তারা কীভাবে ইন্টারফেস এবং ক্লাস ব্যবহার করে: পিএইচপি, ডেল্ফি (অবজেক্ট পাস্কাল), সি #।

চিয়ার্স।


1

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

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

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

এই জন্য প্রথম ব্যবহারের ইউনিট পরীক্ষায় প্রায়ই হয় - আপনি সত্যিই চাই ইউনিট পরীক্ষা সম্পূর্ণ একলা আপনার বর্গ, আপনি আপনার নির্ভরতা যে বাস্তব বাস্তবায়নের যে উৎপাদনে ব্যবহার করা হবে থেকে আলাদা হয় জাল বাস্তবায়নের বিরুদ্ধে যে না।


0

প্যারামিটার হিসাবে পাস বা ফিরে আসা যে কোনও কিছুর জন্য আপনি সাধারণত ইন্টারফেস চান যা মূলত আপনি ক্লাসটির নির্ভরতা থেকে ডিক্লুপ করতে পারেন।

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

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