জাভা - পুরো স্ট্যাটিক ক্লাস করা কি খারাপ ধারণা?


16

আমি এখনই একটি বৃহত্তর একক প্রকল্পে কাজ করছি এবং আমার বেশ কয়েকটি ক্লাস রয়েছে যাতে আমি উদাহরণ তৈরি করার কোনও কারণ দেখি না।

আমার ডাইস ক্লাস এখনই উদাহরণস্বরূপ, এর সমস্ত ডেটা স্থিতিশীলভাবে সঞ্চয় করে এবং এর সমস্ত পদ্ধতিও স্থির। আমার এটি আরম্ভ করার দরকার নেই কারণ যখন আমি পাশা রোল করতে এবং একটি নতুন মান পেতে চাই, আমি কেবল ব্যবহার করি Dice.roll()

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

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


1
যদি আপনার প্রোগ্রামটি সম্পূর্ণ পদ্ধতিগত হয় ural আপনি জাভা কেন বেছে নিলেন?
লাইভ

12
এই শ্রেণীর জন্য ইউনিট পরীক্ষা লেখার চেষ্টা করুন, এবং আপনি বুঝতে পারবেন কেন লোকেরা স্থিতাবস্থায় অ্যাক্সেস করে এমন স্থির পদ্ধতি পছন্দ করে না।
জোয়েরি সেব্রেচটস

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


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

উত্তর:


20

স্ট্যাটিক ক্লাসগুলি যা সত্যই স্থির হয় তাতে কোনও ভুল নেই । এটি বলার অপেক্ষা রাখে না যে এর অভ্যন্তরীণ রাষ্ট্রের কথা বলার পদ্ধতিগুলির আউটপুট পরিবর্তনের কারণ হতে পারে।

যদি Dice.roll()সহজেই 1 থেকে 6 এ কোনও নতুন এলোমেলো সংখ্যা ফিরে আসে, তবে এটি রাষ্ট্রের পরিবর্তন করছে না। মঞ্জুর, আপনি একটি Randomউদাহরণ ভাগ করে নিতে পারেন , তবে আমি বিবেচনা করব না যে সংজ্ঞা অনুযায়ী রাষ্ট্রের পরিবর্তন, আউটপুটটি সর্বদা ভাল, এলোমেলো হতে চলেছে। এটি থ্রেড-নিরাপদ তাই এখানে কোনও সমস্যা নেই।

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

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


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

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

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

// DON'T DO THIS!
class Singleton {
  private String name; 
  private static Singleton instance = null;

  private Singleton(String name) {
    this.name = name;
  }

  public static Singleton getInstance() {
    if(instance == null) {
      instance = new Singleton("George");
    }
    return instance;
  }

  public getName() {
    return name;
  }
}

assert Singleton.getInstance().getName() == "George"

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

1
@HexTeke আপডেট উত্তর।
নীল

1
@ ডেভিড আর্নো সত্য, তবে আমি মনে করি সেই মুহুর্তে আমরা যদি কোনও একক কল পরীক্ষা করে দেখি তবে আমরা সত্যিই সমস্যায় আছি random.nextInt(6) + 1। ;)
নীল

3
@ নীল, দুঃখিত, আমি নিজেকে খুব ভালভাবে ব্যাখ্যা করিনি। আমরা এলোমেলো নম্বর ক্রমটি পরীক্ষা করছি না, আমরা অন্যান্য পরীক্ষাগুলিতে সহায়তা করার জন্য সেই অনুক্রমটিকে প্রভাবিত করছি। যদি আমরা পরীক্ষা করে যাচ্ছি যে RollAndMove()আমরা যখন দ্বিগুণ ছয় সরবরাহ করি তখন আবার রোলগুলি হয়, তবে এটির সবচেয়ে সহজতম, সবচেয়ে শক্তিশালী উপায়টি হয় ব্যর্থতা Diceবা এলোমেলো সংখ্যা জেনারেটর। Diceকিন্তু , একটি স্ট্যাটিক র্যান্ডম জেনারেটর ব্যবহার করে একটি স্ট্যাটিক শ্রেণি হতে চান না।
ডেভিড আরনো

12
আপনার আপডেটটি যদিও মাথার উপরে এই সমস্যাটিকে আঘাত করে: স্থির পদ্ধতিগুলি নির্বিচারক হওয়া উচিত; তাদের কোনও পার্শ্ব প্রতিক্রিয়া হওয়া উচিত।
ডেভিড আরনো

9

কোনও staticশ্রেণীর সীমাবদ্ধতার উদাহরণ দেওয়ার জন্য , আপনার গেমারদের কেউ যদি তাদের ডাই রোলগুলির উপর সামান্য বোনাস পেতে চান? এবং তারা বড় টাকা দিতে ইচ্ছুক! :-)

হ্যাঁ, আপনি অন্য একটি প্যারামিটার যোগ করতে পারেন, তাই Dice.roll(bonus),

পরে আপনার ডি 20 দরকার হবে।

Dice.roll(bonus, sides)

হ্যাঁ, তবে কিছু খেলোয়াড়ের "চূড়ান্ত সক্ষম" কীর্তি রয়েছে যাতে তারা কখনই "ভুগতে পারে না" (রোল এ 1)।

Dice.roll(bonus, sides, isFumbleAllowed)

এই অগোছালো হয়ে যাচ্ছে, তাই না?


এটি প্রশ্নের অরথোগোনাল বলে মনে হচ্ছে, এগুলি স্থির পদ্ধতি বা সাধারণ পদ্ধতি
জে কে

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

1
@ টিমোথিট্রাকল আমি এটিকে বিতর্ক করছি না, আমি যা বলছি তা হ'ল এই উত্তরটি আসলে প্রশ্নের উত্তর দেয় না, কারণ এই ধরণের স্কোপ ক্রাইপটির পদ্ধতিটি অচল হওয়ার সাথে সম্পর্কিত নয়।
এনভিগেট

2
@ ন্যাভিগট "আমি এ নিয়ে বিতর্ক করছি না" - ভাল, আমি তা করি। ওও ভাষার সর্বাধিক পাওয়ারফুল বৈশিষ্ট্যটি হল পলিমারফিজম । এবং স্থির অ্যাক্সেস কার্যকরভাবে এটিকে ব্যবহার করা থেকে আমাদের বাধা দেয়। এবং আপনি ঠিক বলেছেন: স্থির অ্যাক্সেসের পাশাপাশি new Dice().roll(...)কন্টিডারড থাকতে হবে । আমরা যদি কেবল সেই নির্ভরতা ইনজেকশন করি তবেই আমরা উপকৃত হব । Dice.roll(...)
টিমোথি ট্রাকল

2
@ জে কে এই পার্থক্য হ'ল প্রতিটি কলটিতে অগোছালোতা staticদেখা দেয় এবং প্রতিটি কলটিতে প্রয়োজনীয় জ্ঞান প্রয়োজন, তাই এটি আপনার সমস্ত অ্যাপ্লিকেশন জুড়ে বিশ্বব্যাপী ছড়িয়ে পড়ে। একটি ওওপি কাঠামোতে, কেবলমাত্র কনস্ট্রাক্টর / কারখানাটি অগোছালো হওয়া দরকার, এবং সেই মৃত্যুর বিবরণ সজ্জিত থাকে। এর পরে, পলিমারফিজম ব্যবহার করুন এবং কেবল কল করুন roll()। আমি এই উত্তরটি স্পষ্ট করতে সম্পাদনা করতে পারি।
user949300

3

ডাইস ক্লাসের বিশেষ ক্ষেত্রে আমি মনে করি স্ট্যাটিক্সের পরিবর্তে উদাহরণ পদ্ধতি ব্যবহার করা টেস্টিংকে সহজতর করে তুলবে।

আপনি যদি ডাইসের উদাহরণ (যেমন একটি গেম ক্লাস) ব্যবহার করে এমন কিছু পরীক্ষা করতে চান তবে আপনার পরীক্ষাগুলি থেকে আপনি ডাইসের পরীক্ষার দ্বিগুণ কিছু ফর্ম ইনজেকশন করতে পারেন যা সর্বদা মানগুলির একটি নির্দিষ্ট ক্রম দেয়। আপনার পরীক্ষাটি পরীক্ষা করতে পারে যে সেই ডাইস রোলগুলির জন্য গেমটির সঠিক ফলাফল রয়েছে।

আমি জাভা বিকাশকারী নই তবে আমি মনে করি এটি সম্পূর্ণ স্ট্যাটিক ডাইস ক্লাসের সাথে করা তাত্পর্যপূর্ণভাবে কঠিন হবে। Https://stackoverflow.com/questions/4482315/why-does-mockito-not-mock-static- স্মৃতিচারণ দেখুন


কেবলমাত্র রেকর্ডের জন্য: জাভাতে আমাদের বাইট কোডটি পরিচালনা করে স্থির নির্ভরতা প্রতিস্থাপনের পাওয়ারমক রয়েছে । তবে এটির
ব্যবহারটি

0

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

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

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