একক দায়িত্বের ধরণটি ক্লাসগুলির জন্য কতটা নির্দিষ্ট হওয়া উচিত?


14

উদাহরণস্বরূপ, ধরুন আপনার কাছে একটি কনসোল গেম প্রোগ্রাম রয়েছে, এতে কনসোল থেকে এবং সমস্ত ধরণের ইনপুট / আউটপুট পদ্ধতি রয়েছে। এটা তাদের সমস্ত একটি একক রাখা স্মার্ট হতে চান inputOutputবর্গ বা মত আরো নির্দিষ্ট শ্রেণীর তাদের ভেঙ্গে startMenuIO, inGameIO, playerIO, gameBoardIO, প্রতিটি বর্গ 1-5 পদ্ধতিগুলির হয়েছে ইত্যাদি যে?

এবং একই নোটে, যদি এগুলি ভেঙে ফেলা আরও ভাল হয় তবে তাদের কোনও IOনামস্থানে রেখে দেওয়া কি স্মার্ট হবে যাতে তাদের কলিংটিকে আরও কিছুটা ভার্বোজ বলা যায়, যেমন: IO.inGameইত্যাদি?



সম্পর্কিত: ইনপুট এবং আউটপুট একত্রিত করার জন্য আমি কখনও ভাল কারণ দেখিনি। এবং যখন আমি ইচ্ছাকৃতভাবে এগুলি পৃথক করি তখন আমার কোডটি আরও পরিষ্কার পরিস্কার করে।
হাঁস

1
আপনি কোন ভাষাতে নিম্নতর ক্যামেলকেসে ক্লাসের নাম রাখেন?
ব্যবহারকারী 253751

উত্তর:


7

আপডেট (পুনরুদ্ধার)

যেহেতু আমি বরং একটি ভার্জিক উত্তর লিখেছি, এখানে এটি সমস্ত কীভাবে এটিকে ফুটিয়ে তোলে:

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

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

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

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

আমি তখন এই বিষয়গুলি হ্যান্ডলার অবজেক্টে ইনজেক্ট করব যা কাঁচা আইওকে আমার অ্যাপ্লিকেশন লজিক দিয়ে কাজ করতে পারে এমন কিছুতে মানচিত্র তৈরি করবে (যেমন: ব্যবহারকারী চাপুন "ডাব্লু" , হ্যান্ডলারের মানচিত্রগুলি যেটিতে MOVE_FORWARD)।

এই হ্যান্ডলারগুলি পরিবর্তে অক্ষরগুলি সরানো এবং সেই অনুযায়ী স্ক্রিন আঁকতে ব্যবহৃত হয়। একটি স্থূল ওভারসিম্প্লিফিকেশন, তবে এর সংক্ষিপ্তসারটি এই ধরণের কাঠামো:

[ IO.Keyboard.InGame ] // generic, if SoC and SRP are strongly adhered to, changing this component should be fairly easy to do
   ||
   ==> [ Controls.Keyboard.InGameMapper ]

[ Game.Engine ] <- Controls.Keyboard.InGameMapper
                <- IO.Screen
                <- ... all sorts of stuff here
    InGameMapper.move() //returns MOVE_FORWARD or something
      ||
      ==> 1. Game.updateStuff();//do all the things you need to do to move the character in the given direction
          2. Game.Screen.SetState(GameState); //translate the game state (inverse handler)
          3. IO.Screen.draw();//generate actual output

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

প্রতিটি একক শ্রেণীর একক কাজ থাকে: কীবোর্ড ইনপুট হ্যান্ডলিং এমন শ্রেণীর দ্বারা সম্পন্ন হয় যা জানেন না / যত্ন করে না / জানেন যে ইনপুটটির প্রক্রিয়াকরণটির অর্থ কী। এটি কেবল কীভাবে ইনপুট পেতে হবে তা নিশ্চিত (বাফারড, আনফফার্ড, ...)।

হ্যান্ডলার এটিকে এই তথ্যটি বোঝার জন্য বাকী অ্যাপ্লিকেশনটির জন্য অভ্যন্তরীণ উপস্থাপনায় অনুবাদ করে into

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

এই বিষয়গুলি তারপরে তাদের অবস্থাটিকে রিলে করে দেয় এবং এই ডেটাটি চলে যায় Game.Screen, যা মূলত একটি বিপরীত আইও হ্যান্ডলার। এটি IO.Screenপ্রকৃত আউটপুট উত্পন্ন করতে উপাদানটি ব্যবহার করতে পারে এমন কিছুতে অভ্যন্তরীণ প্রতিনিধিত্বকে মানচিত্র করে ।


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

@ কুহাকু: এরা নামস্থান। আমি যা বলছি তার মূল বক্তব্যটি হ'ল আপনি যদি প্রয়োগের কোন অংশের উপর ভিত্তি করে সাবক্লাস তৈরি করতে চান, আপনি কার্যকরভাবে দৃly়ভাবে আপনার অ্যাপ্লিকেশন যুক্তির সাথে বেসিক আইও কার্যকারিতা সংযুক্ত করছেন। অ্যাপ্লিকেশনটির কার্যক্রমে আইওর জন্য দায়বদ্ধ ক্লাসগুলি শেষ করবেন । এটি আমার কাছে এসআরপি লঙ্ঘনের মতো শোনাচ্ছে। নাম বনাম নেমস্পিড ক্লাসগুলির জন্য: আমি 95% সময়ের নামস্থান পছন্দ করি
ইলিয়াস ভ্যান ওটেজেম

আমি আমার উত্তর আপডেট করেছি, আমার উত্তরটির সংক্ষিপ্ত বিবরণ হিসাবে
এলিয়াস ভ্যান ওটেজেম

হ্যাঁ এটিই আসলে আমার আরেকটি সমস্যা (যুক্তি দিয়ে আইও সংযুক্ত করে), সুতরাং আপনি কি আউটপুট থেকে ইনপুট আলাদা করার পরামর্শ দিচ্ছেন?
shinzou

@ কুহাকু: আপনি যা করছেন এবং ইনপুট / আউটপুট স্টাফগুলি কতটা জটিল তা নির্ভর করে really যদি হ্যান্ডলারগুলি (গেম স্টেট বনাম কাঁচা ইনপুট / আউটপুট অনুবাদ করে) খুব বেশি পার্থক্য করে, তবে আপনি সম্ভবত ইনপুট এবং আউটপুট ক্লাসগুলি আলাদা করতে চাইবেন, যদি না হয় তবে একটি আইও ক্লাস ভাল আছে
এলিয়াস ভ্যান ওটেজেম

23

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

একটি রাস্তা যানবাহন, সাধারণত চার চাকা সহ একটি অভ্যন্তরীণ জ্বলন ইঞ্জিন দ্বারা চালিত।

তারপরে আপনি "যানবাহন", "রাস্তা", "চাকা" ইত্যাদির মতো জিনিসগুলি আলাদাভাবে সংজ্ঞায়িত করবেন। আপনি বলার চেষ্টা করবেন না:

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

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


অনেকের পরিবর্তে কয়েকটি শব্দ দিয়ে গাড়ি সংজ্ঞায়িত করার মতো, তবে ছোট নির্দিষ্ট তবে অনুরূপ শ্রেণীর সংজ্ঞা দেওয়া কি ঠিক?
shinzou

2
@কুহাকু: ছোট ভাল। নির্দিষ্ট ভাল। আপনি এটি শুকনো রাখুন ততক্ষণ ঠিক একইরকম। আপনি আপনার ডিজাইনটি পরিবর্তন করা সহজ করার চেষ্টা করছেন। জিনিসগুলিকে ছোট এবং নির্দিষ্ট রাখলে কোথায় পরিবর্তন করা যায় তা আপনাকে সহায়তা করে। এটিকে ডিআরওয়াই রাখলে অনেক জায়গাতে পরিবর্তন এড়ানো যায় helps
ভোঁ ক্যাটো

6
আপনার দ্বিতীয় বাক্যটি "জঘন্য, শিক্ষক বলেছিলেন এটির 4 পৃষ্ঠার হওয়া দরকার ... 'উদ্দেশ্য শক্তি উত্পন্ন করে' এটি !!"
corsiKa

2

আমি বলব যে যাওয়ার সবচেয়ে ভাল উপায় হ'ল তাদের আলাদা ক্লাসে রাখা keep ছোট ক্লাসগুলি খারাপ হয় না, আসলে বেশিরভাগ সময় তারা ভাল ধারণা হয়।

আপনার সুনির্দিষ্ট ক্ষেত্রে আমি মনে করি যে আলাদা হওয়া আপনাকে অন্যের উপর প্রভাব ফেলে না করে specific নির্দিষ্ট হ্যান্ডলারের কোনওটির যুক্তি পরিবর্তন করতে সহায়তা করতে পারে এবং যদি প্রয়োজন হয় তবে নতুন ইনপুট / আউটপুট পদ্ধতিটি যদি আসে তবে এটি আপনার পক্ষে সহজ হবে।


0

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

আপনার প্রশ্নের উত্তর দিতে, আমাকে আপনাকে একটি প্রশ্ন জিজ্ঞাসা করতে হবে: আপনার ক্লাসের পরিবর্তনের একমাত্র কারণ আছে কি? যদি তা না হয়, তবে প্রত্যেকের কেবলমাত্র পরিবর্তনের একটি কারণ না হওয়া পর্যন্ত আরও বিশেষীকৃত ক্লাস যুক্ত করা চালিয়ে যেতে ভয় পাবেন না।

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