গেটার্স এবং সেটটাররা কীভাবে কাজ করে?


107

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


@ ইয়েগোর 256 আমি আপনার কুকুর এবং বলের উপমাটি বুঝতে পারি এবং আমি এটি সমর্থন করি তবে কী "জীবিত জীব" বস্তু মাঝে মধ্যে আদিম মান যেমন একটি আইডি সঞ্চয় করে? আপনি যদি সাধারণ কার্যভারের বাইরে এক ধাপ এগিয়ে যেতে চান তবে কেবল আদিম মানগুলি পরিচালনা করতে একটি নতুন শ্রেণি লিখতে চান না?
জ্যাকসনকর

উত্তর:


127

টিউটোরিয়াল এর জন্য সত্যিই প্রয়োজন হয় না। Encapsulation উপর পড়ুন

private String myField; //"private" means access to this is restricted

public String getMyField()
{
     //include validation, logic, logging or whatever you like here
    return this.myField;
}
public void setMyField(String value)
{
     //include more logic
     this.myField = value;
}

11
সুতরাং গিটারটি একটি ব্যক্তিগত ক্ষেত্র পাওয়ার জন্য কেবল একটি পদ্ধতি এবং সেটার একটি নতুন ক্ষেত্র স্থাপন করছে। কোড দ্বারা দুর্দান্ত ব্যাখ্যার জন্য ধন্যবাদ
ajsie

1
আপনি কি একজন গেটারের কাছে প্যারামিটারটি দিতে পারেন?
আজসি

2
ননাম: না এবং না গেটর একটি মান পাওয়ার উপায়, তবে কোনও ক্ষেত্রের মধ্যে থাকা মূল্যটি প্রকাশ না করে, এটি যদি আপনি কল করেন তবে someObj.getTime().setHour(5)এটির someObjঅভ্যন্তরীণ অবস্থাকে প্রভাবিত করবে না । এছাড়াও সেটেটর এবং গেটার্স (তাদের ফ্যানসিয়ার নাম অনুসারে অ্যাক্সেসর এবং মিউটর) এর খুব কঠোর পদ্ধতির স্বাক্ষর রয়েছে যার অর্থ গেটারের কোনও প্যারামিটার নেই। সাধারণ পদ্ধতিগুলি যেভাবেই কেবল একটি কাজ করা উচিত।
এস্কো

4
@ নাম: সাধারণ জিনিসগুলিকে যখন জটিল / বড় / বিমূর্ত নাম দেওয়া হয়, তখন আপনার কাছে "নকশার ধরণ" বলা হয় .... এবং এটি সবেমাত্র উদ্ভাবিত পুনরাবৃত্ত ধারণা ধারণা প্যাটার্নের একটি উদাহরণ ;-)
নাম

3
@ কেয়েদ: thisকীওয়ার্ডটি alচ্ছিক, যদি না নির্দিষ্ট কিছু সুযোগের সাথে কোনও বিরোধ না হয়। আপনি যে উদাহরণটি দিয়েছেন তাতে যে সেটারটি তৈরি করা হয়েছে তার একটি একক প্যারামিটার থাকবে যার নাম ফিল্ডের নামের সাথে মেলে, সুতরাং this.fieldName = fieldNameএটি পার্থক্য করতে ব্যবহৃত হয় যে প্যারামিটারটি তার নিজের হিসাবে নির্ধারিত হওয়ার পরিবর্তে ক্ষেত্রটি বরাদ্দ করা হচ্ছে fieldName = fieldname। প্রাপ্তির মধ্যে এ জাতীয় কোনও বিরোধ নেই।
পল ক্রেসি

39

জাভাতে গিটার এবং সেটটারগুলি সম্পূর্ণ সাধারণ ফাংশন। একমাত্র জিনিস যা তাদের গ্রাহক বা স্থিরকারী করে তোলে তা হ'ল কনভেনশন। ফু জন্য একটি গেটরকে getFoo বলা হয় এবং সেটারকে সেটফু বলে। বুলিয়ানের ক্ষেত্রে, প্রাপ্তিকে ইসফু বলা হয়। 'নাম' এর জন্য গেটর এবং সেটারের এই উদাহরণে প্রদর্শিত হিসাবে তাদের অবশ্যই একটি নির্দিষ্ট ঘোষণা থাকতে হবে:

class Dummy
{
    private String name;

    public Dummy() {}

    public Dummy(String name) {
        this.name = name;
    }

    public String getName() {
        return this.name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

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


9
সেই কনস্ট্রাক্টরদের কি 'অকার্যকর' হওয়া উচিত নয়?
জেসন হার্টলি

অকার্যকর এখানে আসলে প্রয়োজন। যদি আপনার কাছে এটি না থাকে তবে আপনি পান:error: invalid method declaration; return type required
ড্যান

3
শূন্যতা এখানে প্রয়োজন হয় না
শশী কিরণ

2
@ জেসন হার্টলি: একজন কনস্ট্রাক্টরের রিটার্নের ধরণ নেই।
ওয়াসিমানস

@ মার্ক বাইয়ারস সুতরাং, কনস্ট্রাক্টরটি ইনস্ট্যান্সটি আরম্ভ করার জন্য ব্যবহৃত হয় এবং সেটরটি কোনও প্রদত্ত বৈশিষ্ট্য পরিবর্তন করতে ব্যবহৃত হয়। এটা কি সঠিক?
carloswm85

12
class Clock {  
        String time;  

        void setTime (String t) {  
           time = t;  
        }  

        String getTime() {  
           return time;  
        }  
}  


class ClockTestDrive {  
   public static void main (String [] args) {  
   Clock c = new Clock;  

   c.setTime("12345")  
   String tod = c.getTime();  
   System.out.println(time: " + tod);  
 }
}  

আপনি যখন প্রোগ্রামটি চালান, তখন প্রোগ্রামটি শুরু হয় প্রধান,

  1. অবজেক্ট সি তৈরি হয়
  2. ফাংশনটি setTime()অবজেক্ট সি বলে
  3. ভেরিয়েবলটি timeমান দ্বারা নির্ধারিত হয়
  4. ফাংশনকে getTime()বলা হয় অবজেক্ট সি দ্বারা
  5. সময় ফিরে এসেছে
  6. এটি প্রিন্ট todএবং todমুদ্রণ আউট হবে

10

আপনি " গিটার এবং সেটার পদ্ধতিগুলি কেন খারাপ " তাও পড়তে চাইতে পারেন :

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

এই নিবন্ধটি ব্যাখ্যা করে যে আপনি কেন গিটার এবং সেটটার ব্যবহার করবেন না (এবং যখন আপনি সেগুলি ব্যবহার করতে পারেন) এবং এমন একটি নকশার পদ্ধতি প্রস্তাব করে যা আপনাকে গিটার / সেটার মানসিকতা ছিন্ন করতে সহায়তা করবে।


3

1. সেরা getters / সেটার স্মার্ট হয়।

মজিলার একটি জাভাস্ক্রিপ্ট উদাহরণ এখানে:

var o = { a:0 } // `o` is now a basic object

Object.defineProperty(o, "b", { 
    get: function () { 
        return this.a + 1; 
    } 
});

console.log(o.b) // Runs the getter, which yields a + 1 (which is 1)

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

২. পিএইচপি-তে গেটার / সেটটার্স

সোফ থেকে উদাহরণ

<?php
class MyClass {
  private $firstField;
  private $secondField;

  public function __get($property) {
    if (property_exists($this, $property)) {
      return $this->$property;
    }
  }

  public function __set($property, $value) {
    if (property_exists($this, $property)) {
      $this->$property = $value;
    }

    return $this;
  }
}
?>

সাইটিং:


2

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

package stackoverflow;

    public class StackoverFlow 

    {

        private int x;

        public int getX()
        {
            return x;
        }

        public int setX(int x)
        {
          return  this.x = x;
        }
         public void showX()
         {
             System.out.println("value of x  "+x);
         }


        public static void main(String[] args) {

            StackoverFlow sto = new StackoverFlow();
            sto.setX(10);
            sto.getX();
            sto.showX();
        }

    }

আমি আপনাকে নিম্নচোট করতে যাচ্ছি না (চেষ্টা করার মতো নয়) দয়া করে সচেতন হন যে (1) আপনি জাভা প্রশ্নের উত্তর দিয়েছেন, যেখানে জাভাতে প্রোগ্রামের ভাষা হওয়া উচিত । (২) আপনি যদি পোস্ট করতে চান তবে লেআউটটি সঠিকভাবে সম্পন্ন হয়েছে তা নিশ্চিত করুন। (3) আপনার এনক্যাপসুলেশন (গেটর (বা অ্যাকসেসর) এবং সেটার (বা মিউটর) এর ব্যবহার ভুল। এনক্যাপসুলেশন বলতে কী বোঝায় তা দয়া করে দেখুন ... (ভোট দেওয়া উত্তরটি দেখুন)
ক্যারেলজি

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