নাম স্পেস সহ স্মারফ নামকরণের ক্লাসগুলি এড়ানো নিয়ে সমস্যা The


39

আমি এখান থেকে স্মুরফ নামকরণ শব্দটি টানলাম (21 নম্বর)। যে কেউ পরিচিত না কষ্ট সংরক্ষণ করতে, Smurf নামকরণ একটি সাধারণ উপসর্গ সঙ্গে সম্পর্কিত ক্লাস, ভেরিয়েবল, ইত্যাদি একটি গুচ্ছ prefixing আইন যাতে আপনি সঙ্গে "একটি শেষ পর্যন্ত SmurfAccountViewএকটি পাস SmurfAccountDTOথেকে SmurfAccountController", ইত্যাদি

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

  1. আমি একটি Configurationক্লাস সহ একটি লাইব্রেরি নিয়ে কাজ করছি । এটি বলা যেতে পারে WartmongerConfigurationতবে এটি ওয়ার্টমোনজার নেমস্পেসে রয়েছে, তাই এটি কেবল বলা হয়েছে Configuration। আমার একইভাবে একটি Configurationক্লাস রয়েছে যা বলা যেতে পারে SmurfConfiguration, তবে এটি স্মুরফ নেমস্পেসে রয়েছে যাতে তা অনর্থক হয়। আমার কোডে এমন জায়গাগুলি রয়েছে যেখানে Smurf.Configurationপাশাপাশি প্রদর্শিত হয় Wartmonger.Configurationএবং পুরোপুরি যোগ্যতাসম্পন্ন নাম টাইপ করে আটকানো হয় এবং কোডটি কম পাঠযোগ্য হয়। এটির সাথে লেনদেন করা ভাল হবে SmurfConfiguration(যদি এটি আমার কোড এবং একটি লাইব্রেরি না হয়) WartmongerConfiguration

  2. Serviceআমার স্মুরফ নেমস্পেসে আমার কাছে একটি ক্লাস রয়েছে যা কল করা যেতে পারে SmurfService। একটি জটিল স্মুর লাইব্রেরির উপরে Serviceএকটি মুখোমুখি যা স্মুরফ কাজগুলি চালায়। SmurfServiceএকটি ভাল নামের মতো বলে মনে হচ্ছে কারণ Serviceস্মুরফের উপসর্গ ব্যতীত অবিশ্বাস্যভাবে জেনেরিক। আমি গ্রহণ করতে পারি যে SmurfServiceএটি ইতিমধ্যে একটি জেনেরিক, অকেজো নাম এবং স্মুরফ কেড়ে নেওয়া কেবল এটিকে আরও স্পষ্ট করে তুলেছে। কিন্তু এটা নামে যেত Runner, Launcherইত্যাদি এবং এটি এখনও আমার কাছে "ভালো বোধ করবে" SmurfLauncherকারণ আমি জানি না কি Launcherকরে, কিন্তু আমি জানি কি একটা SmurfLauncherআছে। আপনি তর্ক করতে পারেন যে একটি কি Smurf.Launcherঠিক যেমন স্পষ্ট হওয়া উচিতSmurf.SmurfLauncher, তবে আমি দেখতে পেলাম `স্মুরফ.ল্যাঞ্চার স্মার্টফ আরম্ভ করে এমন এক ক্লাসের চেয়ে সেটআপ সম্পর্কিত কোনও ধরণের ক্লাস class

যদি এগুলির যে কোনও একটির সাথে মোকাবিলা করার জন্য যদি মুক্ত ও শট উপায় থাকে তবে দুর্দান্ত would যদি তা না হয় তবে তাদের বিরক্তি প্রশমিত করার জন্য কিছু সাধারণ অভ্যাস কী?


3
Smurf.Launcherস্মারফগুলি কি লঞ্চ করে, না এটি লঞ্চ করে SmurfJob? সম্ভবত এটি বলা যেতে পারে Smurf.JobLauncher?
ব্লগারবার্ড

2
এটি একটি কোডের গন্ধ যা কোনও ক্লাসের XService, XManager ইত্যাদির নামকরণ করে These এগুলির কোনও অর্থ নেই। এটি ইউটিলের মতো। আপনি যদি ফাইলের নামগুলি স্কিমিং করে থাকেন তবে সেখানে কিছু থাকতে পারে বা সেখান থেকে হারিয়ে যেতে পারে। ভিতরে না তাকালে জানার উপায় নেই। আমি এটিকে স্মার সার্ভিসেস থেকে পুরোপুরি নতুন কিছুতে নামকরণ করেছি।
ড্যানিয়েল কাপলান

1
এটি আসলে SmurfJobগুলি আরম্ভ করে না , বা প্রযুক্তিগতভাবে তাদের স্মুরফ ডকুমেন্টেশনের ভাষার সাথে সামঞ্জস্য রাখতে চালায়। এটি এবং অন্যান্য উত্তরগুলির আলোকে, আমি নামকরণ SmurfServiceকরতে যাচ্ছি SmurfJobRunner। মনে হচ্ছে 1 নম্বরটির কোনও ভাষা অজ্ঞায়নের সর্বোত্তম রেজোলিউশন নেই I আমি উদাহরণগুলি দেখতে পাচ্ছি যেখানে যেখানে SmurfConfigurationযেতে হবে তা সঠিক কল হবে তবে আমার ক্ষেত্রে আমি মনে করি Configurationঝামেলা সহকারেও সবচেয়ে ভাল Wartmonger.Configuration
ড্যানিয়েল কোভারম্যান

6
আমি কেন আপনার কাছে একটি একক শ্রেণি রয়েছে তা বোঝার চেষ্টা করছি যা ওয়ার্টমনগার এবং স্মুরফ উভয়কেই কনফিগার করার বিষয়ে চিন্তা করে।
ডোনাল ফেলো

কেন Smurf.Configurationএবং SmurfConfigurationআলাদা মনে হয়? নিশ্চয়ই এটি অতিরিক্ত চর নয়, তাই না? ( Configদৈর্ঘ্যে যদি সমস্যা হয় তবে সংক্ষিপ্ত করুন )) Smurf.Configurationএমন কোনও সমস্যা আছে যা SmurfConfigurationনা?
পাবলো এইচ

উত্তর:


16

আপনি কিছু ভাল পয়েন্ট উত্থাপন।

  1. সদৃশ ক্লাস থাকার বিষয়ে, আপনি C # তে উলামা ক্লাস করতে পারেন। উদাহরণস্বরূপ ব্যবহার করুন স্ট্যাক ওভারফ্লোতে এই পোস্টটিusing ColorScheme = The.Fully.Qualified.Namespace.Outlook2007ColorScheme; দেখুন । আপনি আপনার প্রোগ্রামিংয়ের ভাষা নির্দেশ করেননি তবে আপনি যা লিখেছেন তা থেকে আমি এটি অনুমান করেছি। সুতরাং যেখানে আপনি দুটি পৃথক প্রকল্পের সাথে কাজ করছেন, আপনি এটিকে উপন্যাস হিসাবে দিতে পারেন এবং যা উভয় শ্রেণীর গ্রাস করার সময় অস্পষ্টতা মুক্ত করবে।SmurfConfigurationWartmongerConfiguration

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

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


5
উপনামগুলি কেবল জিনিসগুলিকে বিশৃঙ্খলা করে। স্মুরফ.সেসওয়ারের পরিবর্তে আপনার এখন স্মুরফসওয়ার = স্মারফ.সেসওয়ার রয়েছে। সুতরাং আপনার পাশাপাশি প্রথমে জিনিসটির নাম হিসাবে স্মার সার্ভিস থাকতে পারে। তাদের একটি জায়গা আছে, তবে এই বিশেষ সমস্যার জন্য নয়। তবে এটির কোনও উত্তর নেই এমন সমস্যার সম্ভবত এটি সেরা উত্তর :)
gbjbaanb

.আমার মধ্যে সি # আমার প্রশ্নে বেরিয়ে এসেছিল, তবে আমি বর্তমানে জাভা এবং org.apache.smurfville.wartmonger.configuration। দুর্ভাগ্যক্রমে এটি উপকরণগুলিকে বাতিল করে দেয়। 2 একটি শক্ত পয়েন্ট, সুতরাং আমি পরিষেবাটির জন্য স্মুরফ ব্র্যান্ডিং রাখব keep
ড্যানিয়েল কোভারম্যান

25

নেমস্পেসের বিন্দুটি তাই আপনি বিভিন্ন লাইব্রেরি থেকে সংঘর্ষ না করে একই নামের ক্লাস রাখতে পারেন। যখন আপনার উভয় থেকে একই নামযুক্ত শ্রেণিটি ব্যবহার করার দরকার পড়ে তখন আপনার নামের স্পেসের সাথে একটি বা উভয়কে উপস্থাপন করে অস্পষ্টতাটি সরিয়ে ফেলতে হবে।

এটি বলেছিল, স্মুরফ ক্লাস সম্পর্কে নির্দিষ্ট কিছু বললে স্মুরফের একগুচ্ছ ক্লাস করা আসলে খারাপ নয় really শ্রেণীর নামগুলি বর্ণনামূলক পর্যায়ে হওয়া উচিত যা আপনাকে ক্লাসটি কী করে সে সম্পর্কে কিছু তথ্য দেয়।

      Session
       ^   ^
      /     \
DBSession   HttpSession

একইভাবে একটি DBSessionকোনও DBRequestবস্তু গ্রহণ করতে পারে যা কোনও DBResponseবস্তুকে রিটার্ন দেয় । HttpSessionযথাসাধ্য এছাড়াও কাজ HttpRequestএবং HttpResponseবস্তু।

এগুলি একটি উদ্দেশ্য সহ স্মুরফ ক্লাস।

তারা বাস পারে MyCompanyনামস্থান কিন্তু MyCompanyHttpSessionএবং MyCompanyDBSessionতুলনায় আপনি আগে ছিল আপনি কোনো অধিক তথ্য দেয় না। এক্ষেত্রে স্মুরফ ফেলে দিন এবং এটিকে একটি নেমস্পেস করুন।

MyCompany.HttpSession

3

আমি এই একই বিভ্রান্তির বিরুদ্ধে আগে দৌড়েছি এবং এটি সাধারণত এটির একটি প্রশ্নের নাম হিসাবে এটি কী ধরণের জিনিস রয়েছে তা অন্তর্ভুক্ত করে ফেলা উচিত question

আপনি উল্লেখ SmurfConfigurationএবং WartmongerConfigurationসম্ভাব্য ধরণের কনফিগারেশন হিসাবে। আপনি ইঙ্গিত করেছেন যে আপনি বিশেষণটি (এর ধরণের) এর নাম স্থানটিতে সরিয়েছেন যাতে আপনি যা রেখে গেছেন তা কেবল ভ্যানিলা হয়ে যায় Configuration। আমি এটা করা এড়াতে হবে।

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

আসুন কল্পনা করুন যে আপনার অ্যাপ্লিকেশনটিতে, আপনি Strawberry.IceCreamক্লাসটি আমদানি করেন এবং তারপরে সরাসরি এখান থেকে ইনস্ট্যান্ট করা শুরু করেন IceCream

var ic = new IceCream(); //actually I'm strawberry ice cream

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

var sic = new StrawberryIceCream();
var cic = new ChocolateIceCream();

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


2

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

1) নাম স্থানটির নাম রেখেছি, যদিও আমি এটি সংক্ষিপ্ত করে এবং বিন্দুতে, যে কোনও প্রাকৃতিক সংক্ষেপণ, এমনকি এমনকি মাত্র 1 টি অক্ষর:

using Sm = Smurf;
using W = Wartmonger;

তারপরে সর্বদা ব্যবহৃত যেখানেই উপসর্গ এবং নাম যথাযথভাবে প্রয়োগ করুন:

Sm::Configuration smConf; 
W::Configuration wConf;

2) ক্লাসের অন্যান্য নাম যেমন উত্তর দেওয়া হয়েছে তেমন।

using SmConf = Smurf.Configuration;

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

৪) রিফ্যাক্টর কোড যাতে আপনাকে দুটি ভিন্ন জায়গা থেকে কনফিগারেশনের ব্যবহার মেশাতে না হয়। যে বিবরণ আপনার উপর নির্ভর করে।

5) আপনি আপনার ক্লাসে পাস করার আগে দুটি কনফিগারেশন একত্রিত করুন। উপস্থাপনের জন্য একটি সম্মিলিত বিভক্ত শ্রেণি ব্যবহার করুন:

struct Conf {
    SmurfConfiguration smurf;
    WartmongerConfiguation wart;
}

সংক্ষিপ্ত সদস্যের পরিবর্তনশীল নামগুলি এখন শ্রেণি / নেমস্পেসের বিকল্প হিসাবে একই জিনিস অর্জনের ধরণ।


0

আপনাকে বিরক্তিকর নামের মধ্যে একটি পয়েন্ট যুক্ত করা অবাক লাগে।

Wartmonger.Configuration configuration = Wartmonger.Configuration .new();

// vs

WartmongerConfiguration configuration = WartmongerConfiguration.new();

যদি উভয় Smurfএবং Wartmongerকনফিগারেশন একসাথে ব্যবহার করা হয় তবে পৃথকভাবে সেগুলি একাধিক স্থানে ব্যবহার করা হয় - তবে নেমস্পেস অবশ্যই স্পষ্টরূপে ভাল।

নামস্থান রয়ে অভ্যন্তরীণ কোডে ব্যবহার "পরিষ্কার" নাম, যেখানে উপসর্গ সঙ্গে আপনি ব্যবহার শেষ করতে সম্ভাবনা দেব SmurfConfigurationভিতরে SmurfService'র অভ্যন্তরীণ কোড, যা হতে পারে বিরক্তিকর সব আপনি যে কোড খুলবে।

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