জাভাতে ইন্টারফেস প্রয়োগ করার সময় ডিফল্ট বনাম ইমপ্ল


34

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

আসুন ধরে নেওয়া যাক আপনার কাছে একটি ইন্টারফেস রয়েছে Orderযা বিভিন্ন উপায়ে বাস্তবায়নের উদ্দেশ্যে রয়েছে তবে যখন প্রকল্পটি প্রথম তৈরি করা হয় কেবল তখনই প্রাথমিক বাস্তবায়ন হয়। আপনি কি মিথ্যা দ্বিবিজ্ঞান এড়ানোর জন্য DefaultOrderবা OrderImplঅন্য কোনও রূপের জন্য যান ? এবং আরও বাস্তবায়ন যখন আসে তখন আপনি কী করবেন?

এবং সবচেয়ে গুরুত্বপূর্ণ ... কেন?

উত্তর:


59

নামগুলি অর্থ বোঝানোর সুযোগ রয়েছে। ইমপ্লের সাহায্যে আপনি কেন সেই সুযোগটি ফেলে দেবেন?

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

যে দেওয়া, আমরা প্রতিটি ইন্টারফেস যে অনুমান করতে পারেন হয়েছে বা হতে পারে দুই বা ততোধিক বাস্তবায়নের।

  • যদি এখনই আপনার একমাত্র আছে এবং আপনি জানেন না কীভাবে অন্যটি আলাদা হতে পারে তবে ডিফল্ট একটি ভাল শুরু।

  • যদি আপনার এখনই দুটি থাকে, থাকে তবে এর উদ্দেশ্য অনুসারে প্রত্যেকের নাম দিন।

    উদাহরণ: সম্প্রতি, আমাদের একটি কংক্রিট ক্লাস প্রবন্ধ ছিল (একটি ডাটাবেসের উল্লেখ)। এটি উপলব্ধি করা হয়েছিল যে অফলাইনে থাকা একটি প্রসঙ্গটি উপস্থাপনের জন্য আমাদের সক্ষম হওয়া দরকার, সুতরাং কনটেক্সট নামটি একটি নতুন ইন্টারফেসের জন্য ব্যবহৃত হয়েছিল (পুরানো এপিআইয়ের সাথে সামঞ্জস্য বজায় রাখতে), এবং একটি নতুন বাস্তবায়ন তৈরি হয়েছিল, অফলাইনকন্টেক্সট । তবে অনুমান করুন যে মূলটির নামকরণ করা হয়েছিল? এটা ঠিক, কনটেক্সট আইপল ( হাই )।

    এই ক্ষেত্রে, DefaultContext সম্ভবত ঠিক আছে, এবং লোকেরা এটি পেতে পারে, তবে এটি এটির মতো বর্ণনামূলক নয়। সর্বোপরি, যদি এটি অফলাইন না হয় তবে এটি কী? সুতরাং আমরা সাথে গেলাম: অনলাইনকন্টেক্সট


বিশেষ মামলা: ইন্টারফেসে "আমি" উপসর্গ ব্যবহার করা

অন্য উত্তরগুলির মধ্যে একটি ইন্টারফেসে আই উপসর্গটি ব্যবহার করার পরামর্শ দিয়েছিল। বাঞ্ছনীয়, আপনি না প্রয়োজন এই কাজ করতে।

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

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

/* Option 1, traditional verbose naming: */
interface EventDispatcher { /* interface for all event dispatchers */ }
class DefaultEventDispatcher implements EventDispatcher {
  /* default event dispatcher */
}

/* Option 2, "I" abbreviation because "EventDispatcher" will be a common default: */
interface IEventDispatcher { /* interface for all event dispatchers */ }
class EventDispatcher implements IEventDispatcher {
  /* default event dispatcher. */
}

3
দৃ answer় উত্তরের জন্য +1। ইমপ্ল ব্যবহার না করার পিছনে যুক্তির মতো।
গ্যারি রোউ

2
+1 একেবারে সম্মত। এটি প্রতিনিধিত্ব করে এমন ডোমেন ধারণা থেকে দূরে কোনও ইন্টারফেসের নামকরণ পয়েন্টটি পুরোপুরি অনুপস্থিত।
rpjones

9
"যদি আপনার কেবলমাত্র একটি বাস্তবায়ন থাকে", আপনি কীভাবে আগেই জানবেন যে আপনার কেবলমাত্র একটি বাস্তবায়ন হবে? "প্রতিটি ইন্টারফেসের দুটি বা ততোধিক বাস্তবায়ন থাকতে পারে বা থাকতে পারে" ... দুটি বাস্তবায়ন হওয়ার আগে আপনার প্রথমে কোনওটি নেই, আপনার একটি রয়েছে, তারপরে আপনার দুটি আছে, আমি বলতে চাই এমন একটি মুহুর্ত থাকতে পারে যখন আপনার কেবলমাত্র একটি বাস্তবায়ন হবে, কেবল দ্বিতীয়টি কার্যকর করার আগে।
তুলাইনস কর্ডোভা

2
@ নিকসি আমি শব্দার্থবিজ্ঞান সম্পর্কে উদ্বিগ্ন নই (আমি কবি এবং আমি এটি জানতাম না)। ইংরেজি আমার মাতৃভাষা নয় তাই আমি এটি সম্পর্কে পেডেন্টিক হতে পারি না। আমি ত্রুটিযুক্ত যুক্তি সম্পর্কে কথা বলছিলাম। আপনি decoupling জন্য ইন্টারফেস ব্যবহার। এর জন্য একটি নির্দিষ্ট সংখ্যক বাস্তবায়ন প্রয়োজন হয় না।
তুলাইনস কর্ডোভা

4
if you will only ever have one implementation, do away with the interface- যদি না আপনি মক অর্ডার, অর্ডারস্টাব বা অনুরূপ তৈরির জন্য সেই ইন্টারফেসটি রাখতে চান তবে সেই অংশটি পরীক্ষা করতে চান।
জেবিআরউইলকিনসন

15

আমি ইন্টারফেসের ব্যবহারের ক্ষেত্রে নামকরণ স্থির করি।

যদি ইন্টারফেসটি ডিকপলিংয়ের জন্য ব্যবহৃত হয় , তবে আমি Implবাস্তবায়নের জন্য বেছে নিই ।

যদি ইন্টারফেসের উদ্দেশ্যটি আচরণগত বিমূর্ততা হয় , তবে বাস্তবায়নের নাম তারা নামকরণ করে যা তারা দৃly়তার সাথে করছে। আমি প্রায়শই ইন্টারফেসের নামটি যুক্ত করি। সুতরাং যদি ইন্টারফেসটি বলা হয় Validator, আমি ব্যবহার করি FooValidator

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


8

আমি নিকলে এর উত্তর সঙ্গে একমত (বিশেষত যে ইন্টারফেস সম্ভবত অধিকাংশ ক্ষেত্রে প্রয়োজন হয় না), কিন্তু আলোচনার স্বার্থে আমি একটি অতিরিক্ত বিকল্প অন্য চেয়ে নিক্ষেপ করব OrderImplএবং DefaultOrder: লুকান মত একটি স্ট্যাটিক কারখানা পদ্ধতি পিছনে বাস্তবায়ন Orders.create()। উদাহরণ স্বরূপ:

public final class Orders {
  public static Order create() {
    return new Order() {
      // Implementation goes here.
    };
  }
}

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

বাস্তবে এই প্যাটার্নের কয়েকটি দুর্দান্ত উদাহরণ হ'ল java.util.Collectionsএবং java.util.concurrent.Executorsইউটিলিটি ক্লাস, যার পদ্ধতিগুলি লুকানো বাস্তবায়ন ফিরিয়ে দেয়। কার্যকর জাভা হিসাবে উল্লেখ করেছে (আইটেম 1 এ), এই প্যাটার্নটি API এর "ধারণাগত ওজন" আরও ছোট রাখতে সহায়তা করতে পারে।


একটি আকর্ষণীয় অতিরিক্ত ক্ষেত্রে +1: বেনামে বাস্তবায়ন।
গ্যারি রোয়ে

1
পেয়ারাতেও ব্যাপকভাবে ব্যবহৃত হয় ।
নিকোল

3

ইন্টারফেসের OrderImplঠিক পরে বর্ণানুক্রমিকভাবে প্রদর্শিত হওয়ার কারণে আমি সর্বদা যেতে পারি Order


2
এবং কীভাবে আপনি চলমান পরবর্তী প্রয়োগগুলি, বিশেষ পরিচালনা এবং এর জন্য পরিচালনা করবেন?
গ্যারি রোউ

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

বেশ ডান - আমি এই নতুন প্রয়োজন প্রতিফলিত করতে মূল প্রশ্নটি সম্পাদনা করেছি।
গ্যারি রোয়ে

একটি ভাল ধারণা না যদি আরও একটি বাস্তবায়ন হতে চলেছে।
সাদেগ

0

আপনি উপসর্গ I (আইডাব্লু যা) এর সাথে ইন্টারফেসটির নাম রাখতে পারেন এবং তারপরে যা কিছু বাস্তবায়ন করুন।

অফিসিয়াল জাভা কোড কনভেনশনগুলি ইন্টারফেসের জন্য এই জাতীয় নামকরণ সম্পর্কে কিছু জানায় না, তবে এই জাতীয় নামকরণ স্বীকৃতি এবং নেভিগেশনকে সহায়তা করে।


আপনি কেন একটি আই দিয়ে ইন্টারফেস উপসর্গ করবেন? এটি নেভিগেশনে স্বীকৃতি সহায়তা?
গ্যারি রোউ

@ গ্যারি: ডেলিফির ভাষায় আমার সাথে ইন্টারফেসের প্রিফিক্সিংটি একটি সুপ্রতিষ্ঠিত সম্মেলন। ডেলফি ক্লাসে টির সাথে উপসর্গ তৈরি করা হয়। সুতরাং আমাদের কাছে আইওআর্ডার ইন্টারফেস এবং একটি সুনির্দিষ্ট বাস্তবায়ন হিসাবে টিসোমথিং অর্ডার এবং টিবুলমার্কেটঅর্ডারের সাথে একটি অর্ডার ডিফল্ট বাস্তবায়ন হবে।
মার্জন ভেনেমা

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

5
এটি প্রদর্শিত হয় যে @ রেনেসিস এটি জাভাতে ব্যবহার করার জন্য একটি দরকারী ক্ষেত্রে এনেছে। ব্যক্তিগতভাবে, আমি আইডিই'র উপর নির্ভর করে আমাকে পার্থক্যটি জানাতে নইলে আমাদের কাছে এনামদের জন্য ই, ক্লাসের জন্য সি এর এবং সমস্তরকম অপ্রয়োজনীয় ছিল।
গ্যারি রোয়ে

0

আমি মনে করি যে ডিফল্ট কিছু ক্ষেত্রে ধারণা তৈরি করতে পারে, তবে এটি বাস্তবায়নের বর্ণনা দিতে আরও সহায়ক হবে। সুতরাং যদি আপনার ইন্টারফেস হয় UserProfileDAOতবে আপনার বাস্তবায়নগুলি হতে পারে UserProfileSQLDAOবা এর UserProfileLDAPDAOমতো কিছু।


0

যদি সম্ভব হয় তবে এটি কীভাবে / কীভাবে এটি কাজ করে তার নাম দিন।

সাধারণত সবচেয়ে খারাপ পদ্ধতির নামকরণ করা হয় এটি কীভাবে ব্যবহৃত হবে বলে মনে করা হচ্ছে।

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

যদি অন্য কিছু বাস্তবায়ন সরবরাহ না করা হয় তবে এটি ব্যবহার করুন ডিফল্টএক্স


-2

এই উত্তরগুলির বেশিরভাগটি বর্ণনা করছে যে কী করা হচ্ছে তবে কেন নয়।

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

যদি আমি একটি ব্যক্তি ইন্টারফেস তৈরি করি তবে একটি পার্সোনআইএমপিএল কী? অর্থহীন। কমপক্ষে ডিফল্ট পার্সন আমাকে বলেন যে যারাই কোড করেছে তারা ইন্টারফেস তৈরি করা উচিত নয়।

ইন্টারফেসগুলি পলিমারফিজমের জন্য টাইপ করছে এবং এটি ব্যবহার করা উচিত।


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