ধ্রুবককে সংজ্ঞায়িত করার জন্য ইন্টারফেস রাখা কি খারাপ অভ্যাস?


40

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

আমি যে সুবিধাগুলি দেখতে পাচ্ছি তা হ'ল:

  • ধ্রুবকগুলিতে সহজে অ্যাক্সেস: MY_CONSTANTপরিবর্তেThatClass.MY_CONSTANT
  • প্রতিটি ধ্রুবক শুধুমাত্র একবার সংজ্ঞায়িত

এই পদ্ধতির বদলে কি ভাল বা খারাপ অভ্যাস? আমি ইন্টারফেসের ধারণাটি কিছুটা গালি দেওয়ার মতো অনুভব করছি।

আপনি ইন্টারফেস / ধ্রুবক সম্পর্কে সাধারণত উত্তর দিতে পারেন, তবে ইউনিট পরীক্ষাগুলি সম্পর্কে যদি এর মধ্যে বিশেষ কিছু থাকে তবে।


"ইন্টারফেস এক্সকে সংজ্ঞায়িত করা কি খারাপ অভ্যাস?" এর উত্তর, এক্স এমন কোনও কিছু যা "পদ্ধতিতে স্বাক্ষর" নয়, প্রায় সর্বদা অবশ্যই "হ্যাঁ" হয়।
টি। সর - মনিকা

উত্তর:


79

জোশুয়া ব্লচ তাঁর কার্যকর জাভা বইয়ে এর বিরুদ্ধে পরামর্শ দিয়েছেন :

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

আপনি একটি সাধারণ শ্রেণীর সাথে একই প্রভাব পেতে পারেন যা ধ্রুবকগুলি সংজ্ঞায়িত করে এবং তারপরে ব্যবহার করুন import static com.example.Constants.*;


13

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

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


7

আমি মনে করি না কেবল ধ্রুবকদের জন্য ইন্টারফেস রাখা ভাল জিনিস ।

তবে যদি এমন ইন্টারফেসের সাথে আচরণের সংজ্ঞা দেওয়া হয় (ক্লাস প্রয়োগের পদ্ধতিগুলি প্রয়োগ করা উচিত), এর ধ্রুবক থাকে, তবে তা ঠিক আছে। যদি এটি এপিআই-তে "কিছু প্রয়োগকারীর বিশদ ফাঁস করে " , তবে এটি এটি হওয়া উচিত। তারা আরও ফাঁস করছে যে বাস্তবায়নকারী foo এবং বার পদ্ধতি প্রয়োগ করে।

উদাহরণস্বরূপ java.awt. ট্রান্সপারেন্সি ইন্টারফেস নিন। এটিতে অসমাপ্ত, বিটমাস্ক এবং ট্রান্সলুসেন্ট ধ্রুবক রয়েছে তবে এটির ট্রান্সপারেন্সি () পদ্ধতিও রয়েছে।

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


2

মনে করুন এটি বেশিরভাগ জায়গাতেই জনপ্রিয় একটি দৃষ্টিভঙ্গি যেখানে চুক্তি অনুসারে নকশাই প্রাধান্য পায়।
ইন্টারফেস চুক্তি হয়। ইন্টারফেসে ধ্রুবক স্থাপনের অর্থ চুক্তি অনুসারে প্রতিটি শ্রেণি ধ্রুবক দ্বারা চিহ্নিত মান / ধারণাটির সাথে সম্মত হয়।


1
ইন্টারফেস পাবলিক চুক্তি। ধ্রুবক VALUES ব্যক্তিগত উদ্বেগ, পাবলিক ইন্টারফেসের সর্বাধিক তাদের নাম প্রকাশ করা উচিত। এটি একটি বিমূর্ত ক্লাসে সেরা বাম।
জেগে উঠছে

কেস বিন্দু: javax.naming.Context, javax.ims.Session এবং এই জাতীয় শত শত ইন্টারফেস ...
সিএমআর

2
@ জওয়েন্টিং এছাড়াও, "at most expose their names"মানগুলি প্রকাশ না করে কোনও পাবলিক ইন্টারফেস করতে পারে ?
সিএমআর

এটি আমার অনুমান প্রোগ্রামিং ভাষার উপর নির্ভর করবে। জাভা ক্ষেত্রে, না।
জওয়েন্টিং

2

আমি কাজ করেছি এমন একটি সংস্থা ইন্টারফেস-আমদানি করা 1 কনস্ট্যান্টের ভারী ব্যবহার করেছে । আমি এর কোনও ক্ষতি অনুভব করি না।

আপনার নিজের কাছে যে প্রশ্নটি করা উচিত তা হ'ল, আপনার কাছে নামের স্থানটি কতটা গুরুত্বপূর্ণ? ধ্রুবকগুলির ক্ষেত্রে, এটি সত্যই সমস্ত শ্রেণি হিসাবে কাজ করে। আপনার যদি হাজার হাজার ধ্রুবক থাকে তবে আপনি এই ধ্রুবকগুলির সর্বদা উপলব্ধ থাকতে চান না।

ইন্টারফেস সম্পর্কে দুর্দান্ত জিনিস হ'ল এটি আপনাকে যে কোনও উপায়ে কাজ করার সুবিধা দেয় - আপনার প্রয়োজনীয় সমস্ত নামস্থান আনুন বা সেগুলির কোনওটিই আনুন না (এবং এগুলি স্পষ্টভাবে অ্যাক্সেস সহ MyInterface.CONSTANT)। বেশ অনেকটা একই জিনিস import static MyInterface.*, তবে খানিকটা স্পষ্ট।


1: আপনি যদি জাভার সাথে পরিচিত না হন তবে importআমি কীওয়ার্ডটি বোঝাতে চাইছি না , আমি কেবল এর মাধ্যমে নিয়ে এসেছিimplements MyConstantsInterface


1

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

আমি না বলার কারণটি হ'ল একটি ইন্টারফেস চুক্তির একটি রূপ যা আচরণ বা সংজ্ঞা দেয়, রাষ্ট্র বা কাঠামো নয়। ধ্রুবক বলতে কিছু ধরণের রাজ্য (আদিম) বা রাষ্ট্রের একটি দিক (সম্মিলিত বা সমষ্টিগত) বোঝায়।

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

আরও প্রযুক্তিগত গাইডের জন্য: download.oracle.com/javase/1.5.0/docs/guide/language/static-import.html


স্থিতিশীল আমদানির বিষয়ে আরও লিঙ্ক যুক্ত করা (1.5): 1. উইকিপিডিয়া ২. জাস্টিক
অভিজিৎ

1
So when should you use static import? Very sparingly! Only use it when you'd otherwise be tempted to declare local copies of constants, or to abuse inheritance (the Constant Interface Antipattern). In other words, use it when you require frequent access to static members from one or two classes. If you overuse the static import feature, it can make your program unreadable and unmaintainable, polluting its namespace with all the static members you import. ওরাকল ডক্স
অভিজিৎ

1

না এটি একটি সাধারণ খারাপ অভ্যাস নয়।

মুল বক্তব্যটি হ'ল অন্য কোনও নিদর্শন হিসাবে ধ্রুবকগুলি ন্যূনতম দৃশ্যমানতা এবং সঠিক বিমূর্ত স্তর স্তরের নিয়মের অধীনে প্রবর্তন করা উচিত।

সিনট্যাক্স ব্যবহার করা কেবল কারণ আপনি করতে পারেন আসল সমস্যা।

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