গুইসে @ ইমপ্লিমেন্টড বাই এনোটেশন দেওয়ার পিছনে অনুপ্রেরণা কি?


10

আমি গুগল গুইসে@ImplementedBy উপলব্ধ টীকাগুলি সম্পর্কে সম্প্রতি পড়েছি । এটি প্রোগ্রামারকে নির্ভর করে ইনজেকশনে ভবিষ্যতে ব্যবহারের জন্য একটি ইন্টারফেস এবং এর প্রয়োগের মধ্যে একটি আবশ্যককে নির্দিষ্ট করার অনুমতি দেয়। এটি একটি ইন-টাইম বাইন্ডিংয়ের একটি উদাহরণ ।

আমি আমার মডিউলগুলিতে সুস্পষ্ট বাইন্ডিংগুলি সংজ্ঞায়িত করতে নীচের সিনট্যাক্সটি ব্যবহার করতে বেশ অভ্যস্ত:

bind(SomeInterface.class).to(SomeInterfaceImplementation.class);

ডকুমেন্টেশন অনুসারে, এটি @ImplementedByটীকাটির নীচের ব্যবহারের সমান :

@ImplementedBy(SomeInterfaceImplementation.class)
public interface SomeInterface {
    //method declarations
}

আমি এখানে কেবল লাভটি দেখতে পাচ্ছি যে কোডটি প্রান্তিকভাবে খাটো। একই সময়ে, এই পদ্ধতির সঠিকভাবে একই ডক্স দ্বারা নির্দেশিত একটি অপূর্ণতা রয়েছে:

@ImplementedByসাবধানে ব্যবহার করুন; এটি ইন্টারফেস থেকে এর প্রয়োগের জন্য একটি সংকলন-সময় নির্ভরতা যুক্ত করে।

এই ধরনের নির্ভরতা অনেক ক্ষেত্রে সমস্যা নাও হতে পারে তবে আমি ব্যক্তিগতভাবে এটিকে কোড গন্ধ হিসাবে দেখি।

কোন ব্যবহারের ক্ষেত্রে @ImplementedByটীকাগুলি ব্যবহারের পক্ষে মূল্যবান হয়?

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

যদি কোনও ধরণের bind()বিবৃতি উভয় ক্ষেত্রে থাকে (প্রথম যুক্তি হিসাবে) এবং @ImplementedByএ্যানোটেশন থাকে তবে bind()বিবৃতিটি ব্যবহৃত হয়। টীকাটি একটি ডিফল্ট প্রয়োগের পরামর্শ দেয় যা একটি বাঁধার সাথে ওভাররাইড করা যেতে পারে।

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

টীকাটি থাকার কি একমাত্র কারণ? নাকি আমি এখানে কিছু মিস করছি? আমি কোডে এটি ব্যবহার করে কিছু অর্জন করতে পারি যা কেবলমাত্র কিছু ব্যবসায়িক যুক্তির যত্ন নেওয়া অ্যাপ্লিকেশন এবং কোনও লাইব্রেরি / কাঠামো বাড়ানো নয়?


2
সম্পর্কিত, সম্ভবত ডুপ্লিকেট প্রশ্ন (যদিও আপনার শিরোনামটি পরিষ্কার): গুইসের @ ইমপ্লিমেন্টেড দ্বারা কি মন্দ?
জেফ বোম্যান

নেই একটি কঠোর ডুপ্লিকেট, কিন্তু এখানে উপর এই কিছু মজার আলোচনা হয়েছে: stackoverflow.com/questions/6197178/...
রিচার্ড Vodden

উত্তর:


8

আমি মনে করি যে বিপদটি এখানে কেবল@ImplementedBy টীকাটি ব্যবহার করছে । bind()আপনার মডিউলের বিবৃতিগুলির সাথে একত্রে যথাযথভাবে ব্যবহার করা এবং এরপরে এটি ঠিক আছে।

একটি ডিফল্ট বাস্তবায়ন পরীক্ষা করার জন্য দুর্দান্ত; প্রতিবার যখন আপনি প্রচুর নির্ভরতা সম্পন্ন একটি ক্লাস পরীক্ষা করছেন বা আপনি যদি এমন একটি ক্লাস পেয়ে থাকেন যে অনেক কিছুই নির্ভর করে (তবে আপনাকে প্রতি একক সময় একটি উপহাসকে সংজ্ঞায়িত করতে হবে) প্রতিবার আপনি একটি মক ইঞ্জেকশনটি স্পষ্টভাবে সংজ্ঞায়িত করতে চান না don't )।

উদাহরণস্বরূপ, আপনার একটি ক্লাস থাকতে পারে:

@ImplementedBy(NoOpDataService.class)
interface DataService {
    Map<String, MyPOJO> getData();
}

এবং তারপরে NoOpDataService:

class NoOpDataService implements DataService {
    @Override
    public Map<String, MyPOJO> getData() {
        return Collections.emptyMap();
    }
}

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

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


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