ইন্টারফেস ডিজাইনে জেনেরিকগুলি কখন ব্যবহার করবেন


11

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

বর্তমানে, তারা হিসাবে সংজ্ঞায়িত করা হয়

আইটেম:

public interface Item {

    String getId();

    String getName();
}

ItemStack:

public interface ItemStackFactory {

    ItemStack createItemStack(Item item, int quantity);
}

ItemStackContainer:

public interface ItemStackContainer {

    default void add(ItemStack stack) {
        add(stack, 1);
    }

    void add(ItemStack stack, int quantity);
}

এখন, Itemএবং ItemStackFactoryআমি ভবিষ্যতে এটির প্রসারিত করার জন্য কিছু তৃতীয় পক্ষের একেবারে ধারণা করতে পারি। ItemStackContainerভবিষ্যতেও বাড়ানো যেতে পারে, তবে আমার সরবরাহিত ডিফল্ট প্রয়োগের বাইরে আমি যেভাবে আগে থেকেই ধারণা করতে পারি তা নয়।

এখন, আমি এই লাইব্রেরিটি যথাসম্ভব শক্তিশালী করার চেষ্টা করছি; এটি এখনও প্রাথমিক পর্যায়ে রয়েছে (প্রাক-প্রাক-আলফা) সুতরাং এটি ওভার ইঞ্জিনিয়ারিং (YAGNI) এর কাজ হতে পারে। জেনেরিক ব্যবহারের জন্য এটি কি উপযুক্ত জায়গা?

public interface ItemStack<T extends Item> {

    T getItem();

    int getQuantity();
}

এবং

public interface ItemStackFactory<T extends ItemStack<I extends Item>> {

    T createItemStack(I item, int quantity);
}

আমি আশংকা করি যে এটি বাস্তবায়ন এবং ব্যবহার পড়া এবং বুঝতে আরও অসুবিধাজনক হতে পারে; আমি মনে করি যেখানেই সম্ভব জেনেরিক বাসা বাঁধবার পরামর্শ দেওয়া উচিত।


1
কিন্ডা মনে হয় আপনি বাস্তবায়নের বিশদটি কোনওভাবেই প্রকাশ করছেন। কেন কলারের কাছে সাধারণ পরিমাণের চেয়ে স্ট্যাকগুলি নিয়ে কাজ করা এবং জানা / যত্ন করা প্রয়োজন?
সিএওও

এটি এমন কিছু যা আমি ভাবিনি। এটি এই নির্দিষ্ট সমস্যাটির জন্য কিছু সুন্দর অন্তর্দৃষ্টি সরবরাহ করে। আমি আমার কোডে পরিবর্তনগুলি নিশ্চিত করব।
জিমাস

উত্তর:


9

আপনার প্রয়োগটি যখন জেনেরিক হওয়ারও সম্ভাবনা থাকে তখন আপনি আপনার ইন্টারফেসে জেনেরিক ব্যবহার করেন।

উদাহরণস্বরূপ, যেকোন ডেটা স্ট্রাকচার যা স্বেচ্ছাসেবী বস্তু গ্রহণ করতে পারে তা জেনেরিক ইন্টারফেসের জন্য ভাল প্রার্থী। উদাহরণ: List<T>এবং Dictionary<K,V>

যে কোনও পরিস্থিতি যেখানে আপনি সাধারণ পদ্ধতিতে প্রকারের সুরক্ষা উন্নত করতে চান তা জেনেরিকদের পক্ষে ভাল প্রার্থী। এ List<String>একটি তালিকা যা কেবল স্ট্রিংগুলিতে কাজ করে।

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

অ্যাবস্ট্রাক্ট ফ্যাক্টরি প্যাটার্নটি জেনেরিকের পক্ষে ভাল ব্যবহারের ক্ষেত্রে, অন্যদিকে একটি সাধারণ কারখানার পদ্ধতিটি কেবল এমন একটি বস্তু তৈরি করে যা সাধারণ, কংক্রিট ইন্টারফেস থেকে উত্তরাধিকার সূত্রে প্রাপ্ত হয়।


জেনেরিক ইন্টারফেসগুলি জেনেরিক প্রয়োগের সাথে যুক্ত করা উচিত এই ধারণার সাথে আমি সত্যিই একমত নই। একটি ইন্টারফেসে জেনেরিক ধরণের পরামিতি ঘোষণা করা এবং তারপরে এটি বিভিন্ন বাস্তবায়নে পরিমার্জন বা ইনস্ট্যান্ট করা একটি শক্তিশালী কৌশল। এটি স্কালায় বিশেষত সাধারণ। ইন্টারফেস বিমূর্ত জিনিস; ক্লাস তাদের বিশেষজ্ঞ।
বেনিয়ামিন হজসন

@ বেঞ্জামিনহডসন: এর অর্থ হ'ল আপনি নির্দিষ্ট ধরণের জন্য জেনেরিক ইন্টারফেসে বাস্তবায়ন তৈরি করছেন। সামগ্রিক পদ্ধতির এখনও কিছুটা কম যদিও, জেনেরিক।
রবার্ট হার্ভে 22

আমি রাজী. সম্ভবত আমি আপনার উত্তরটি ভুল বুঝেছি - মনে হচ্ছে আপনি এই ধরণের ডিজাইনের বিরুদ্ধে পরামর্শ দিচ্ছেন।
বেনিয়ামিন হজসন

@ বেঞ্জামিনহডসন: জেনেরিকের চেয়ে কংক্রিটের ইন্টারফেসের বিরুদ্ধে কোনও কারখানা পদ্ধতি লেখা হবে না ? (যদিও একটি বিমূর্ত কারখানা জেনেরিক হবে)
রবার্ট হার্ভে

আমি মনে করি আমরা একমত হয়েছি :) আমি সম্ভবত ওপি এর উদাহরণটি এর মতো কিছু লিখতাম class StackFactory { Stack<T> Create<T>(T item, int count); }। আপনি যদি আরও স্পষ্টতা চান তবে একটি উত্তরে "একটি সাবক্লাসে টাইপ প্যারামিটারটি পরিমার্জন" বলতে আমি কী বোঝাতে চেয়েছি তার একটি উদাহরণ লিখতে পারি, যদিও উত্তরটি কেবলমাত্র মূল প্রশ্নের সাথে সম্পর্কিত হবে।
বেনিয়ামিন হজসন

8

আপনার ইন্টারফেসে সাধারণতা কীভাবে প্রবর্তন করা যায় সে সম্পর্কে আপনার পরিকল্পনাটি আমার কাছে সঠিক বলে মনে হয়। যাইহোক, এটি একটি ভাল ধারণা হবে কিনা সে সম্পর্কে আপনার প্রশ্নটির আরও কিছুটা জটিল উত্তর প্রয়োজন answer

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

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


3

এখন, Itemএবং ItemStackFactoryআমি ভবিষ্যতে এটির প্রসারিত করার জন্য কিছু তৃতীয় পক্ষের একেবারে ধারণা করতে পারি।

আপনার জন্য আপনার সিদ্ধান্ত আছে। যদি আপনি জেনেরিক সরবরাহ না Itemকরেন তবে প্রতিটি সময় তারা ব্যবহার করার ক্ষেত্রে তাদের প্রয়োগ করতে হবে:

class MyItem implements Item {
}
MyItem item = new MyItem();
ItemStack is = createItemStack(item, 10);
// They would have to cast here.
MyItem theItem = (MyItem)is.getItem();

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


2

বাহ ... আমার এটাকে পুরোপুরি আলাদা করতে হবে।

আমি কিছু তৃতীয় পক্ষের প্রয়োজনীয়তার পূর্বেই ধারণা করতে পারি

এটি একটি ভুল. আপনার "ভবিষ্যতের জন্য" কোড লেখা উচিত নয়।

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


0

আমি মনে করি আপনার পরিস্থিতিতে জেনেরিক ব্যবহার করা খুব জটিল।

আপনি যদি ইন্টারফেসের জেনেরিক সংস্করণ পছন্দ করেন, ডিজাইনটি এটি নির্দেশ করে

  1. আইটেমস্ট্যাককন্টেইনার <ক> এ একক ধরণের স্ট্যাক রয়েছে, এ। (যেমন আইটেমস্ট্যাককন্টেইনারে একাধিক ধরণের স্ট্যাক থাকতে পারে না))
  2. আইটেমস্ট্যাক নির্দিষ্ট ধরণের আইটেমকে উত্সর্গীকৃত। সুতরাং সমস্ত ধরণের স্ট্যাকের কোনও বিমূর্তকরণের ধরণ নেই।
  3. প্রতিটি ধরণের আইটেমের জন্য আপনাকে একটি নির্দিষ্ট আইটেমস্ট্যাকফ্যাক্টরি নির্ধারণ করতে হবে। এটি কারখানার প্যাটার্ন হিসাবে খুব সূক্ষ্ম হিসাবে বিবেচিত।
  4. আইটেমস্ট্যাক <এর মতো আরও কঠিন কোড লিখবেন? আইটেম> প্রসারিত, রক্ষণাবেক্ষণযোগ্যতা হ্রাস।

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


0

আমি বলব এটি মূলত এই প্রশ্নের উপর নির্ভর করে: যদি কারওর কার্যকারিতা বাড়াতে হয় Itemএবং ItemStackFactory,

  • তারা কি কেবল পদ্ধতিগুলি ওভাররাইট করবে এবং তাই তাদের সাবক্লাসগুলির উদাহরণগুলি কেবল বেস শ্রেণীর মতো ব্যবহার করা হবে, কেবল অন্যরকম আচরণ করবে ?
  • অথবা তারা সদস্য যুক্ত করবে এবং সাবক্ল্যাসগুলি আলাদাভাবে ব্যবহার করবে?

প্রথম ক্ষেত্রে, জেনেরিকের প্রয়োজন নেই, দ্বিতীয়টিতে সম্ভবত রয়েছে।


0

হতে পারে, আপনার একটি ইন্টারফেস স্তরক্রম থাকতে পারে, যেখানে ফু একটি ইন্টারফেস, বার অন্যটি is যখনই কোনও ধরণের উভয়ই হওয়া আবশ্যক, এটি একটি ফুঅ্যান্ডবার ar

ওভার ডিজাইন এড়ানোর জন্য, যখন প্রয়োজন হবে কেবল তখনই FooAndBar টাইপ করুন এবং ইন্টারফেসের একটি তালিকা রাখুন যা কখনই কোনও কিছুর প্রসারিত করে না।

এটি বেশিরভাগ প্রোগ্রামারদের কাছে অনেক বেশি স্বাচ্ছন্দ্যযুক্ত (বেশিরভাগ তাদের টাইপ চেকিংয়ের মতো বা কোনও ধরণের স্ট্যাটিক টাইপিংয়ের সাথে কখনই ডিল করতে পছন্দ করে না)। খুব কম লোকই তাদের নিজস্ব জেনেরিক ক্লাস লিখেছেন।

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


এটি জেনেরিক ব্যবহারের বিকল্প হতে পারে তবে আপনি যে পরামর্শ দিয়েছিলেন তার চেয়ে বেশি জেনেরিক কখন ব্যবহার করবেন সে সম্পর্কে মূল প্রশ্নটি । জেনেরিকগুলি কখনও প্রয়োজন হয় না তা বোঝাতে আপনি নিজের উত্তরটি উন্নত করতে পারেন, তবে একাধিক ইন্টারফেস ব্যবহার করা কি সবার উত্তর?
জে এলস্টন 12'16
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.