একটি বস্তুর পদ্ধতি থেকে আপনি কিভাবে অবজেক্টের বৈশিষ্ট্যগুলি অ্যাক্সেস করবেন?

বস্তুগত পদ্ধতির মধ্যে কোন বস্তুর বৈশিষ্ট্যাবলী অ্যাক্সেস করার "ধার্মিক" বা "সঠিক" উপায় কি কোন গেট্টার / সেটার পদ্ধতি নয়?

আমি জানি বস্তুর বাইরের থেকে আপনি একটি গায়ক / সেটার ব্যবহার করতে হবে, কিন্তু এর ভিতর থেকে আপনি কি করবেন:

জাভা:

String property = this.property;

পিএইচপি:

$property = $this->property;

বা আপনি কি করবেন:

জাভা:

String property = this.getProperty();

পিএইচপি:

$property = $this->getProperty();

আমার জাভা একটু দূরে যদি আমাকে ক্ষমা করে দিন, আমি জাভাতে প্রোগ্রাম করা একটি বছর এটি হয়েছে ...

সম্পাদনা করুন:

মনে হচ্ছে মানুষ মনে করছে আমি ব্যক্তিগত বা সুরক্ষিত ভেরিয়েবল / বৈশিষ্ট্য সম্পর্কে কথা বলছি যখন আমি ওও শিখেছি তখন আমাকে প্রত্যেকটি সম্পত্তির জন্য Getters / setters ব্যবহার করা শেখানো হতো এমনকি যদি এটি সার্বজনীন ছিল (এবং প্রকৃতপক্ষে আমি কোন ভ্যারিয়েবল / প্রোপার্টি পাবলিক করতে যাইনি বলে)। সুতরাং, আমি পেতে যান থেকে একটি মিথ্যা ধারণা থেকে শুরু শুরু হতে পারে মনে হচ্ছে যে এই প্রশ্নটি উত্তর দিচ্ছে এমন লোকরা হয়তো বলছেন যে আপনার কাছে জনসাধারণের বৈশিষ্ট্য থাকা উচিত এবং যাদেরকে গেটস এবং সেটার্স দরকার হয় না, যা আমি শেখানো হয়েছিলো এবং যা নিয়ে কথা বলছিলাম তার বিরুদ্ধে যায়, যদিও হয়তো এর সাথে আলোচনা করা দরকার ভাল। এটা সম্ভবত একটি ভিন্ন প্রশ্নের জন্য একটি ভাল বিষয় যদিও ...

0
যোগ সম্পাদিত
মতামত: 1

17 উত্তর

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

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

0
যোগ
আপনি যদি Getter এর কিছু বাছাই বাছাই করতে চান যেমন: পিএইচপি: পাবলিক ফাংশন getName ($ বাইরের কল = সত্য) {যদি ($ বাইরের কল) {$ this-> incrementName কল করা (); } এই $> নাম লিখুন; } এবং তারপর অবজেক্টের মধ্যে থেকে, যদি আপনি নাম পেতে চান তবে আপনি এটি ক্রমবৃদ্ধি থেকে রক্ষা করতে পারেন: পিএইচপি: $ name = $ this-> getName (মিথ্যা); আমি শুধু এখানে ওভারবোর্ড যাচ্ছে?
যোগ লেখক cmcculloh, উৎস
যদি শিক্ষার্থী বস্তুটি একটি ব্যবসায় / ডোমেন অবজেক্ট হয়, তাহলে আপনি এখন অবকাঠামো বিশদগুলির মিশ্রন করছেন। মূলত, একটি ব্যবসায় / ডোমেন বস্তু শুধুমাত্র ব্যবসা / ডোমেইন যুক্তিবিজ্ঞান সঙ্গে সংশ্লিষ্ট করা উচিত।
যোগ লেখক moffdub, উৎস

আমি কি এখানে ওভারবোর্ডে আছি?

সম্ভবত;)

আরেকটি পদ্ধতি হল একটি ব্যক্তিগত / নিরাপদ পদ্ধতি ব্যবহার করার জন্য আসলে (ক্যাশে / ডিবি / ইত্যাদি) পেয়ে যাবেন এবং এটির জন্য একটি পাবলিক রবার্ট যা গণনা বৃদ্ধি করবে:

পিএইচপি:

public function getName() {
    $this->incrementNameCalled();
    return $this->_getName();
}

protected function _getName() {
    return $this->name;
}

এবং তারপর নিজেই বস্তুর মধ্যে থেকে:

পিএইচপি:

$name = $this->_getName();

এই ভাবে আপনি এখনও অন্য কিছু জন্য যে প্রথম আর্গুমেন্ট ব্যবহার করতে পারেন (যেমন এখানে ক্যাশড ডেটা ব্যবহার কিনা বা না একটি পতাকা পাঠানো)।

0
যোগ

ব্যক্তিগতভাবে, আমি অনুভব করি এটা সঙ্গতিপূর্ণ হতে গুরুত্বপূর্ণ। যদি আপনি getters এবং setters আছে, তাদের ব্যবহার করুন। কেবলমাত্র একটি ক্ষেত্র সরাসরি অ্যাক্সেস করতে পারলেই অ্যাক্সেসারের অনেকগুলি ওভারহেড থাকে। এটা মনে হতে পারে যে আপনি আপনার কোড অপ্রয়োজনীয় bloating করছি, কিন্তু এটি অবশ্যই ভবিষ্যতে মাথাব্যথা একটি সম্পূর্ণ অনেক সংরক্ষণ করতে পারেন। ক্লাসিক উদাহরণ:

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

0
যোগ

এই ধর্মীয় যুদ্ধের সম্ভাব্যতা আছে, কিন্তু আমার মনে হচ্ছে আপনি যদি একটি গেটর / সেটার ব্যবহার করছেন তবে আপনি এটি অভ্যন্তরীণভাবেও ব্যবহার করতে পারবেন - উভয়ই ব্যবহার করে সড়কের নিচে রক্ষণাবেক্ষণ সমস্যার সৃষ্টি করবে (উদাহরণস্বরূপ কেউ সেটারের কোড যোগ করে যে < em> প্রয়োজন যে সম্পত্তি সেট করা হয় প্রত্যেক সময় চালানোর জন্য, এবং সম্পত্তি অভ্যন্তরীণভাবে w / o সেট করা হচ্ছে যে সেটার বলা হচ্ছে)।

0
যোগ
@ ইউফরিয়ারা 83 সম্ভবত, কিন্তু এটি ঘটতে থেকে এটিকে আটকাতে পারে না।
যোগ লেখক Greg Hurlman, উৎস
জাভাতে ভুল ব্যবহারের উদাহরণটি সম্পত্তিটির মান নির্ধারণের পাশাপাশি অন্য কোন সেটারের মধ্যে করা হয় না।
যোগ লেখক euphoria83, উৎস

ওয়েল, এটা সি # 3.0 বৈশিষ্ট্য 'ডিফল্ট বাস্তবায়ন সঙ্গে মনে হয়, সিদ্ধান্ত আপনার জন্য নেওয়া হয়; আপনি (সম্ভবত ব্যক্তিগত) সম্পত্তি সেটার ব্যবহার করে সম্পত্তি সেট আছে।

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

0
যোগ

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

বিপরীত ক্ষেত্রে তৈরি করা যেতে পারে যে যদি আপনি গেটর / সেটার ব্যবহার করেন এবং কেউ একজন গেটটার / সেটার পরিবর্তন করে তবে তারা সব জায়গায় বিশ্লেষণ করতে হবে এবং সেটারটি অভ্যন্তরীণভাবে ব্যবহার করা হয় কিনা তা দেখার জন্য এটি কিছু আপগ্রেড করে কিনা।

0
যোগ

আমি ভুল হতে পারি কারণ আমি অটডডাইডট, কিন্তু আমার জাভা ক্লাসে ব্যবহারকারী পাবলিক প্রোপার্টি নেই, তারা সবসময় ব্যক্তিগত বা সুরক্ষিত থাকে, যাতে বাইরের কোডগুলি Getters / setters দ্বারা অ্যাক্সেস করতে পারে। এটি রক্ষণাবেক্ষণ / সংশোধনের উদ্দেশ্যে ভাল। এবং ভিতরের ক্লাস কোডের জন্য ... যদি অভ্যর্থনা পদ্ধতি তুচ্ছ হয় তবে আমি সরাসরি সম্পত্তিটি ব্যবহার করি, কিন্তু আমি সবসময় সেটার পদ্ধতি ব্যবহার করি কারণ আমি ইচ্ছা করলে ইভেন্টগুলিকে সহজেই কোড যোগ করতে পারি।

0
যোগ

"Purist" দ্বারা আপনি "সর্বাধিক encapsulation" মানে, তারপর সাধারণত আমি আমার সমস্ত ক্ষেত্রগুলিকে ব্যক্তিগত হিসাবে ঘোষণা করি এবং তারপর এটি ব্যবহার করে। ক্ষেত্র থেকে নিজের মধ্যেই, কিন্তু উপকেন্দ্র সহ অন্যান্য সমস্ত ক্লাসগুলি, অ্যাক্সেস উদাহরণ রাষ্ট্রগুলি পেতে ব্যবহার করে।

0
যোগ

এটা নির্ভর করে. এটি অন্য কোন জিনিসের চেয়ে আরও একটি শৈলী বিষয়, এবং কোন কঠিন নিয়ম নেই।

0
যোগ

If I won't edit the property I'll use a get_property() public method unless it's a special occasion such as a MySQLi object inside another object in which case I'll just public the property and refer to it as $obj->object_property.

Inside the object it's always $this->property for me.

0
যোগ

আমি বস্তুর মধ্যে এক্সেসার পদ্ধতি এমনকি ব্যবহার করার জন্য এটি ভাল বলবে। এখানে পয়েন্ট যে আমার মন অবিলম্বে আসা:

1) বস্তুর বাইরে তৈরি অ্যাক্সেসগুলির সাথে সুসংগততা বজায় রাখার স্বার্থে এটি করা উচিত।

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

0
যোগ

আমি মোটামুটি এভাবে বিস্মিত যে, এটাই বোধগম্য যে getters এবং সেটারগুলি সূক্ষ্ম এবং ভাল। আমি অ্যালেন হোলব দ্বারা উত্সাহী নিবন্ধ পরামর্শ " Getters এবং Setters হয় ইভিল "। মঞ্জুরিপ্রাপ্ত, শিরোনাম শক মান জন্য, কিন্তু লেখক বৈধ পয়েন্ট তোলে।

মূলত, যদি আপনার প্রত্যেকটি ব্যক্তিগত ক্ষেত্রের জন্য getters এবং setters থাকে তবে আপনি সেইসব ক্ষেত্রগুলিকে সর্বজনীন হিসাবে ভাল করে তৈরি করছেন। আপনি যে কোন ক্লাসে যে কোনও প্রকারে প্রভাষক প্রভাব ছাড়াই একটি প্রাইভেট ক্ষেত্রের ধরন পরিবর্তন করতে খুব কঠিন হয়ে যাবেন যা getter এ কল করে।

উপরন্তু, একটি দৃঢ়ভাবে ওও বিন্দু থেকে, বস্তুর বার্তা (পদ্ধতি) যে তাদের (আশা) একক দায়িত্ব অনুরূপ হওয়া উচিত। getters এবং সংবহনতন্ত্র </কোড> তাদের সংবহন বস্তুর জন্য বোধগম্য হয় না; Pen.dispenseInkOnto (সারফেস) আমার থেকে আরও বোধগম্য করে তোলে <�কোড> Pen.getColor() </কোড>।

Getters এবং setters এছাড়াও বর্গ ব্যবহারকারীদের কিছু তথ্য জন্য বস্তুর জিজ্ঞাসা, একটি গণনা সঞ্চালন, এবং তারপর বস্তুর অন্য কিছু মান সেট, আরও ভাল পদ্ধতিগত প্রোগ্রামিং নামে পরিচিত। আপনি প্রথম স্থানে যা যাচ্ছেন তা করার জন্য কেবলমাত্র বস্তুটিকে বলার জন্য ভালভাবে সেবা করা উচিত; এছাড়াও তথ্য বিশেষজ্ঞ অভিব্যক্তি হিসাবে পরিচিত।

Getters এবং setters, তবে, স্তরের সীমানায় প্রয়োজনীয় evils হয় - UI, দৃঢ়তা, এবং তাই ঘোষণা। একটি ক্লাস এর অভ্যন্তরীণে সীমাবদ্ধ অ্যাক্সেস, যেমন C ++ এর বন্ধু কীওয়ার্ড, জাভা এর প্যাকেজ সুরক্ষিত অ্যাক্সেস, .NET এর অভ্যন্তরীণ অ্যাক্সেস এবং বন্ধু ক্লাস প্যাটার্ন আপনাকে getters এবং সেটারের দৃশ্যমানতা কমাতে সাহায্য করতে পারে যাদের তাদের প্রয়োজন।

0
যোগ

Purist OO উপায় উভয় এড়াতে এবং ডিমেটারের আইন অনুসরণ করে জিজ্ঞাসা করবেন না বলুন পদক্ষেপটি দেখুন

বস্তুর সম্পত্তির মূল্য পাওয়ার পরিবর্তে, শক্তভাবে দম্পতিরা দুই শ্রেণীর, একটি প্যারামিটার উদাহরণ হিসাবে বস্তু ব্যবহার করুন

  doSomethingWithProperty() {
     doSomethingWith( this.property ) ;
  }

কোথায় সম্পত্তি একটি নেটিভ টাইপ ছিল, যেমন int, একটি অ্যাক্সেস পদ্ধতি ব্যবহার করুন, সমস্যা ডোমেন জন্য প্রোগ্রামিং ডোমেন না এটি নাম।

  doSomethingWithProperty( this.daysPerWeek() ) ;

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

0
যোগ

আমি setters / getters ব্যবহার করে আমার কোড সহজে পড়তে পেয়েছি। আমিও নিয়ন্ত্রণ পছন্দ করি যখন অন্যান্য ক্লাস পদ্ধতিগুলি ব্যবহার করে এবং যদি আমি তথ্য সংরক্ষণ করি তাহলে সম্পত্তিটি সংরক্ষণ করা হবে।

0
যোগ

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

নকিয়া সময় ব্যাকিং ভেরিয়েবলগুলি দেখতে না পেলে আপনি .NET ডেভেলপারকে স্বয়ংক্রিয় বৈশিষ্ট্য ব্যবহার করতে পারেন।

0
যোগ

পিএইচপি জাভাস্ক্রিপ্ট পদ্ধতি সহ __ পেতে </কোড> এবং __ সেট </কোড> সহ এই হেল্প করার একটি উপায় খুঁজে পাওয়া যায়, কিন্তু আমি স্পষ্ট পেতে এবং setters পছন্দ। কারণটা এখানে:

  1. যাচাইকরণ সেটারের (এবং সেই বিষয়ের জন্য getters) মধ্যে স্থাপন করা যেতে পারে
  2. স্পষ্টভাবে
  3. সঙ্গে Intellisense কাজ করে?
  4. কোনও সম্পত্তি শুধুমাত্র পঠনযোগ্য নয়, শুধু লিখুন বা লিখিতভাবে লিখুন
  5. প্রশ্ন নেই
  6. ভার্চুয়াল বৈশিষ্ট্যগুলি পুনরুদ্ধার (অর্থাত, গণনাকৃত মানগুলি) নিয়মিত বৈশিষ্ট্যগুলির মতই দেখায়
  7. আপনি সহজেই একটি বস্তু সম্পত্তি সেট করতে পারেন যা যেকোনো জায়গায় সংজ্ঞায়িত করা যায় না, যা পরে অননুমোদিত হয়
0
যোগ

আমি এখানে বিন্দু অনুপস্থিত করা আবশ্যক, আপনি একটি বস্তুর ভিতরে একটি গ্রহীতা ব্যবহার করা হবে যে বস্তুর একটি সম্পত্তি অ্যাক্সেস করার জন্য?

তার উপসংহার এ গ্রহণকারীকে সাহায্যকারীকে আহ্বান জানাতে হবে, যা একজন গায়ককে ডাকবে।

তাই আমি বলতে চাই একটি বস্তু পদ্ধতিতে সরাসরি একটি সম্পত্তি অ্যাক্সেস, বিশেষত এই বস্তু (যা সরাসরি সম্পত্তি অ্যাক্সেস অ্যাক্সেস করতে পারেন যে এটি ফিরে) হিসাবে কল হিসাবে শুধুমাত্র একটি নিখুঁত, অপ্রীতিকর ব্যায়াম (অথবা আমি প্রশ্ন ভুল )।

0
যোগ
আমি মন্তব্য ছিল একই প্রয়োজন দ্বারা চালিত ... প্লাস এটা বন্ধ না উত্তর দেওয়া হয়েছিল;)
যোগ লেখক Egg Vans, উৎস