OOP তে basic বিষয় হল, Encapsulation/Information Hiding. আমি একটা member variable কে private হিসেবে declare করছি আবার member function দিয়ে সেই private variable কে access করতেছি। আমি যদি public ভাবে declare করতাম তাহলে আমার কি সমস্যা হত? আমি জানি, Private data কে বাইরে থেকে access করা যায় না। Security এর জন্য। বাস্তবে এটার কি প্রয়োগ আসলে??

আমরা যেটা করি সেটা হল, যে জায়গায় আমার ওই private data টা দরকার সেখানে member function দিয়ে access করতেছি। লাভ কি এটার? এটা তো আরও ঝামেলার।

একটা C# উদাহরন দিলামঃ

public class Person
    {
        private DateTime _dateTime;

        public void SetDateTime(DateTime dateTime)
        {
            _dateTime = dateTime;
        }

        public DateTime GetDateTime()
        {
            return _dateTime;
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            var person = new Person();
            person.SetDateTime(new DateTime(1998,1,1));
            Console.WriteLine(person.GetDateTime());
        }
    }

এখানে আমি private data কে দুইটা function এর মাধ্যমে নিচ্ছি। public করে দিলেই তো আমার সুবিধা হত। কেই real world উদাহরন দিয়ে বুঝালে ভালো হয়।

asked 24 Nov '16, 18:25

Poltu's gravatar image

Poltu
213


আপাতত দৃষ্টিতে ব্যপারটি ঝামেলার মনে হলেও এগুলো ব্যবহারের অনেকগুলো কারণ রয়েছে।

এই মেথডগুলোকে গেটার/সেটার মেথডও বলা হয়।

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

এছাড়ারও আরও বেশ কিছু কারণ রয়েছে, তবে এগুলোকে সঠিক ভাবে ব্যবহার করায় উত্তম, অর্থাৎ যেখানে যেভাবে লাগে। এগুলো হলো -

  • ১. আপনি একটি ক্লাসকে রিডওনলি করতে পারে। অর্থাৎ ক্লাসের ভ্যালুগুলো শুধু পড়া যাবে। এক্ষেত্রে সেই ক্লাসে শুধুমাত্রে গেটার থাকবে।
  • ২. আপনি একটি ক্লাসকে কনফিগারেবল করতে চাইতে পারেন। অর্থাৎ ভ্যালু সেট করবে। সেক্ষেত্রে আপনি শুধু সেটার রাখতে পারেন।
  • ৩. একটি গেটার যে শুধুমাত্র একটি ভেরিয়েবল থাকে ডাটা পড়ে রিটার্ন করবে এমনটি নাও হতে পারে। অনেকগুলো ভেরিয়েবল থেকে ডেটা কম্পিউট করে রিটার্ন করতে পারে।
  • ৪. মনে করুন আপনি ভ্যালু সেট করতে চান যা একটি নির্দিষ্ট রেঞ্জের হবে। এই রেঞ্জের বাইরে কোন ভ্যালু দিলে তা সেটার থেকে একসেপশন থ্রুক করতে পারেন।

একটি উদাহরণ দেওয়া যাক -

    public class Measurement{

    /**
     * The distance in centimeters.
     */
    private double distance;

    /**
     * Gets the distance in inches.
     * @return A distance value.
     */
    public double getDistance()
    {
        return distance / 2.54;
    }

    /**
     * Sets the distance.
     * @param distance The distance, in inches.
     */
    public void setDistance(double distance)
    {
        this.distance = distance * 2.54;
    }
}

এছাড়াও এটি একটি good practice (উত্তম উপায়)। উত্তম উপায় অভ্যাস করায় শ্রেয়।

permanent link

answered 26 Nov '16, 07:40

bazlur_rahman's gravatar image

bazlur_rahman
1.3k17

reverted 26 Nov '16, 07:44

Your answer
toggle preview

Follow this question

By Email:

Once you sign in you will be able to subscribe for any updates here

By RSS:

Answers

Answers and Comments

Markdown Basics

  • *italic* or _italic_
  • **bold** or __bold__
  • link:[text](http://url.com/ "title")
  • image?![alt text](/path/img.jpg "title")
  • numbered list: 1. Foo 2. Bar
  • to add a line break simply add two spaces to where you would like the new line to be.
  • basic HTML tags are also supported

Question tags:

×131
×26
×13

question asked: 24 Nov '16, 18:25

question was seen: 1,657 times

last updated: 26 Nov '16, 07:44