এটা তোলে প্রকৃত অর্থ নির্ভর করে a, bএবং getProduct।
প্রাপ্তদের উদ্দেশ্য হ'ল বস্তুর ইন্টারফেস একই রাখার সময় আসল বাস্তবায়ন পরিবর্তন করতে সক্ষম হওয়া। উদাহরণস্বরূপ, যদি একদিন getAহয়ে যায় return a + 1;, পরিবর্তনটি স্থানীয় হিসাবে স্থানান্তরিত হয়।
রিয়েল দৃশ্যের কেসগুলি কখনও কখনও একজন গেটারের সাথে যুক্ত কোনও কনস্ট্রাক্টরের মাধ্যমে নির্ধারিত ধ্রুবক ব্যাকিং ফিল্ডের চেয়ে জটিল হয়। উদাহরণস্বরূপ, ক্ষেত্রের মান কোডের মূল সংস্করণে কোনও ডাটাবেস থেকে গণনা বা লোড করা যেতে পারে। পরবর্তী সংস্করণে, কর্মক্ষমতা অনুকূল করতে ক্যাশে যুক্ত করা যেতে পারে। যদি getProductগণনা করা সংস্করণ ব্যবহার করা অব্যাহত থাকে তবে এটি ক্যাচিংয়ের দ্বারা কোনও উপকার পাবেন না (বা রক্ষণাবেক্ষণকারীরা একই পরিবর্তনটি দুটিবারই করবেন)।
যদি এটি getProductব্যবহার করার aএবং bসরাসরি ব্যবহারের জন্য সঠিক ধারণা দেয় তবে সেগুলি ব্যবহার করুন। অন্যথায়, রক্ষণাবেক্ষণ সংক্রান্ত সমস্যাগুলি পরে প্রতিরোধ করতে গেটারগুলি ব্যবহার করুন।
উদাহরণস্বরূপ যেখানে কেউ গেটার ব্যবহার করবে:
class Product {
public:
Product(ProductId id) : {
price = Money.fromCents(
data.findProductById(id).price,
environment.currentCurrency
)
}
Money getPrice() {
return price;
}
Money getPriceWithRebate() {
return getPrice().applyRebate(rebate); // ← Using a getter instead of a field.
}
private:
Money price;
}
এই মুহুর্তের জন্য, গিটারটিতে কোনও ব্যবসায়িক যুক্তি নেই, তবে এটি বাদ দেওয়া হয় না যে অবজেক্টটি আরম্ভ করার সময় ডাটাবেসের কাজটি এড়াতে কনস্ট্রাক্টরের যুক্তিটি গেটরে স্থানান্তরিত হবে:
class Product {
public:
Product(ProductId id) : id(id) { }
Money getPrice() {
return Money.fromCents(
data.findProductById(id).price,
environment.currentCurrency
)
}
Money getPriceWithRebate() {
return getPrice().applyRebate(rebate);
}
private:
const ProductId id;
}
পরে, ক্যাচিং যুক্ত করা যেতে পারে (সি # তে, Lazy<T>কোডটি সংক্ষিপ্ত এবং সহজ করে একটি ব্যবহার করবে ; C ++ এর সমতুল্য কিনা তা আমি জানি না):
class Product {
public:
Product(ProductId id) : id(id) { }
Money getPrice() {
if (priceCache == NULL) {
priceCache = Money.fromCents(
data.findProductById(id).price,
environment.currentCurrency
)
return priceCache;
}
Money getPriceWithRebate() {
return getPrice().applyRebate(rebate);
}
private:
const ProductId id;
Money priceCache;
}
উভয় পরিবর্তনগুলি প্রাপ্তকারী এবং ব্যাকিংয়ের ক্ষেত্রের উপর নিবদ্ধ ছিল, বাকি কোডটি প্রভাবিত হয়নি। যদি এর পরিবর্তে, আমি গেটারের অভ্যন্তরের পরিবর্তে একটি ক্ষেত্রটি ব্যবহার করে getPriceWithRebateথাকি, আমাকে সেখানে পরিবর্তনগুলিও প্রতিফলিত করতে হবে।
উদাহরণস্বরূপ যেখানে কেউ সম্ভবত ব্যক্তিগত ক্ষেত্র ব্যবহার করবে:
class Product {
public:
Product(ProductId id) : id(id) { }
ProductId getId() const { return id; }
Money getPrice() {
return Money.fromCents(
data.findProductById(id).price, // ← Accessing `id` directly.
environment.currentCurrency
)
}
private:
const ProductId id;
}
প্রাপ্তিটি সোজা: এটি একটি ধ্রুবক (সি # 'এর সমতুল্য readonly) ক্ষেত্রের প্রত্যক্ষ উপস্থাপনা যা ভবিষ্যতে পরিবর্তিত হবে বলে আশা করা যায় না: সম্ভাবনা রয়েছে, আইডি গেটার কখনই গণিত মান হয়ে উঠবে না। সুতরাং এটি সহজ রাখুন এবং সরাসরি ক্ষেত্রটি অ্যাক্সেস করুন।
আরেকটি সুবিধা হ'ল getIdভবিষ্যতে সম্ভাব্যতা সরিয়ে ফেলা হতে পারে যদি মনে হয় এটি বাইরে ব্যবহার করা হয়নি (কোডের আগের অংশের মতো)।
const: আমি ধরে নিয়েছি এর অর্থ কম্পাইলারgetIdযেভাবেই কোনও কল ইনলাইন করবে এবং এটি আপনাকে উভয় দিক পরিবর্তন করতে দেয়। (অন্যথায় আমি গেটারগুলি ব্যবহার করার জন্য আপনার কারণগুলির সাথে পুরোপুরি একমত আছি )) এবং যে ভাষাগুলিতে সম্পত্তি সিনট্যাক্স সরবরাহ করে, সেখানে সরাসরি ব্যাকিং ফিল্ডের চেয়ে সম্পত্তিটি ব্যবহার না করার আরও কম কারণ রয়েছে।