স্থিরদের সংগঠিত করতে নেস্টেড পাবলিক ক্লাস ব্যবহার করা Using


21

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

public static final String CREDITCARD_ACTION_SUBMITDATA = "6767";
public static final String CREDITCARD_UIFIELDID_CARDHOLDER_NAME = "3959854";
public static final String CREDITCARD_UIFIELDID_EXPIRY_MONTH = "3524";
public static final String CREDITCARD_UIFIELDID_ACCOUNT_ID = "3524";
...
public static final String BANKPAYMENT_UIFIELDID_ACCOUNT_ID = "9987";

এই ধরণের নামকরণ কনভেনশনটিকে আমার কাছে জটিল মনে হচ্ছে। আমি ভেবেছিলাম পাবলিক নেস্টেড ক্লাস ব্যবহার করা আরও সহজ হতে পারে এবং এরকম কিছু থাকতে পারে:

public class IntegrationSystemConstants
{
    public class CreditCard
    {
        public static final String UI_EXPIRY_MONTH = "3524";
        public static final String UI_ACCOUNT_ID = "3524";
        ...
    }
    public class BankAccount
    {
        public static final String UI_ACCOUNT_ID = "9987";
        ...
    }
}

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


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

উত্তর:


13

আমি দুটি প্রস্তাবের কোনওটির সাথেই একমত নই।

ধ্রুবক তাদের থাকা উচিত প্রাসঙ্গিক শ্রেণীর , একটি সম্পূর্ণ ধ্রুবক ক্লাসে নাদুই ফর্ম উভয় প্রস্তাব দেয়।

কেবল ধ্রুবক-ক্লাস / ইন্টারফেস থাকতে হবে না।

একটি শ্রেণি CreditCard(অভ্যন্তরীণ শ্রেণি নয়) থাকা উচিত। এই শ্রেণীর / ইন্টারফেস সংঙ্ক্রান্ত ক্রেডিট কার্ড সেইসাথে ধ্রুবক আপেক্ষিক পদ্ধতি আছে UI_EXPIRY_MONTHএবং UI_ACCOUNT_ID

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

উদাহরণস্বরূপ জাভা এপিআইতে প্রতিটি শ্রেণি / ইন্টারফেসের ধ্রুবক রয়েছে। তারা কয়েক ধরণের কনস্ট্যান্টের সাথে কনস্ট্যান্ট ক্লাস / ইন্টারফেসে নেই, হয় অভ্যন্তরীণ শ্রেণিতে বিভক্ত হয়েছে বা নেই।

উদাহরণস্বরূপ, ফলাফল স্থির জন্য প্রাসঙ্গিক এই ধ্রুবকগুলি ইন্টারফেসে রয়েছে ResultSet:

static int  CLOSE_CURSORS_AT_COMMIT 
static int  CONCUR_READ_ONLY 
static int  CONCUR_UPDATABLE 
static int  FETCH_FORWARD 
static int  FETCH_REVERSE 
static int  FETCH_UNKNOWN 
static int  HOLD_CURSORS_OVER_COMMIT 
static int  TYPE_FORWARD_ONLY 
static int  TYPE_SCROLL_INSENSITIVE 
static int  TYPE_SCROLL_SENSITIVE 

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

ইউআই কর্মের সাথে সম্পর্কিত এই ধ্রুবকগুলি ইন্টারফেসে রয়েছে javax.swing.Action:

static String   ACCELERATOR_KEY 
static String   ACTION_COMMAND_KEY 
static String   DEFAULT 
static String   LONG_DESCRIPTION 
static String   MNEMONIC_KEY 
static String   NAME 
static String   SHORT_DESCRIPTION 
static String   SMALL_ICON 

প্রয়োগকারী ক্লাসগুলির সাথে ইউআই ক্রিয়াকলাপ সম্পর্কিত আচরণ থাকে, তারা কেবল ধ্রুবক ধারক নয়।

আমি SwingConstantsকোনও পদ্ধতি ছাড়াই কমপক্ষে একটি "ধ্রুবক" ইন্টারফেস ( ) জানি কিন্তু এতে কয়েকশ ধ্রুবক নেই, কেবল কয়েকটি, এবং এগুলি সমস্ত ইউআই উপাদানগুলির দিকনির্দেশ এবং অবস্থানের সাথে সম্পর্কিত:

static int  BOTTOM 
static int  CENTER 
static int  EAST 
static int  HORIZONTAL 
static int  LEADING 
static int  LEFT 
static int  NEXT 
static int  NORTH 
static int  NORTH_EAST 
static int  NORTH_WEST 
static int  PREVIOUS 
static int  RIGHT 
static int  SOUTH 
static int  SOUTH_EAST 
static int  SOUTH_WEST 
static int  TOP 
static int  TRAILING 
static int  VERTICAL 
static int  WEST 

আমি মনে করি কেবল ধ্রুবক ক্লাসগুলি ওও ডিজাইনের পক্ষে ভাল নয়।


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

1
+1, তবে ইউআই কনস্ট্যান্টগুলি সম্ভবত ব্যাঙ্কঅ্যাকউন্টের মতো ব্যবসায়িক মডেলগুলিতে থাকা উচিত নয়। তারা কিছু ইউআই শ্রেণিতে অন্তর্ভুক্ত।
কেভিন ক্লিনে

10

এটি এসেছিল যে ধ্রুবকগুলি খুব বেশি ছড়িয়ে ছিটিয়ে রয়েছে এবং সমস্তগুলি একটি একক "মাস্টার" ধ্রুবক ফাইল হিসাবে সজ্জিত করা উচিত।

ধ্রুবকদের "সন্ধান করা কঠিন" হওয়ার সমস্যাটির এটি 100% ভুল সমাধান । ধ্রুবক, এনাম বা ইন্টারফেসের মতো প্রযুক্তিগত মানদণ্ডের সাথে জিনিসগুলিকে গ্রুপবদ্ধ করা এটি একটি মৌলিক ত্রুটি (দুর্ভাগ্যক্রমে প্রোগ্রামাররা খুব সাধারণভাবে ঘটায়)

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

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


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

1
@ ফ্রাস্ট্রেটেড উইথফোর্ডস ডিজাইনার: মডেলিং নির্ভরতাগুলির জন্য বর্ধিত সংকলন প্রক্রিয়াটি কতটা ব্যয় করে তা নির্ভর করে।
মাইকেল বার্গওয়ার্ড

9

তুমি ঠিক. আপনার পরামর্শটি একজন প্রোগ্রামারকে import static Constants.BankAccount.*'BANKACCOUNT_' এর অগণিত পুনরাবৃত্তিগুলি মুছে ফেলতে এবং মুছে ফেলার অনুমতি দেয়। সংঘটন প্রকৃত স্কোপিংয়ের একটি দরিদ্র বিকল্প। এটি বলেছিল, আপনারা টিম সংস্কৃতি পরিবর্তনের জন্য অনেক আশা রাখি না। তাদের যথাযথ অনুশীলনের ধারণা রয়েছে এবং আপনি যদি তাদের 100 জন বিশেষজ্ঞকে বলে থাকেন যে তারা ভুল বলে তবে তাদের পরিবর্তনের সম্ভাবনাও নেই।

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


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

8
একটি ধ্রুবক শ্রেণি যা নিয়মিত পরিবর্তিত হয় ... যদি আপনি যথেষ্ট পরিমাণে খনন করেন তবে সেখানে কিছু জেন রয়েছে।
কেচালোক্স

2
@ ফ্রাস্ট্রেটেড উইথফোর্ডস ডিজাইনার: ইউআই-ফিল্ড আইডি? জানেন না কোথায় কোন মান খুঁজে পাবে? ডাব্লুটিএফের বিশাল স্তূপের মতো শোনাচ্ছে। আপনার আমার সহানুভূতি আছে
কেভিন cline

6

উভয়ই কাজ করে এবং দিনের শেষে এটি গুরুত্বপূর্ণ।

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


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

1
@ গুরানজোভিচ ওয়েল প্রতিটি অ্যান্টি-প্যাটার্ন কোনও উপায়ে (বা কমপক্ষে সুবিধাজনক) কার্যকর হয়, এটি যদি না হয় তবে এটি কোনও প্যাটার্নে পরিণত হত না।
ইয়ানিস

1

ধ্রুবকের দীর্ঘ তালিকা সহ চ্যালেঞ্জগুলির মধ্যে একটি হ'ল "সঠিক" ধ্রুবকটি ব্যবহার করা সন্ধান করা। অবিচ্ছিন্নভাবে, কেউ যার সাথে সম্পর্কিত তার সাথে যুক্ত হওয়ার পরিবর্তে লাইনের শেষে একটি ধ্রুবকটিকে পরীক্ষা করে।

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

যদি কিছু হয় তবে আপনার পরামর্শ "ভুল" ধ্রুবকটি ব্যবহার করে নিরুৎসাহিত করতে সহায়তা করে যদিও এটি কোনও নির্দিষ্ট পরিস্থিতিতে উপযুক্ত। প্রতিনিধি শ্রেণীর মধ্যে ধ্রুবকগুলি আবৃত করার মাধ্যমে, এটি বিকাশকারীদের এটি ব্যবহার করা উচিত কিনা তা চিন্তা করতে উত্সাহিত করবে। উদাহরণস্বরূপ, যদি আমি CreditCard.SomeConstantসাধারণ ব্যবহারের জন্য টান করি তবে আমার সত্যিই অবাক হওয়া উচিত কেন General.SomeConstantসেই অবস্থার পরিবর্তে কোনও পরিস্থিতি নেই।

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


1

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

আমি এক্সএমএল ডাব্লু এর শ্রেণিবদ্ধ কাঠামোর সাথে মিলিত একটি নেস্টেড ক্লাস স্ট্রাকচার তৈরি করি / কনস্ট্রিং স্ট্রিং "এলিমেন্টনাম" সম্পত্তি এবং প্রতিটি অ্যাট্রিবিউটের সাথে অনুরূপ সম্পত্তি (যদি থাকে) এর সাথে মিল রাখে এমন একটি সম্পত্তি যুক্ত শ্রেণীর নামগুলি মিলে।

এটি সম্পর্কিত XML এর বিরুদ্ধে প্রোগ্রাম করা খুব সহজ করে তোলে।

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