আপনি ইতিমধ্যে স্বীকৃত হিসাবে যা আপনি একটি মুহুর্তের জন্য আমার মাথা আঁচড়ানো শুরু করতে পারেন যখন আপনি প্রথমে আপনার কোডটির মুখোমুখি হওয়া শুরু করছেন আপনি কী করছেন এবং এই স্টাইলার ক্লাসগুলি কার্যকর করা হচ্ছে যতক্ষণ না আমি আপনার স্টাইলটি বেছে নেওয়া শুরু করি ততক্ষণে এটি কিছুটা রহস্যজনক বলা যায় / অভ্যাস (কোন পর্যায়ে আমি এটির সাথে পুরোপুরি অভ্যস্ত হতে পারি)
আমি এর মতো করি আপনি শিরোনামগুলিতে তথ্যের পরিমাণ হ্রাস করছেন। বিশেষত খুব বড় কোডবেসে, এটি সংকলন-সময় নির্ভরতা হ্রাস করতে এবং শেষ পর্যন্ত সময় তৈরিতে ব্যবহারিক প্রভাব ফেলতে পারে।
আমার অন্ত্রের প্রতিক্রিয়াটি হ'ল যদি আপনি যদি এইভাবে প্রয়োগের বিশদটি গোপন করার প্রয়োজন বোধ করেন তবে উত্স ফাইলে অভ্যন্তরীণ লিঙ্কেজের সাথে মুক্ত-স্থায়ী ফাংশনগুলিতে পরামিতিটি পাস করার পক্ষে। সাধারণত আপনি শ্রেণীর সমস্ত ইন্টার্নাল অ্যাক্সেস না করে নির্দিষ্ট শ্রেণীর প্রয়োগের জন্য দরকারী ইউটিলিটি ফাংশন (বা পুরো ক্লাস) কার্যকর করতে পারেন এবং পরিবর্তে কোনও পদ্ধতি প্রয়োগ বা ফাংশন (বা কনস্ট্রাক্টর) এ প্রাসঙ্গিক বিষয়গুলিতে পাস করতে পারেন। এবং স্বাভাবিকভাবেই এতে আপনার বর্গ এবং "সহায়ক" এর মধ্যে সংযোগ হ্রাস করার বোনাস রয়েছে। এতে আরও সাধারণীকরণের প্রবণতা রয়েছে যা অন্যথায় "সহায়ক" হতে পারে যদি আপনি দেখেন যে তারা একাধিক শ্রেণীর প্রয়োগের জন্য প্রযোজ্য আরও সাধারণীকরণ উদ্দেশ্যে পরিবেশন করতে শুরু করেছেন।
আমি কোডটিতে প্রচুর "সহায়তাকারী" দেখলে আমি কখনও কখনও কিছুটা ক্রিঙ্কও করি। এটি সর্বদা সত্য নয় তবে কখনও কখনও তারা এমন বিকাশকারী ব্যক্তির লক্ষণ হতে পারে যিনি কেবলমাত্র ডাবলিকেশনকে বিপদজনক নাম / উদ্দেশ্যগুলির সাথে ফাংশনগুলিতে পাস করে যাচ্ছেন যে এই পরিমাণের পরিমাণ হ্রাস করে তার সাথে কোড ডুপ্লিকেশন দূর করতে কেবল উইল-নিলি ফাংশনগুলি দ্রবীভূত করছেন functions কিছু অন্যান্য ক্রিয়াকলাপ বাস্তবায়নের জন্য কোড প্রয়োজন। সামান্য কিশোর বিট আরও চিন্তাভাবনা কখনও কখনও শ্রেণীর বাস্তবায়ন কীভাবে আরও কার্যকরীভাবে বিভক্ত হয় তার দিক থেকে আরও বৃহত্তর স্পষ্টতার দিকে নিয়ে যেতে পারে এবং অভ্যন্তরীণ অভ্যন্তরে সম্পূর্ণ অ্যাক্সেসের সাথে আপনার অবজেক্টের পুরো উদাহরণগুলি পাস করার জন্য নির্দিষ্ট পরামিতিগুলি পাশ করার পক্ষে সহায়তা করতে পারে নকশা চিন্তার যে স্টাইল প্রচার। আমি প্রস্তাব দিচ্ছি না যে আপনি এটি করছেন অবশ্যই, (আমার কোনও ধারণা নেই),
যদি এটি অযৌক্তিক হয়ে যায়, আমি একটি দ্বিতীয়, আরও মুশকিল সমাধান বিবেচনা করব যা পিম্পল (আমি বুঝতে পেরেছি যে আপনি এটির সাথে সমস্যাগুলি উল্লেখ করেছেন তবে আমি মনে করি যে ন্যূনতম প্রচেষ্টা সহকারে এড়াতে আপনি কোনও সমাধানকে সাধারণীকরণ করতে পারেন)। এটি হেডার হোলসেল থেকে দূরে আপনার ব্যক্তিগত ডেটা সহ আপনার ক্লাসে প্রয়োগ করা দরকার এমন প্রচুর তথ্য সরিয়ে নিতে পারে। পিম্পলের পারফরম্যান্স ইস্যুগুলি মূলত একটি ময়লা-সস্তা ধ্রুবক-সময় বরাদ্দকারী * একটি মুক্ত তালিকার মতো কমিয়ে দেওয়া যেতে পারে যখন পূর্ণ-বিকাশযুক্ত ব্যবহারকারী-সংজ্ঞায়িত অনুলিপি কপির ব্যবহার না করে মান শব্দার্থ সংরক্ষণ করে।
- পারফরম্যান্স দিকটির জন্য পিম্পল খুব কমপক্ষে একটি পয়েন্টার ওভারহেড প্রবর্তন করে তবে আমি মনে করি মামলাগুলি বেশ গুরুতর হতে হবে যেখানে ব্যবহারিক উদ্বেগ তৈরি হয়েছে। যদি স্থানিক স্থানটি বরাদ্দকারীর মাধ্যমে উল্লেখযোগ্যভাবে অবনতি না হয়, তবে আপনার টাইট লুপগুলি বস্তুর উপরে পুনরাবৃত্তি করে (যা সাধারনত একজাত হওয়া উচিত যদি পারফরম্যান্স কোনও উদ্বেগের বিষয় থাকে) তখনও অনুশীলনে ক্যাশে মিস হ্রাস করতে পারে যদি আপনি কিছু ব্যবহার করেন তবে ক্লাসের ক্ষেত্রগুলিকে মূলত স্বতঃস্ফূর্ত মেমোরি ব্লকগুলিতে স্থাপন করে পিম্পল বরাদ্দ করার জন্য একটি বিনামূল্যে তালিকা।
ব্যক্তিগতভাবে কেবলমাত্র সেই সম্ভাবনাগুলি শেষ করে দেওয়ার পরে আমি এই জাতীয় কিছু বিবেচনা করব। আমি মনে করি যে বিকল্পটি যদি শিরোনামের সামনে প্রকাশিত আরও বেসরকারী পদ্ধতির মতো হয় তবে এটির মধ্যে কেবলমাত্র উদ্ভাবনী প্রকৃতির ব্যবহারিক উদ্বেগ।
একটি বিকল্প
একটি বিকল্প যা এখনই আমার মাথায় pedুকে পড়েছে যে আপনার অনুপস্থিত বন্ধুবান্ধব বন্ধুদের বহুলাংশে সাধিত করে তা হ'ল:
struct PredicateListData
{
int somePrivateField;
};
class PredicateList
{
PredicateListData data;
public:
bool match() const;
};
// In source file:
static bool fullMatch(const PredicateListData& p)
{
// Can access p.somePrivateField here.
}
bool PredicateList::match() const
{
return fullMatch(data);
}
এখন এটি খুব জটিল পার্থক্যের মতো মনে হতে পারে এবং আমি এখনও এটিকে "সহায়ক" বলব (সম্ভবত অবজ্ঞাপূর্ণ অর্থে যেহেতু আমরা এখনও ক্লাসের পুরো অভ্যন্তরীণ অবস্থাটি ফাংশনে প্রেরণ করছি, এটির সমস্ত প্রয়োজন হয় না বা না) ছাড়া আর সম্মুখীন এর "শক" ফ্যাক্টর এড়াতে নেই friend
। সাধারণভাবে friend
আরও পরিদর্শন অনুপস্থিত দেখতে দেখতে কিছুটা ভীতিজনক মনে হয়, কারণ এটি বলে যে আপনার শ্রেণীর অভ্যন্তরগুলি অন্য কোথাও অ্যাক্সেসযোগ্য (যা বোঝায় যে এটি তার নিজস্ব আক্রমণকারীগুলি বজায় রাখতে অক্ষম হতে পারে)। যেভাবে আপনি এটি ব্যবহার করছেন friend
তা যদি না হয় তবে লোকেরা অনুশীলন সম্পর্কে সচেতন হলে ootfriend
ক্লাসের ব্যক্তিগত কার্যকারিতা বাস্তবায়নে সহায়তা করতে কেবল একই উত্স ফাইলটিতে বাস করছে, তবে উপরেরটি কমপক্ষে এক যুক্তিযুক্ত উপকারের সাথে কমপক্ষে একই প্রভাবটি অর্জন করে যে এতে কোনও বন্ধু জড়িত না যা পুরো ধরণের এড়িয়ে চলে ("ওহ অঙ্কুর করুন, এই শ্রেণীর একটি বন্ধু আছে its এর প্রাইভেটগুলি অন্য কোথা থেকে অ্যাক্সেস / মিউটেশন পায়? ")। যদিও উপরের সংস্করণটি তাত্ক্ষণিকভাবে যোগাযোগ করে যে প্রাইভেটের পক্ষে প্রয়োগের ক্ষেত্রে যে কোনও কিছু করার বাইরে প্রবেশ / পরিবর্তন করার কোনও উপায় নেই PredicateList
।
এটি সম্ভবত এই স্তরের স্তরের সাথে কিছুটা কৌতুকপূর্ণ অঞ্চলের দিকে এগিয়ে চলেছে যেহেতু আপনি যদি অভিন্নরূপে জিনিসগুলির নাম লেখেন *Helper*
এবং সেগুলিকে একই উত্স ফাইলে রাখেন যে কোনও শ্রেণীর ব্যক্তিগত প্রয়োগের অংশ হিসাবে এটি সমস্ত ধরণের একসাথে বান্ডিল রয়েছে। তবে আমরা যদি নিট-পিকি হয়ে যাই তবে সম্ভবত অবিলম্বে উপরের স্টাইলটি এক নজরে হাঁটু-ঝাঁকুনির প্রতিক্রিয়া সৃষ্টি করবে না friend
যা মূল শব্দটি অনুপস্থিত যা কিছুটা ভীতিজনক দেখাচ্ছে।
অন্যান্য প্রশ্নের জন্য:
একজন ভোক্তা তাদের নিজস্ব শ্রেণি প্রডিকেটলিস্টহেল্পার ফাংশনগুলি সংজ্ঞায়িত করতে পারে এবং তাদের ব্যক্তিগত ক্ষেত্রগুলিতে অ্যাক্সেস করতে দেয়। যদিও আমি এটিকে একটি বিশাল সমস্যা হিসাবে দেখছি না (যদি আপনি সত্যিই সেই ব্যক্তিগত ক্ষেত্রগুলিতে কিছুটা ingালাই করতে পারেন), সম্ভবত এটি গ্রাহকরা সেভাবে এটি ব্যবহার করতে উত্সাহিত করবে?
এটি এপিআই সীমানা জুড়ে একটি সম্ভাবনা হতে পারে যেখানে ক্লায়েন্ট একই নামের সাথে একটি দ্বিতীয় শ্রেণির সংজ্ঞা দিতে পারে এবং লিংকেজ ত্রুটি ছাড়াই সেইভাবে ইন্টার্নালগুলিতে অ্যাক্সেস পেতে পারে। তারপরে আবার আমি গ্রাফিক্সে বেশিরভাগ ক্ষেত্রে সি সিডার কাজ করছি যেখানে "কী যদি" এই স্তরে সুরক্ষা উদ্বেগ অগ্রাধিকার তালিকার খুব কম, তাই এই জাতীয় উদ্বেগগুলি কেবলমাত্র আমি হাত ন্যাড়া করতে চাই এবং একটি নাচ করি এবং তাদের অস্তিত্ব নেই এমন ভান করার চেষ্টা করুন। :-D আপনি যদি এমন কোনও ডোমেইনে কাজ করছেন যেখানে এই ধরণের উদ্বেগগুলি বরং গুরুতর, তবে আমি মনে করি এটি করা একটি শালীন বিবেচনা।
উপরের বিকল্প প্রস্তাবনাও এই সমস্যাটি ভোগ করা এড়িয়ে চলে। আপনি যদি এখনও ব্যবহার করতে আটকে থাকতে চান friend
তবে আপনি সাহায্যকারীকে একটি ব্যক্তিগত নেস্টেড বর্গ তৈরি করেও এই সমস্যাটি এড়াতে পারেন।
class PredicateList
{
...
// Declare nested class.
class Helper;
// Make it a friend.
friend class Helper;
public:
...
};
// In source file:
class PredicateList::Helper
{
...
};
এটি কি একটি নামী নকশার প্যাটার্ন যার নাম রয়েছে?
আমার জ্ঞানের কেউ নেই। আমি সত্যিই বাস্তবায়নের বিবরণ এবং শৈলীর সংক্ষিপ্তকরণের মধ্যে প্রবেশ করায় একটি সন্দেহ থাকবে one
"সাহায্যকারী জাহান্নাম"
আমি প্রচুর "সহায়ক" কোডের সাথে বাস্তবায়নগুলি যখন দেখি তখন কীভাবে আমি কখনও কখনও ক্রিঙ করি সে সম্পর্কে এই বিষয়ে আরও স্পষ্টতার জন্য আমার একটি অনুরোধ পেল এবং এটি কিছুটির সাথে সামান্য বিতর্কিত হতে পারে তবে আমি সত্যই সত্য কারণ আমি যখন কিছু ডিবাগ করছিলাম তখন সত্যই ক্রিংজ হয়েছিল did আমার সহকর্মীদের কেবলমাত্র "সহায়তাকারী" এর বোঝা সন্ধানের জন্য একটি শ্রেণীর প্রয়োগ করা। :-D এবং এই সমস্ত সাহায্যকারীদের ঠিক কী করণীয় তা অনুমান করার চেষ্টা করে আমার মাথার স্ক্র্যাচ করা দলের মধ্যে আমিই ছিল না। আমি "আপনি সাহায্যকারীদের ব্যবহার করবেন না" এর মতো কৌতূহল প্রকাশ করতেও চাই না, তবে আমি একটি ছোট্ট পরামর্শ দিতে চাই যে এটি ব্যবহারিকর ক্ষেত্রে অনুপস্থিত জিনিসগুলি কীভাবে বাস্তবায়িত করা যায় তা নিয়ে ভাবতে সহায়তা করতে পারে।
সংজ্ঞা অনুসারে সমস্ত ব্যক্তিগত সদস্য ফাংশন সহায়ক ফাংশন না?
এবং হ্যাঁ, আমি ব্যক্তিগত পদ্ধতিগুলি সহ অন্তর্ভুক্ত করছি। যদি আমি একটি সহজবোধ্য প্রকাশ্য ইন্টারফেস মতো কিন্তু ব্যক্তিগত পদ্ধতির একটি অবিরাম সেট যা কিছুটা মত উদ্দেশ্য মন্দ সংজ্ঞায়িত করা হয় মত একটি বর্গ দেখতে find_impl
বা find_detail
বা find_helper
, তারপর আমিও ঠিক একই ভাবে, ধামা ধরা।
"বিকল্প হিসাবে আমি যা পরামর্শ দিচ্ছি তা হ'ল অভ্যন্তরীণ লিঙ্কেজ (ঘোষিত static
বা একটি অনামী নেমস্পেসের অভ্যন্তরে) সহ ননমেম্বার ননফ্রেন্ড ফাংশনগুলি " অন্যদের বাস্তবায়নে সহায়তা করে এমন একটি ফাংশন "এর চেয়ে কমপক্ষে আরও সাধারণ উদ্দেশ্যে আপনার শ্রেণি বাস্তবায়নে সহায়তা করার জন্য internal এবং আমি কেন সি ++ 'কোডিং স্ট্যান্ডার্ডস' থেকে ভেষজ সুটারকে এখানে উল্লেখ করতে পারি কেন এটি কোনও সাধারণ এসই দৃষ্টিকোণ থেকে পছন্দনীয়:
সদস্যপদ ফি এড়িয়ে চলুন: যেখানে সম্ভব, ফাংশন নন-মেমার ননফ্রেন্ড বানানো পছন্দ করুন। [...] ননমেম্বার ননফ্রেন্ড ফাংশন নির্ভরতা হ্রাস করে এনক্যাপসুলেশন উন্নত করে: ফাংশনের মূল অংশটি ক্লাসের অ-প্রজাতন্ত্র সদস্যের উপর নির্ভর করতে পারে না (আইটেম 11 দেখুন)। তারা পৃথকযোগ্য কার্যকারিতা মুক্ত করতে একচেটিয়া ক্লাসগুলিও ভেঙে দেয় এবং আরও সংযোজন হ্রাস করে (আইটেম 33 দেখুন)।
পরিবর্তনশীল সুযোগকে সংকীর্ণ করার মৌলিক নীতির ক্ষেত্রে তিনি কিছুটা ডিগ্রি নিয়ে কথা বলেছিলেন এমন "সদস্যপদ ফি" বুঝতে পারবেন। আপনি যদি চূড়ান্ত উদাহরণ হিসাবে কল্পনা করেন, এমন একটি Godশ্বর অবজেক্ট যা আপনার পুরো প্রোগ্রামটি চালানোর জন্য প্রয়োজনীয় সমস্ত কোড রয়েছে, তবে এই ধরণের "সহায়তাকারী" (কার্যকরী সদস্য, সদস্যরা ফাংশন বা বন্ধুবান্ধব) কে সমর্থন করে যা সমস্ত অভ্যন্তরীণ অ্যাক্সেস করতে পারে ( একটি শ্রেণীর বেসরকারী) মূলত সেই পরিবর্তনগুলি রেন্ডার করে বৈশ্বিক ভেরিয়েবলের চেয়ে কম সমস্যাযুক্ত। রাষ্ট্রকে সঠিকভাবে পরিচালনা এবং সুরক্ষা সুরক্ষা এবং আক্রমণকারীদের বজায় রাখার সমস্ত অসুবিধা আপনার এই অতি চূড়ান্ত উদাহরণে বৈশ্বিক ভেরিয়েবলের সাথে পাবেন। এবং অবশ্যই বেশিরভাগ বাস্তব উদাহরণ আশা করা যায় যে এই চরমের কাছাকাছি কোথাও নয়, তবে তথ্য গোপন করা ততটাই কার্যকর কারণ এটি তথ্যের অ্যাক্সেসের সুযোগকে সীমাবদ্ধ করে দিচ্ছে।
এখন সুতার এখানে ইতিমধ্যে একটি দুর্দান্ত ব্যাখ্যা দিয়েছে তবে আমি আরও যুক্ত করব যে আপনি কীভাবে ডিজাইন করেন তার কার্যকারিতা অনুসারে ডিকপলিং মানসিক উন্নতি (কমপক্ষে যদি আপনার মস্তিষ্ক আমার মতো কাজ করে) এর মতো প্রচার করে। আপনি যখন ক্লাসের সমস্ত কিছু অ্যাক্সেস করতে পারবেন না এমন ফাংশনগুলি ডিজাইন করা শুরু করেন যা কেবলমাত্র আপনি এটি পাস করেন বা আপনি যদি প্যারামিটার হিসাবে ক্লাসের উদাহরণটি পাস করেন তবে কেবল তার পাবলিক সদস্যরা, এটি এমন একটি নকশার মানসিকতার প্রচার করে যা পছন্দ করে ফাংশনগুলির একটি স্পষ্ট উদ্দেশ্য রয়েছে, ডিকপলিংয়ের উপরে এবং উন্নত এনক্যাপসুলেশনকে প্রচার করে, যা আপনি অন্যথায় ডিজাইন করতে প্রলুব্ধ হতে পারেন যদি আপনি কেবল সমস্ত কিছু অ্যাক্সেস করতে পারতেন।
আমরা যদি চূড়ান্ত দিকে ফিরে যাই তবে গ্লোবাল ভেরিয়েবলগুলির সাথে যুক্ত একটি কোডবেস বিকাশকারীদের ঠিক এমনভাবে ফাংশনগুলি ডিজাইন করতে প্ররোচিত করে না যা স্পষ্ট এবং উদ্দেশ্য অনুযায়ী সাধারণীকরণ করা হয়েছে। কোনও কার্যক্রমে আপনি যত বেশি তথ্য অ্যাক্সেস করতে পারবেন খুব তাড়াতাড়ি আমাদের মধ্যে আরও অনেক মানুষ এটির বিকাশ করার প্রলোভনের মুখোমুখি হয় এবং এই ফাংশনে আরও নির্দিষ্ট এবং প্রাসঙ্গিক পরামিতিগুলি গ্রহণ করার পরিবর্তে আমাদের কাছে থাকা এই সমস্ত অতিরিক্ত তথ্য অ্যাক্সেসের পক্ষে তার স্পষ্টতা হ্রাস করে reduce রাজ্যে এর অ্যাক্সেস সংকীর্ণ করা এবং এর প্রয়োগযোগ্যতা আরও প্রশস্ত করা এবং এর উদ্দেশ্যগুলির স্পষ্টতা উন্নত করা। এটি সদস্য ফাংশন বা বন্ধুদের সাথে (যদিও কিছুটা কম ডিগ্রীতে সাধারণত প্রযোজ্য) প্রযোজ্য।