সি ++ [বন্ধ] তে নেমস্পেস ব্যবহার করার জন্য সেরা অনুশীলন


38

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

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

নেমস্পেসে স্পষ্টভাবে সংজ্ঞায়িত দায়িত্ব সহ অনেক ক্ষুদ্র সত্তা তৈরির ধারণাটি প্রয়োগ করা কি বোধগম্য? সম্পর্কিত ক্লাসের একটি ছোট গ্রুপকে সর্বদা একটি নেমস্পেসে আবৃত করা উচিত? প্রচুর ক্ষুদ্র ক্লাস থাকার জটিলতাটি পরিচালনা করার উপায় কি এইরকম, বা প্রচুর নেমস্পেস পরিচালনা করার ব্যয় প্রতিরোধমূলক হতে পারে?

সম্পাদনা: প্যাকেজ নীতিগুলি সম্পর্কে এই প্রশ্নের উইকিপিডিয়ায় আমার প্রশ্নের উত্তর দেওয়া আছে ।


7
একটি ভাল, এবং বাস্তব-বিশ্বের বিকাশকারী প্রশ্নের অন্য একটি উদাহরণ বন্ধ । এটি যদি বিকাশকারীদের সেরা অনুশীলনগুলি জিজ্ঞাসা করার জন্য স্ট্যাকেক্সচেঞ্জের সাইট না হয় তবে কী?
স্যাম গোল্ডবার্গ

@ সামগোল্ডবার্গ: এটি আরও ভাল হয়। আমি এই প্রশ্নের এখানে একটি ভাল উত্তর পেয়েছি: en.wikedia.org/wiki/Package_Pr پرنسپلز । আমি এই উত্তরটি পোস্ট করেছি এবং একজন পরিচালক এটি মুছে ফেলেছিলেন, কারণ আমি কেবল লিঙ্কটি পোস্ট করেছি এবং সামগ্রীটি অনুলিপি / আটকানোর সময় নেই।
ডিমা

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

উত্তর:


22

(আমি ক্লিন কোড পড়িনি এবং খুব বেশি জাভা জানি না))

নেমস্পেসে স্পষ্টভাবে সংজ্ঞায়িত দায়িত্ব সহ অনেক ক্ষুদ্র সত্তা তৈরির ধারণাটি প্রয়োগ করা কি বোধগম্য?

হ্যাঁ, এটি যেমন একাধিক ক্লাস এবং একাধিক ফাংশনগুলিতে রিফ্যাক্টরিং করে।

সম্পর্কিত ক্লাসের একটি ছোট গ্রুপকে সর্বদা একটি নেমস্পেসে আবৃত করা উচিত?

আসলে উত্তর না দিয়ে: হ্যাঁ, আপনার কমপক্ষে একটি শীর্ষ-স্তরের নেমস্পেস ব্যবহার করা উচিত। এটি প্রকল্প, সংস্থা বা আপনি যা পছন্দ করেন তার উপর ভিত্তি করে তৈরি হতে পারে তবে কয়েকটি বিশ্বব্যাপী নাম ব্যবহার করা নামের দ্বন্দ্ব হ্রাস করবে। এর অধীনে থাকা সমস্ত কিছুর গোষ্ঠীকরণের একক নেমস্পেস কেবল একটি বৈশ্বিক নাম পরিচয় করে। (বহিরাগত "সি" ফাংশন ব্যতীত, তবে এটি সি আন্তঃআযোগিতার কারণে এবং কেবলমাত্র অন্যান্য বহিরাগত "সি" ফাংশনকে প্রভাবিত করে))

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

প্রচুর ক্ষুদ্র ক্লাস থাকার জটিলতা পরিচালনা করার উপায় কি এইরকম, বা প্রচুর নেমস্পেস পরিচালনা করার ব্যয়টি প্রতিরোধমূলক হতে পারে?

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

নেমস্পেসের উপাধি আপনাকে নির্দিষ্ট প্রসঙ্গে দীর্ঘ নামের জায়গার জন্য একটি সংক্ষিপ্ত নাম ব্যবহার করতে দেয়, যা আবার সহজ ব্যবহারের অনুমতি দেয়:

void f() {
  namespace CWVLN = Company_with_very_long_name;  // Example from the standard.
  // In this scope, use CWVLN::name instead of Company_with_very_long_name::name.
  namespace fs = boost::filesystem;  // Commonly used.
}

বুস্টকে বিবেচনা করুন, যার একক রুট নেমস্পেস, বুস্ট এবং তারপরে অনেকগুলি উপ-স্পেস - বুস্ট :: এশিয়া, বুস্ট :: আইও, বুস্ট :: ফাইল সিস্টেম, বুস্ট :: টিপলস ইত্যাদি - বিভিন্ন লাইব্রেরির জন্য বিবেচনা করুন। কিছু নাম রুট নেমস্পেসে "প্রচারিত" হয়:

সমস্ত সংজ্ঞা নেমস্পেস :: বুস্ট :: টিপলসগুলিতে, তবে সর্বাধিক সাধারণ নামগুলি ঘোষণার সাহায্যে নামস্পেস :: বুস্টে তোলা হয়। এই নামগুলি: টিপল, মেক_টুপল, টাই এবং পান। আরও, রেফ এবং ক্রেফ সরাসরি :: বুস্ট নেমস্পেসের অধীনে সংজ্ঞায়িত করা হয়।

"রিয়েল" মডিউলগুলির সাথে ভাষাগুলির মধ্যে সবচেয়ে বড় পার্থক্য হ'ল চাটুকার কাঠামো ব্যবহার করা কতটা সাধারণ mostly


এক লাইনের উত্তরের পরিবর্তে সম্পূর্ণ বিশ্লেষণের জন্য +1 @ ফ্রেড নুরক। প্রশ্নটি কী তা জানতে আপনাকে বইটি পড়তে হবে না। এই মন্তব্য থ্রেডটি একটি সি ++ এবং জাভা প্রোগ্রামার এই বইটিতে থাকতে পারে এমন ধারণা এবং পার্থক্য প্রকাশ করে। অ্যামাজনে ক্লিন কোড মন্তব্য
মার্লন

8

আপনার সমস্ত কোডের জন্য আপনার এক মাস্টার নেমস্পেস থাকা উচিত। এটি এটিকে নেমস্পেসের সাথে সম্মত করে বাহ্যিক কোড থেকে পৃথক করে।

আকার এবং জটিলতার উপর নির্ভর করে আপনার মাস্টার নেমস্পেসের মধ্যে আপনি সাব-নেমস্পেসগুলি খুলতে পারেন। নামগুলি স্পষ্টভাবে একটি প্রসঙ্গে কিছু অর্থ বোঝায় এবং একই নামগুলি ভিন্ন প্রসঙ্গে ব্যবহার করা যেতে পারে।

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

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


3

নেমস্পেসগুলি কোনও মডিউল ধারণা নয় তাই আমি কেবল সেগুলিতে ব্যবহার করব যেখানে নাম বিরোধ থাকবে।


4
আপনি কি বোঝাতে চেয়েছেন তা নিশ্চিত না। নেমস্পেসে মোড়ানো সম্পর্কিত ক্লাসের সেট কেন মডিউল হবে না?
দিমা

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

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

3
অ্যাক্সেস সীমাবদ্ধতা মডিউলগুলিতে অরথোগোনাল। আসলে, আপনার কাছে পাইথনের মতো সফল সিস্টেম রয়েছে যা অবশ্যই সি ++ এর নেমস্পেসগুলির চেয়ে "মডিউল-জাতীয়" বেশি তবে অ্যাক্সেসের কোনও বিধিনিষেধ আরোপ করে না।
ফ্রেড নুরক

আমি বিশ্বাস করি এটি স্কট মেয়ারের বইগুলিতে তালিকাভুক্ত সেরা অনুশীলনগুলির মধ্যে একটি
রাফেল

1

জাভাতে নেমস্পেস রয়েছে, এগুলিকে কেবল সত্য বলা হয় না। ইন javax.swing.* javaxএকটি নেমস্পেস এবং swingএকটি উপ-নামস্থান। জাভা প্যাকেজ সম্পর্কে এটি কী বলে তা জানতে আমি বইটি পড়িনি, তবে একই নীতিগুলি কোনও ভাষায় নামের জায়গাগুলিতে সরাসরি প্রয়োগ করতে পারে।

যখন আপনি নিজেকে বারবার এবং একই সাথে ক্লাসের জন্য একই উপসর্গটি টাইপ করতে চান এমন একটি নেমস্পেস ব্যবহার করেন use উদাহরণস্বরূপ, আমি সম্প্রতি ওমসিএট্রিবিউট, ওমসিআলার্ম, ওমসিমি ইত্যাদি নামে কিছু ক্লাস লিখেছি এবং বুঝতে পেরেছিলাম যে ওমসিকে নিজের নামকরণে ভাঙ্গার দরকার আছে।


1

আমি গভীর নেমস্পেসগুলি পছন্দ করি (যার অর্থ সাধারণত তিনটি স্তর)।

  • আমার কোম্পানির নাম আছে
  • অ্যাপ্লিকেশন / util / lib / অনুপস্থিত ইত্যাদি
  • যথাযথ হিসাবে প্রকল্পের নাম / বা প্যাকেজ

পরিস্থিতির উপর নির্ভর করে আমার আরও একটি স্তর থাকতে পারে

  • বিশদ (প্ল্যাটফর্ম নির্দিষ্ট প্রয়োগের বিশদ)
  • ইউটস (ইউটিলিটি অবজেক্ট যা সাধারণ ইউটিলিটিতে সরানো হয়নি)।
  • আমার যা দরকার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.