ইন্টারফেস ধ্রুবক ব্যবহার কি?


123

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

উত্তর:


190

স্থিতিশীল সদস্যদের একটি ইন্টারফেসে স্থাপন করা (এবং সেই ইন্টারফেসটি বাস্তবায়ন করা) একটি খারাপ অভ্যাস এবং এর জন্য একটি নামও রয়েছে কনস্ট্যান্ট ইন্টারফেস অ্যান্টিপ্যাটার্ন , কার্যকর জাভা দেখুন , আইটেম 17:

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

জাভা প্ল্যাটফর্ম লাইব্রেরিতে বেশ কয়েকটি ধ্রুবক ইন্টারফেস রয়েছে, যেমন java.io.ObjectStreamConstants। এই ইন্টারফেসগুলি অসংলগ্নতা হিসাবে বিবেচনা করা উচিত এবং অনুকরণ করা উচিত নয়।

ধ্রুবক ইন্টারফেসের কিছু অসুবিধা এড়াতে (কারণ আপনি লোকেরা এটি প্রয়োগ থেকে আটকাতে পারবেন না), একটি প্রাইভেট কনস্ট্রাক্টর সহ একটি উপযুক্ত শ্রেণিকে অগ্রাধিকার দেওয়া উচিত (উদাহরণস্বরূপ উইকিপিডিয়া থেকে ধার করা ):

public final class Constants {

    private Constants() {
        // restrict instantiation
    }

    public static final double PI = 3.14159;
    public static final double PLANCK_CONSTANT = 6.62606896e-34;
}

এবং ধ্রুবকগুলিকে সম্পূর্ণরূপে যোগ্যতা ছাড়াই অ্যাক্সেস পেতে (অর্থাত্ শ্রেণীর নামের সাথে তাদের উপসর্গ না করে), একটি স্ট্যাটিক আমদানি (জাভা 5) ব্যবহার করুন:

import static Constants.PLANCK_CONSTANT;
import static Constants.PI;

public class Calculations {

    public double getReducedPlanckConstant() {
        return PLANCK_CONSTANT / (2 * PI);
    }
}

12
ঠিক আছে, তবে আপনার যদি এমন একটি ইন্টারফেস থাকে যা কেবল ধ্রুবক সংজ্ঞা নয়। সুতরাং আমার কিছু ইন্টারফেস রয়েছে যা অনেকগুলি ক্লাস দ্বারা প্রয়োগ করা হয় এতে পদ্ধতি ঘোষণা রয়েছে তবে আমি উদাহরণ হিসাবে আকারের মতো কিছু সাধারণ মানও যুক্ত করতে চাই। এটি কি এই ক্ষেত্রে খারাপ প্যাটার্ন? সাধারণভাবে আমি সম্মত হই যে কেবল ধ্রুবকদের জন্য ইন্টারফেস তৈরি করা একটি অ্যান্টিপ্যাটার্ন।
asukasz Rzeszotarski

11
কেবল কোনও বইতে কেউ এমন কথা বলেছে এটি কোনও খারাপ জিনিস নয়। যতক্ষণ আপনি এই ধ্রুবকগুলিতে অ্যাক্সেস পেতে সেই ইন্টারফেসটি প্রয়োগ না করেন, ঠিক আছে।
এসিভি

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

6
আমি এসিভির সাথে একমত যদি ধ্রুবক ইন্টারফেস রফতানি হওয়া API মডিউলের অংশ না হয় বা এটি কোথাও প্রয়োগ করা হয় না, আমি সমস্যাটি দেখি না। কনস্ট ফাইনাল ক্লাস ব্যবহার করা কুৎসিত: আপনার একটি প্রাইভেট কনস্ট্রাক্টর দরকার যা কোডের গোলমাল করে দেয় কারণ এর কোনও ব্যবহার নেই।
লরেন্স

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

17

" ধ্রুবক ইন্টারফেস প্যাটার্নটি ইন্টারফেসের একটি দুর্বল ব্যবহার "

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

আমি এখানে সেই অনুমানের বিরুদ্ধে একটি প্রতিক্রিয়া প্রত্যাখ্যান লিখেছি: জাভাতে ধ্রুবক প্রয়োগ করার সর্বোত্তম উপায় কী? এই অনুমানের ভিত্তিহীন নেস ব্যাখ্যা।

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

এগুলি আমি হাইপোথিসিসের বিরুদ্ধে প্রকাশ করেছি

  • এই হাইপোথিসিসটি ধরে রাখার জন্য ভিত্তি হ'ল খারাপ সফ্টওয়্যার অভ্যাস এবং পদ্ধতিগুলির প্রভাবগুলি মোকাবেলা করার জন্য পদ্ধতিগুলি এবং পুনরায় নিয়ন্ত্রণের প্রয়োজনীয়তা।

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

  • মৌলিক বিষয়টি সমাধান করুন।

  • এবং তারপরে কেন জাভা ভাষা কাঠামোর প্রতিটি ভাষা বৈশিষ্ট্য আপনার নিজের সুবিধার্থে সম্পূর্ণ ব্যবহার এবং ব্যবহার না করে। কোনও জ্যাকেট প্রয়োজন নেই। আরও কার্যকর জীবনযাত্রাকে বৈষম্যমূলক ও জখম করতে আপনার অকার্যকর জীবনযাত্রাকে ব্যারিকেড করার নিয়ম কেন আবিষ্কার করবেন?

মৌলিক বিষয়

তথ্য সংস্থা। প্রক্রিয়াটির মধ্যস্থতাকারী তথ্য, তথ্যের তথাকথিত আচরণটি প্রথমে তথাকথিত ব্যবসায়ের বিধিগুলির সাথে বোঝা উচিত - প্রকৌশল বা প্রক্রিয়াটির পরিপূরক সমাধানের আগে। তথ্য সংস্থার এ জাতীয় পদ্ধতিটিকে কয়েক দশক আগে ডেটা নরমালাইজেশন বলা হয়েছিল।

তবে কেবলমাত্র একটি সমাধানের ইঞ্জিনিয়ারিং সম্ভব হতে পারে কারণ কোনও দ্রবণের উপাদানগুলির গ্রানুলারিটি এবং মডুলারালিটির সাথে তথ্যের উপাদানগুলির দানাদারতা এবং মডুলারালিটির সাথে সারিবদ্ধ করা সর্বোত্তম কৌশল।

তথ্য সংগঠিত করার ক্ষেত্রে দুটি বা তিনটি উল্লেখযোগ্য বাধা রয়েছে।

  1. ডেটা-মডেল "নরমালাইজেশন" এর প্রয়োজনীয়তার জন্য উপলব্ধির অভাব।

  2. ডেটা সাধারণকরণের বিষয়ে ইএফ কোডের বক্তব্য ত্রুটিযুক্ত, ত্রুটিযুক্ত এবং অস্পষ্ট।

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

ইন্টারফেস ধ্রুবক ব্যবহার করা ভাল অনুশীলন।

আপনার অ্যাড-হক হিট-অ্যান্ড-রান প্রোগ্রামিং অভ্যাসকে ভালোবাসেন বলেই বিধি তৈরি বা কোনও ফতোয়া জারি করবেন না।

বন্দুকের মালিকানা এই কারণে নিষিদ্ধ করবেন না যে এমন লোক আছে যারা বন্দুক পরিচালনা করতে জানে না বা বন্দুকের অপব্যবহারের ঝুঁকিতে থাকে।

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

একটি নির্লিপ্ত যুক্তি - জাভা ভাষার ফ্লাউন্ডাররা সেভাবে ব্যবহার করা উচিত নয় ইন্টারফেসগুলি?

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

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

এনাম কনস্ট্যান্টসের ব্যবহার আসলে ভয়ঙ্কর অনুশীলন।

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

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

ধ্রুবকগুলি এপিআই চুক্তি

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

সুতরাং, ইন্টারফেসগুলি কনস্ট্যান্টদের চুক্তি বাস্তবায়নের একটি সঠিক উপায়।

একটি অদ্ভুত ধারণা - যদি ইন্টারফেসটি অসাবধানতার সাথে কার্যকর হয়।

হা. যে কেউ অজান্তেই অজান্তেই কোনও ইন্টারফেস প্রয়োগ করতে পারে। এ জাতীয় অজ্ঞাতসারে প্রোগ্রামারদের পক্ষে কিছুই দাঁড়াবে না।

আপনার ডেটা-মডেলটি ফুটোয়ের বিপরীতে ডিজাইন ও স্বাভাবিক করুন

অনুমানযুক্ত খারাপ অভ্যাসগুলিকে সুরক্ষিত করার জন্য বিধিনিষেধক ডিক্রিগুলি রাখবেন না যা এপিআই-এ অনিয়ন্ত্রিত / বিপথগামী প্যারামিটারগুলি ফাঁস করে দেয়। ইন্টারফেস কনস্ট্যান্টদের উপর দোষ না রেখে মৌলিক সমস্যাটি সমাধান করুন।

আইডিই ব্যবহার না করা খারাপ অভ্যাস

একটি স্বাভাবিক ক্রিয়াকলাপ এবং কার্যকর প্রোগ্রামার সেখানে প্রমাণ করতে পারে না যে সে কতক্ষণ পানির নীচে থাকতে পারে, ফোসকা গরম এবং ভেজা ঝড়ো বর্ষণে সে কতদূর হাঁটতে পারে। প্রতিদিন তার কাজকর্মের জন্য 10 মাইল দূরে নিতে তিনি গাড়ি বা বাস বা কমপক্ষে একটি বাইকের মতো দক্ষ সরঞ্জাম ব্যবহার করতে পারেন।

সহকর্মী প্রোগ্রামারদের উপর কেবল বিধিনিষেধ স্থাপন করবেন না কারণ আপনার আইডিই-কম প্রোগ্রামিংয়ের সাথে একটি তাত্পর্য তাত্পর্য রয়েছে।

প্রোগ্রামারদের খারাপ অভ্যাস দক্ষতার সাথে চালিয়ে যেতে সহায়তা করার জন্য একটি কয়েকটি ফ্রেমওয়ার্ক তৈরি করা হয়েছে।

ওএসজিআই এমন একটি কাঠামো। এবং ইন্টারফেস কনস্ট্যান্টগুলির বিরুদ্ধেও ডিক্রিটি একই রকম।

অতএব চূড়ান্ত উত্তর ...

ইন্টারফেস ধ্রুবকগুলি একটি ডিজিটাল-মডেলটির নকশা করা এবং নকশা করা সাধারণ নকশাকে চুক্তিতে স্থাপন করার একটি কার্যকর এবং দক্ষ উপায়।

ক্লাস ফাইলে থাকা উপযুক্ত নামযুক্ত প্রাইভেট ইন্টারফেসের ইন্টারফেস ধ্রুবকগুলি আপনার সমস্ত প্রাইভেট কনস্ট্যান্টকে পুরো ফাইলটিতে ছড়িয়ে দেওয়ার পরিবর্তে গ্রুপ করা ভাল অনুশীলন।


29
আপনার সমস্ত পয়েন্ট রসিকতা, কটাক্ষ, সংবেদনশীলতা ছাড়াই তৈরি করা যেতে পারে। স্ট্যাকওভারফ্লো কোনও ব্লগিং প্ল্যাটফর্ম নয়।
tkruse

1
"মার্কিন সংবিধানের জন্য প্রতিষ্ঠাতা পিতৃপুরুষের মূল উদ্দেশ্যগুলি কী ছিল তা আমি মাথা ঘামাই না। "সমাজের কার্যকর কার্যক্রম।" - এটা ভাল রূপক হয় না?
ধন্য গিক

"প্যারামিটারকে মান হিসাবে মান্য করার জন্য এটির জন্য অতিরিক্ত কোড লেখার প্রয়োজন Java জাভা প্রতিষ্ঠাতারা আপনার লিখন ব্যতীত প্যারামিটার-মান ম্যাপিংয়ের ব্যবস্থা করেন নি যে ম্যাপিং কোডটি এনাম কনস্ট্যান্টগুলি দেখায় যে জাভা ভাষার অনবচ্ছিন্ন ব্যবহার।" অতিরিক্ত কোড না লিখে আপনি কীভাবে প্যারামিটার-মান মানচিত্রটি পাবেন?
গ্যাব্রিয়েল ওশিরো

ইন্টারফেস ধ্রুবক ব্যবহার করুন। ঠিক।
ধন্য গীক

9

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

ইন্টারফেস কনস্ট্যান্ট কেন ব্যবহার করবেন?

কেবল তাদের তুলনা করুন:

public final class Constants {

    private Constants() {
        // restrict instantiation
    }

    public static final double PI = 3.14159;
    public static final double PLANCK_CONSTANT = 6.62606896e-34;
}

বনাম

public interface Constants {

    double PI = 3.14159;
    double PLANCK_CONSTANT = 6.62606896e-34;
}

একই ব্যবহার। অনেক কম কোড।

খারাপ অনুশীলন?

আমি মনে করি @ প্যাসাল থিভেন্টের উত্তরটির ভুল জোর দেওয়া হয়েছে, এটির আমার সংস্করণটি এখানে:

স্থিতিশীল সদস্যদের একটি ইন্টারফেসে স্থাপন করা ( এবং সেই ইন্টারফেসটি বাস্তবায়ন করা ) একটি খারাপ অভ্যাস।

কার্যকর জাভা থেকে উদ্ধৃতিটি অন্যদের দ্বারা প্রয়োগ করা হচ্ছে ধ্রুবক ইন্টারফেসের ধারণা, যা আমার মনে হয় না এবং হওয়া উচিত (এবং হবে না)।

আপনি যখন কোনও ধরণের স্থির ইন্টারফেস তৈরি করেন Constants, তখন কারও দ্বারা এটি প্রয়োগ করা উচিত নয়। (যদিও প্রযুক্তিগতভাবে সম্ভব, যা এখানে একমাত্র সমস্যা)

এটি স্ট্যান্ডার্ড লাইব্রেরিতে ঘটবে না

স্ট্যান্ডার্ড লাইব্রেরি ডিজাইনের কোনও সম্ভাব্য অপব্যবহারের সামর্থ্য রাখে না, সুতরাং আপনি কেবল সেখানে কোনওটি দেখতে পাবেন না।

তবে , স্বাভাবিক ডেভেলপারদের দৈনন্দিন প্রকল্প, ধ্রুবক ইন্টারফেস ব্যবহার করার জন্য অনেক সহজ কারণ আপনি সম্পর্কে চিন্তা করতে প্রয়োজন হবে না static, final, empty constructor, ইত্যাদি, এবং এটি কোন খারাপ নকশা ইস্যু করতে পারবে না। আমি কেবলমাত্র খারাপ দিকটিই ভাবতে পারি যে এটিতে এখনও "ইন্টারফেস" এর নাম রয়েছে, তবে এর চেয়ে বেশি কিছুই নেই।

চূড়ান্ত বিতর্ক

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


"স্থির সদস্যদের একটি ইন্টারফেসে স্থাপন করা (এবং সেই ইন্টারফেসটি বাস্তবায়ন করা) একটি খারাপ অভ্যাস is" না এটি নয়
বৃষ্টি

সংশোধকটি publicবাদ দেওয়া যেতে পারে কারণ এটি একটি ইন্টারফেস, কেবল এটির double PI = 3.14159;ব্যবহারটি ইন্টারফেস Constants.PIবাস্তবায়নের জন্য ক্লাসের প্রয়োজন হয় না Constants! আমি মনে করি ইন্টারফেসের পদ্ধতির ব্যবহারের ক্ষেত্রে অনেক বেশি পরিষ্কার, আইএমএইচও
ক্রোজাইন

@ ক্রোজাইন আপডেট হয়েছে। অনুস্মারকটির জন্য ধন্যবাদ। যার সন্দেহ আছে তার প্রতি উল্লেখ: "একটি ইন্টারফেসে সংজ্ঞায়িত সমস্ত ধ্রুবক মান স্পষ্টতই প্রকাশ্য, স্থিতিশীল এবং চূড়ান্ত।" - docs.oracle.com/javase/tutorial/java/IandI/interfaceDef.html
নাকামুরা

6

জোশুয়া ব্লচ, "কার্যকর জাভা - প্রোগ্রামিং ভাষা নির্দেশিকা":

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


আপনি আক্ষরিকভাবে এমন কোনও মূল্যবোধ যুক্ত করলেন যা ইতিমধ্যে বলা হয়নি।
ডোনাল ফেলো

3

আপনার যদি সাধারণ ধ্রুবক থাকে যা ক্লাসে ইন্টারফেস প্রয়োগ করে তা ব্যবহার করা যায় তবে সেগুলি কার্যকর।

এখানে একটি উদাহরণ রয়েছে: http://www.javapractices.com/topic/TopicAction.do?Id=32

তবে মনে রাখবেন যে প্রস্তাবিত অনুশীলনটি ইন্টারফেসগুলিতে স্থির পরিবর্তে স্থির আমদানি ব্যবহার করা। এখানে একটি রেফারেন্স দেওয়া হয়েছে: http://www.javapractices.com/topic/TopicAction.do?Id=195


2

এমন উত্তর রয়েছে যা খুব অনুরণনযোগ্য।

তবে এই প্রশ্নটি সম্পর্কে আমার কিছু চিন্তাভাবনা আছে। (ভুল হতে পারে)

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


সেগুলি অবশ্যই বাস্তবায়নকারী ক্লাসগুলির মধ্যে ব্যবহার করা উচিত।
বৃষ্টি

2

ইন্টারফেস সম্পর্কে দুটি পয়েন্ট:

  • একটি ইন্টারফেস কোনও বস্তু যা এটি প্রয়োগ করতে পারে তা কী করতে পারে তার একটি উপসেট বর্ণনা করে । (এটি স্বজ্ঞাততা)

  • একটি ইন্টারফেস সাধারণ স্থায়িত্বগুলি বর্ণনা করে যার পরে এটি কার্যকর করে objects

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

সুতরাং আমি মনে করি বিশ্বব্যাপী ধ্রুবকগুলির জন্য যদি কনস্ট্যান্ট ইন্টারফেস ব্যবহার না করা হয় তবে তা গ্রহণযোগ্য:

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

উদাহরণ:

interface Drawable {

    double GOLDEN_RATIO = 1.618033988;
    double PI = 3.141592653;
    ...

    // methods
    ...
}

public class Circle implements Drawable {
    ...
    public double getCircumference() {
        return 2 * PI * r;
    }
}

void usage() {

    Circle circle = new Circle(radius: 3.0);
    double maxRadius = 5.0;

    if ( circle.getCircumference() < 2 * Circle.PI * maxRadius ) {
        ...
    }

}

এই উদাহরণে:

  • থেকে Circle implements Drawable, আপনি অবিলম্বে জানি Circleসম্ভবত ধ্রুবক সংজ্ঞায়িত নিশ্চয়তা হয় Drawable, অন্যথায় তারা ভাল বেশী থেকে খারাপ নাম চয়ন আছে PIএবং GOLDEN_RATIOইতিমধ্যে গ্রহণ করা হয়েছে!
  • কেবলমাত্র এই Drawableঅবজেক্টগুলি নির্দিষ্ট অনুসারে PIএবং GOLDEN_RATIOসংজ্ঞায়িত হয়েছে Drawable, এমন বস্তু থাকতে পারে যা Drawableপাই এবং সুবর্ণ অনুপাতের আলাদা নির্ভুলতার সাথে নয় ।

আমি কি আপনার উত্তর ভুল বুঝেছি বা আপনি ইন্টারফেসের উদ্দেশ্যকে ভুল বুঝেছেন? একটি ইন্টারফেস একটি উপসেট হতে হবে না। একটি ইন্টারফেস একটি চুক্তি, যেটি চুক্তিতে সাবস্ক্রাইব করে তাকে অবশ্যই চুক্তির দ্বারা নির্দিষ্ট ইন্টারঅ্যাকশন সরবরাহ করতে হবে। ইন্টারফেসের একমাত্র বৈধ ব্যবহার হ'ল এটি কোনও চুক্তি ঘোষণার / পূরণের জন্য ব্যবহার করা।
ধন্য

@ ধন্য ধন্য আপনি একটি চুক্তিটি পূরণ করেন, তারপরে চুক্তি দ্বারা বর্ণিত ক্ষমতাটি আপনি যা করতে পারেন তার একটি উপসেট।
বৃষ্টি হচ্ছে

1

javax.swing.SwingConstantsইন্টারফেস একটি উদাহরণ যা স্ট্যাটিক ক্ষেত্র যা দোল শ্রেণীর মধ্যে ব্যবহার করা হয় পেয়েছিলাম। এটি আপনাকে সহজেই এমন কিছু ব্যবহার করতে দেয়

  • this.add(LINE_START, swingcomponent);
  • this.add(this.LINE_START, swingcomponent); অথবা
  • this.add(SwingComponents.LINE_START, swingcomponent);

তবে এই ইন্টারফেসের কোনও পদ্ধতি নেই ...


1

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

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

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


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

@ ড্যানিয়েল: আমি আপনার মন্তব্যে উজ্জীবিত হয়েছি তবে এখন আপনার প্রশ্নের জন্য আমার একটি ভাল ব্যাখ্যা আছে: "এমন কোনও বাঁধাই নেই যা আপনার এপিআইর গ্রাহককে সেই ধ্রুবকটি ব্যবহার করতে বাধ্য করে" তবে এখন ক্লায়েন্ট আর কনস্ট্যানিয়েশন ব্যবহার করতে পারবেন না কারণ তারা হয়েছে ব্যবহৃত, যা আমার জন্য একটি ভাল চিহ্ন!
বৃষ্টি হচ্ছে

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

-1

ক্লাসের মধ্যে ভাগ করে নেওয়া ধ্রুবকের সাথে ডিল করার সময় আমি ইন্টারফেস ধ্রুবকগুলি ব্যবহার করি।

public interface TestConstants
{
    String RootLevelConstant1 = "RootLevelConstant1";

    interface SubGroup1
    {
        String SubGroupConstant1 = "SubGroup1Constant1";
        String SubGroupConstant2 = "SubGroup1Constant2";
    }

    interface SubGroup2
    {
        String SubGroupConstant1 = "SubGroup2Constant1";
        String SubGroupConstant2 = "SubGroup2Constant2";
    }
}

গ্রুপিং একটি বিশাল সম্পদ, বিশেষত ধ্রুবকগুলির একটি বিশাল সেট।

ব্যবহার করতে, আপনি কেবল তাদের একসাথে চেইন করুন:

System.out.println(TestConstants.SubGroup1.SubGroupConstant1);
System.out.println(TestConstants.SubGroup2.SubGroupConstant1);
System.out.println(TestConstants.RootLevelConstant1);

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

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

1
একটি ইন্টারফেসে আপনি কী করতে পারেন এমন ক্লাসে কেন করবেন ?? আমি কীভাবে লোকদের অজান্তে কোনওরকম ইন্টারফেস প্রয়োগ করতে বাধা দেব তা প্রশ্ন। আপনি ইন্টারফেস ধ্রুবকগুলিতে চেরি-পিক করেন কেন?
ধন্য গীক

-2

ক্ষেত্রগুলিকে একটি ইন্টারফেসে ঘোষণা করা উচিত যাতে এগুলি ভাগ করা সহজ হয় এবং অতিরিক্ত সংযোগের সূচনা না করে রেফারেন্স করা যায়।

উত্স: জাভা বিকাশকারী সরঞ্জাম কোডিং স্টাইল


সম্ভবত জাভা 6 এর আগে তবে তা আজ বেশিরভাগই অপ্রাসঙ্গিক।
tkruse

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