সমস্ত এনামগুলিকে একটি ফাইলে অন্তর্ভুক্ত করে একাধিক ক্লাসে ব্যবহার করা কি খারাপ অভ্যাস?


12

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

ধরা যাক আমার কাছে একটি ফাইল আছে enumList.hযেখানে আমি আমার গেমটিতে যে সমস্ত এনাম ব্যবহার করতে চাই তা ঘোষণা করি:

// enumList.h

enum materials_t { WOOD, STONE, ETC };
enum entity_t { PLAYER, MONSTER };
enum map_t { 2D, 3D };
// and so on.

// Tile.h
#include "enumList.h"
#include <vector>

class tile
{
    // stuff
};

মূল ধারণাটি হ'ল আমি গেমের সমস্ত এনামগুলিকে 1 ফাইলে ডিক্লেয়ার করি এবং তারপরে যখন আমার এটি ব্যবহার করা দরকার সেই ফাইলে এটির ঘোষণার পরিবর্তে যখন আমাকে একটি নির্দিষ্ট এনাম ব্যবহার করতে হবে তখন সেই ফাইলটি আমদানি করি। আমি এটি করি কারণ এটি জিনিসগুলি পরিষ্কার করে দেয়, কেবলমাত্র একটি এনাম অ্যাক্সেস করার জন্য পৃষ্ঠাগুলি খোলা রেখে আমি 1 টি জায়গায় প্রতিটি এনামকে অ্যাক্সেস করতে পারি।

এটি কি একটি খারাপ অভ্যাস এবং এটি কোনও উপায়ে কর্মক্ষমতাকে প্রভাবিত করতে পারে?


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

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

4
এটি অ্যাপ্লিকেশন কর্মক্ষমতা প্রভাবিত করবে না, তবে এটি সংকলনের সময় নেতিবাচক প্রভাব ফেলবে। উদাহরণস্বরূপ, আপনি যদি এমন materials_tফাইলগুলিতে কোনও উপাদান যুক্ত করেন যা উপকরণগুলিতে লেনদেন করে না তবে পুনর্নির্মাণ করতে হবে।
রোবট

14
এটি চেয়ার ঘরে আপনার বাড়ির সমস্ত চেয়ার রাখার মতো, সুতরাং আপনি যদি বসতে চান তবে কোথায় যেতে হবে তা আপনি জানেন।
কেভিন

এক সরকারী হিসাবে, আপনি প্রতিটি এনামকে তার নিজের ফাইলে রেখে এবং সেই ফাইলগুলির জন্য একটি সংগ্রহ হিসাবে পরিবেশন করে সহজেই উভয় করতে পারেন । এটি এমন ফাইলগুলিকে সরাসরি এটি পেতে কেবল একটি এনামের প্রয়োজন হয়, এমন কিছুর জন্য একটি একক প্যাকেজ সরবরাহ করে যা সত্যই তাদের সমস্ত চায়। enumList.h#include
জাস্টিন সময় - মনিকা

উত্তর:


35

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

এম্পমটি দ্রুত খুঁজে পেতে এবং নির্দিষ্ট কার্যকারিতাটির আচরণগত কোডের সাথে এটির গোষ্ঠীকরণের জন্য আমার প্রতি একক ফাইল থাকত (যেমন উপাদানগুলির আচরণ যেমন ফোল্ডারে উপাদানগুলি এনাম);

মূল ধারণাটি হ'ল আমি গেমের সমস্ত এনামগুলিকে 1 ফাইলে ডিক্লেয়ার করি এবং তারপরে যখন আমার এটি ব্যবহার করা দরকার সেই ফাইলে এটির ঘোষণার চেয়ে আমাকে যখন এটি থেকে একটি নির্দিষ্ট এনাম ব্যবহার করতে হবে তখন আমি সেই ফাইলটি আমদানি করি। আমি এটি করি কারণ এটি জিনিসগুলি পরিষ্কার করে দেয়, কেবলমাত্র একটি এনাম অ্যাক্সেস করার জন্য পৃষ্ঠাগুলি খোলা রেখে আমি 1 টি জায়গায় প্রতিটি এনামকে অ্যাক্সেস করতে পারি।

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


2
গ্রানুলারিটির উল্লেখ করার জন্য +1, আমি অন্যান্য উত্তরগুলি বিবেচনায় নিয়েছি তবে আপনি একটি ভাল বক্তব্য রেখেছেন।
বাগস্টার

এনাম প্রতি একক ফাইলের জন্য +1। এটির জন্য এটি সন্ধান করা সহজ।
মরিস

11
এক জায়গায় ব্যবহৃত একক এনাম মান যুক্ত করার ফলে আপনার পুরো প্রকল্পের প্রতিটি ফাইল পুনর্নির্মাণের কারণ হবে।
9:58

সদুপদেশ. আপনি যাইহোক যাইহোক আমার মন পরিবর্তন করেছেন .. আমি সর্বদা CompanyNamespace.Enums যেতে পছন্দ করতাম .... এবং একটি সহজ তালিকা পাওয়া, তবে যদি কোড কাঠামোটি শৃঙ্খলাবদ্ধ হয় তবে আপনার পদ্ধতির আরও ভাল
ম্যাট ইভান্স

21

হ্যাঁ, এটি খারাপ অনুশীলন, পারফরম্যান্সের কারণে নয়, রক্ষণাবেক্ষণের কারণে।

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

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


3
সত্য; 'কেবল ওসিডিতে "অনুরূপ জিনিসগুলি একসাথে সংগ্রহ করুন" উপায়ে "। আমি পারলে 100 টি আপভোট।
ডগওয়েদার

আমি যদি করতে পারি তবে আমি বানানটি সম্পাদনা করতে সহায়তা করতাম, তবে আপনি এসই 'সম্পাদনা' প্রান্তিকের উপর পেতে যথেষ্ট ত্রুটি করেননি। :
পি

আকর্ষণীয় যে প্রায় সমস্ত ওয়েব ফ্রেমওয়ার্কগুলিতে বৈশিষ্ট্যটির পরিবর্তে টাইপ করে ফাইল সংগ্রহ করা দরকার।
কেভিন cline

@ কেভিঙ্কলাইন: আমি "প্রায় সমস্ত" বলব না - কেবল সেগুলি যা কনভেনশন-ওভার-কনফিগারেশনের উপর ভিত্তি করে তৈরি করা হয় এবং সাধারণত তাদের মধ্যে একটি মডিউল ধারণাও রয়েছে যা গ্রুপিং কোডকে কার্যত অনুমতি দেয়।
মাইকেল বর্গওয়ার্ট

8

ঠিক আছে, এটি কেবল ডেটা (আচরণ নয়)। সম্ভবত / তাত্ত্বিকভাবে ঘটতে পারে এমন সবচেয়ে খারাপটি হ'ল একই কোডটি তুলনামূলকভাবে বৃহত্তর প্রোগ্রাম উত্পাদন করার চেয়ে একাধিকবার অন্তর্ভুক্ত এবং সংকলিত হয়।

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

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

আইএমএইচও, কোনও একক ফাইলের সাথে আপনি যে সুবিধাগুলি পান (আরও পঠনযোগ্য এবং আরও পরিচালনাযোগ্য কোড) মূলত কোনও সম্ভাব্য ত্রুটি অতিক্রম করে।


5
আপনি একটি খুব ভাল পয়েন্ট দিয়েছেন যে আমার কাছে মনে হয় আরও জনপ্রিয় উত্তরগুলি উপেক্ষা করা হচ্ছে - অবিচ্ছেদ্য ডেটার কোনও মিলন নেই।
মাইকেল শ

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

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

3

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

এইভাবে দেখুন, আপনি একটি সুপারমার্কেট কিনবেন না কারণ আপনার একটি কোকের ক্যান প্রয়োজন;)


3

আমি কোনও সি ++ দেব নই, সুতরাং এই উত্তরটি ওওএ এবং ডি-র কাছে আরও জেনেরিক হবে:

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

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

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

এই দৃষ্টিতে কেস: যদি আপনার কোড লাইব্রেরির কোনও বাস্তব-জগত ব্যবহার আপনি যদি এই একক "enumeration.h" ফাইলের মধ্যে রেখেছেন তবে বেশিরভাগ বা সমস্ত enumeration ব্যবহার করে জড়িত থাকে, তবে সমস্ত উপায়ে তাদের একসাথে গোষ্ঠীভুক্ত করুন; আপনি কোথায় পাবেন তা জানতে পারবেন। তবে যদি আপনার গ্রাহক কোডারটি সম্ভবত শিরোনামে সরবরাহ করছেন এমন ডজনখানেক গণনাগুলির মধ্যে কেবল একটি বা দু'জনের প্রয়োজন হতে পারে তবে আমি আপনাকে সেগুলি আলাদা লাইব্রেরিতে রাখার জন্য উত্সাহিত করব এবং বাকি গণনার সাথে এটি বৃহত্তরটির নির্ভরতা বানাতে চাই । এটি আপনার কোডারগুলিকে আরও একতরফা DLL এর সাথে লিঙ্ক না করে কেবল একটি বা দুটি তারা পেতে চায়।


2

যখন আপনার একাধিক বিকাশকারী একই কোড-বেসে কাজ করে তখন এই ধরণের জিনিসটি একটি সমস্যা হয়ে দাঁড়ায়।

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

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

আপনার সারাজীবন কার্গো কাল্ট প্রোগ্রামিং অনুশীলনের সাথে আটকা পড়ার চেয়ে কিছু ভুল করা এবং সেগুলি থেকে শেখা ভাল learn


1

হ্যাঁ, বড় প্রকল্পে এটি করা খারাপ অভ্যাস। চুমু খেতে হবে।

অল্প বয়স্ক সহকর্মী একটি কোর .h ফাইলে একটি সাধারণ ভেরিয়েবলের নামকরণ করেছিলেন এবং 100 ইঞ্জিনিয়াররা তাদের সমস্ত ফাইল পুনর্নির্মাণের জন্য 45 মিনিটের জন্য অপেক্ষা করেছিলেন, যা প্রত্যেকের কর্মক্ষমতাকে প্রভাবিত করে। ;)

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


আপনি পর্যালোচনা সিস্টেমটি ব্যবহার করছেন না যদি কেউ (অল্প বয়স্ক বা বৃদ্ধ, একই) সবাই (মজাদার বাইরে) সবাইকে প্রকল্প পুনর্নির্মাণ করতে পারে, আপনি না?
সান্টাকাস

1

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

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


আপনার সমস্ত গণনা একই ফাইলে সংযুক্ত করে তাদের একত্রে যুক্ত করে এবং এক্সটেনশনের মাধ্যমে কোডটি অন্য কোনও এনাম ব্যবহার করে কিনা তা নির্বিশেষে সমস্ত এনামের উপর নির্ভর করে যে এক বা একাধিক এনামের উপর নির্ভর করে code

#include "enumList.h"

// Draw map texture.  Requires map_t.
// Not responsible for rendering entities, so doesn't require other enums.
// Introduces two unnecessary couplings.
void renderMap(map_t, mapIndex);

renderMap()বরং এটি সম্পর্কে কেবল জানতে হবে map_t, কারণ অন্যথায় অন্যের যে কোনও পরিবর্তনগুলি এটির প্রভাব ফেলবে যদিও এটি অন্যদের সাথে বাস্তবে যোগাযোগ করে না।

#include "mapEnum.h" // Theoretical file defining map_t.

void renderMap(map_t, mapIndex);

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

#include "entityEnum.h"    // Theoretical file defining entity_t.
#include "materialsEnum.h" // Theoretical file defining materials_t.

// Can entity break the specified material?
bool canBreakMaterial(entity_t, materials_t);

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

// File: "actionEnums.h"

enum action_t { ATTACK, DEFEND, SKILL, ITEM };               // Action type.
enum skill_t  { DAMAGE, HEAL, BUFF, DEBUFF, INFLICT, NONE }; // Skill subtype.

// -----

#include "actionTypes.h" // Provides action_t & skill_t from "actionEnums.h", and class Action (which couples them).
#include "entityEnum.h"  // Theoretical file defining entity_t.

// Assume ActFlags is or acts as a table of flags indicating what is and isn't allowable, based on entity_t and Action.
ImplementationDetail ActFlags;

// Indicate whether a given type of entity can perform the specified action type.
// Assume class Action provides members type() and subtype(), corresponding to action_t and skill_t respectively.
// Is only slightly aware of the coupling; knows type() and subtype() are coupled, but not how or why they're coupled.
bool canAct(entity_t e, const Action& act) {
    return ActFlags[e][act.type()][act.subtype()];
}

তবে হায়রে ... এমনকি যখন দুটি এনাম একসাথে একত্রিত হয়, এমনকি যদি এটি "দ্বিতীয় এনাম প্রথম এনামের জন্য উপশ্রেণী সরবরাহ করে" এর মতো শক্ত কিছু হয়, তখনও এমন একটি সময় আসতে পারে যেখানে কেবল একটি এনামের প্রয়োজন হয়।

#include "actionEnums.h"

// Indicates whether a skill can be used from the menu screen, based on the skill's type.
// Isn't concerned with other action types, thus doesn't need to be coupled to them.
bool skillUsableOnMenu(skill_t);

// -----
// Or...
// -----

#include "actionEnums.h"
#include "gameModeEnum.h" // Defines enum gameMode_t, which includes MENU, CUTSCENE, FIELD, and BATTLE.

// Used to grey out blocked actions types, and render them unselectable.
// All actions are blocked in cutscene, or allowed in battle/on field.
// Skill and item usage is allowed in menu.  Individual skills will be checked on attempted use.
// Isn't concerned with specific types of skills, only with broad categories.
bool actionBlockedByGameMode(gameMode_t mode, action_t act) {
    if (mode == CUTSCENE) { return true; }
    if (mode == MENU) { return (act == SKILL || act == ITEM); }

    //assert(mode == BATTLE || mode == FIELD);
    return false;
}

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

// File: "materialsEnum.h"
enum materials_t { WOOD, STONE, ETC };

// -----

// File: "entityEnum.h"
enum entity_t { PLAYER, MONSTER };

// -----

// File: "mapEnum.h"
enum map_t { 2D, 3D };

// -----

// File: "actionTypesEnum.h"
enum action_t { ATTACK, DEFEND, SKILL, ITEM };

// -----

// File: "skillTypesEnum.h"
enum skill_t  { DAMAGE, HEAL, BUFF, DEBUFF, INFLICT, NONE };

// -----

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