CodeGym /Java Blog /এলোমেলো /OOP এর মূলনীতি
John Squirrels
লেভেল 41
San Francisco

OOP এর মূলনীতি

এলোমেলো দলে প্রকাশিত
জাভা একটি বস্তু-ভিত্তিক ভাষা। এর মানে হল যে আপনাকে একটি অবজেক্ট-ওরিয়েন্টেড প্যারাডাইম ব্যবহার করে জাভা প্রোগ্রাম লিখতে হবে। এবং এই দৃষ্টান্ত আপনার প্রোগ্রামে বস্তু এবং ক্লাস ব্যবহার করে entails. ক্লাস এবং অবজেক্টগুলি কী এবং কীভাবে মৌলিক OOP নীতিগুলি (বিমূর্ততা, উত্তরাধিকার, পলিমরফিজম এবং এনক্যাপসুলেশন) অনুশীলনে প্রয়োগ করা যায় তা বোঝার জন্য উদাহরণ ব্যবহার করার চেষ্টা করি।

একটি বস্তু কি?

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

বিমূর্ততা

আসুন এখন চিন্তা করি কিভাবে আমরা বাস্তব জগতের একটি বস্তু থেকে একটি প্রোগ্রামের একটি বস্তুতে যেতে পারি। আমরা একটি উদাহরণ হিসাবে ফোন ব্যবহার করব. যোগাযোগের এই মাধ্যমটির একটি ইতিহাস রয়েছে যা 100 বছরেরও বেশি সময় ধরে বিস্তৃত। আধুনিক টেলিফোন তার 19 শতকের পূর্বসূরীর তুলনায় অনেক বেশি জটিল ডিভাইস। ফোন ব্যবহার করার সময়, আমরা এর সংগঠন এবং এর ভিতরে ঘটতে থাকা প্রক্রিয়াগুলি সম্পর্কে চিন্তা করি না। আমরা কেবল ফোনের ডেভেলপারদের দেওয়া ফাংশনগুলি ব্যবহার করি: একটি ফোন নম্বর লিখতে এবং কল করতে বোতাম বা একটি টাচ স্ক্রিন৷ প্রথম ফোন ইন্টারফেসগুলির মধ্যে একটি ছিল একটি ক্র্যাঙ্ক যা কল করার জন্য ঘোরানো প্রয়োজন। অবশ্যই, এটি খুব সুবিধাজনক ছিল না। কিন্তু এটি তার কার্যকারিতা নিষ্ক্রিয়ভাবে সম্পন্ন করেছে। আপনি যদি সবচেয়ে আধুনিক এবং প্রথম ফোনের তুলনা করেন, আপনি অবিলম্বে 19 শতকের শেষের ডিভাইস এবং আধুনিক স্মার্টফোনের জন্য সবচেয়ে গুরুত্বপূর্ণ ফাংশন সনাক্ত করতে পারেন। তারা কল করার ক্ষমতা এবং কল গ্রহণ করার ক্ষমতা। আসলে, এটিই ফোনটিকে ফোন করে তোলে, অন্য কিছু নয়। এখন শুধু OOP এর একটি নীতি প্রয়োগ করুন: একটি বস্তুর সবচেয়ে গুরুত্বপূর্ণ বৈশিষ্ট্য এবং তথ্য সনাক্ত করুন। এই নীতিকে বিমূর্ততা বলা হয়। OOP-তে, বিমূর্ততাকে একটি প্রোগ্রামের বস্তু হিসাবে বাস্তব-জগতের কাজের উপাদানগুলিকে উপস্থাপন করার একটি পদ্ধতি হিসাবেও সংজ্ঞায়িত করা যেতে পারে। বিমূর্ততা সর্বদা একটি বস্তুর নির্দিষ্ট বৈশিষ্ট্যের সাধারণীকরণের সাথে যুক্ত থাকে, তাই প্রধান জিনিসটি হ'ল হাতে থাকা টাস্কের প্রসঙ্গে তুচ্ছ থেকে অর্থপূর্ণ তথ্য আলাদা করা। উপরন্তু, বিমূর্ততা বিভিন্ন স্তর হতে পারে. দিন' আমাদের ফোনে বিমূর্ততার নীতি প্রয়োগ করার চেষ্টা করুন৷ শুরু করার জন্য, আমরা সবচেয়ে সাধারণ ধরনের ফোনগুলিকে চিহ্নিত করব — একেবারে প্রথম ফোন থেকে বর্তমান দিনের ফোনগুলি পর্যন্ত৷ উদাহরণস্বরূপ, আমরা চিত্র 1-এ চিত্রের আকারে তাদের উপস্থাপন করতে পারি। OOP-এর মূলনীতি - 2বিমূর্ততা ব্যবহার করে, আমরা এখন এই বস্তুর শ্রেণিবিন্যাসের সাধারণ তথ্য শনাক্ত করতে পারি: সাধারণ বিমূর্ত বস্তু (টেলিফোন), টেলিফোনের সাধারণ বৈশিষ্ট্য (যেমন এটির সৃষ্টির বছর), এবং সাধারণ ইন্টারফেস (সমস্ত টেলিফোন গ্রহণ করতে এবং কল করতে পারে)। জাভাতে এটি কেমন দেখায় তা এখানে:

public abstract class AbstractPhone {
    private int year;

    public AbstractPhone(int year) {
        this.year = year;
    }
    public abstract void call(int outgoingNumber);
    public abstract void ring(int incomingNumber);
}
একটি প্রোগ্রামে, আমরা এই বিমূর্ত শ্রেণীটি ব্যবহার করে এবং OOP-এর অন্যান্য মৌলিক নীতিগুলি প্রয়োগ করে নতুন ধরনের ফোন তৈরি করতে পারি, যা আমরা নীচে অন্বেষণ করব।

এনক্যাপসুলেশন

বিমূর্তকরণের মাধ্যমে, আমরা সমস্ত বস্তুর জন্য সাধারণ কী তা সনাক্ত করি। তবে প্রতিটি ধরণের ফোনই অনন্য, অন্যদের থেকে কিছুটা আলাদা। একটি প্রোগ্রামে, আমরা কীভাবে সীমানা আঁকতে পারি এবং এই ব্যক্তিত্বকে চিহ্নিত করি? আমরা কীভাবে এটি তৈরি করব যাতে কেউ দুর্ঘটনাক্রমে বা ইচ্ছাকৃতভাবে আমাদের ফোন ভেঙে ফেলতে না পারে বা একটি মডেলকে অন্য মডেলে রূপান্তর করার চেষ্টা করতে পারে? বাস্তব জগতে, উত্তরটি সুস্পষ্ট: আপনাকে একটি ফোন কেসে সমস্ত অংশ রাখতে হবে। সর্বোপরি, আপনি যদি তা না করেন - পরিবর্তে ফোনের সমস্ত অভ্যন্তরীণ অংশগুলি রেখে এবং বাইরের দিকে তারগুলি সংযুক্ত করুন - কিছু কৌতূহলী পরীক্ষাকারী অবশ্যই আমাদের ফোনটিকে "উন্নতি" করতে চাইবেন৷ এই ধরনের টিঙ্কারিং প্রতিরোধ করার জন্য, এনক্যাপসুলেশন নীতিটি একটি বস্তুর নকশা এবং অপারেশনে ব্যবহৃত হয়। এই নীতিটি বলে যে একটি বস্তুর বৈশিষ্ট্য এবং আচরণ একটি একক শ্রেণীতে মিলিত হয়, বস্তু' s অভ্যন্তরীণ বাস্তবায়ন ব্যবহারকারীর কাছ থেকে লুকানো হয়, এবং বস্তুর সাথে কাজ করার জন্য একটি সর্বজনীন ইন্টারফেস প্রদান করা হয়। প্রোগ্রামারের কাজ হল কোন বস্তুর বৈশিষ্ট্য এবং পদ্ধতিগুলি সর্বজনীন অ্যাক্সেসের জন্য উপলব্ধ হওয়া উচিত এবং কোনটি অভ্যন্তরীণ বাস্তবায়নের বিবরণ যা অ্যাক্সেসযোগ্য নয় তা নির্ধারণ করা।

এনক্যাপসুলেশন এবং অ্যাক্সেস নিয়ন্ত্রণ

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

public class SomePhone {

    private int year;
    private String company;
    public SomePhone(int year, String company) {
        this.year = year;
        this.company = company;
    }
private void openConnection(){
    // findSwitch
    // openNewConnection...
}
public void call() {
    openConnection();
    System.out.println("Calling");
}

public void ring() {
    System.out.println("Ring-ring");
}

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

উত্তরাধিকার

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

public abstract class CordlessPhone extends AbstractPhone {

    private int hour;

    public CordlessPhone (int year, int hour) {
        super(year);
        this.hour = hour;
    }
    }
সেল ফোনগুলি একটি কর্ডলেস ফোনের বৈশিষ্ট্যগুলি উত্তরাধিকার সূত্রে পায় এবং আমরা এই ক্লাসে কল এবং রিং পদ্ধতিগুলি প্রয়োগ করি:

public class CellPhone extends CordlessPhone {
    public CellPhone(int year, int hour) {
        super(year, hour);
    }

    @Override
    public void call(int outgoingNumber) {
        System.out.println("Calling " + outgoingNumber);
    }

    @Override
    public void ring(int incomingNumber) {
        System.out.println("Incoming call from " + incomingNumber);
    }
}
এবং অবশেষে, আমাদের কাছে স্মার্টফোনের ক্লাস রয়েছে, যা ক্লাসিক সেল ফোনের বিপরীতে, একটি পূর্ণাঙ্গ অপারেটিং সিস্টেম রয়েছে। আপনি নতুন প্রোগ্রাম যোগ করে আপনার স্মার্টফোনের কার্যকারিতা প্রসারিত করতে পারেন যা এর অপারেটিং সিস্টেমে চলতে পারে। কোডে, ক্লাসটি নিম্নরূপ বর্ণনা করা যেতে পারে:

public class Smartphone extends CellPhone {
    
    private String operationSystem;

    public Smartphone(int year, int hour, String operationSystem) {
        super(year, hour);
        this.operationSystem = operationSystem;
    }
public void install(String program) {
    System.out.println("Installing " + program + " for " + operationSystem);
}

}
আপনি দেখতে পাচ্ছেন, আমরা স্মার্টফোন ক্লাস বর্ণনা করার জন্য বেশ কিছু নতুন কোড তৈরি করেছি , কিন্তু আমরা নতুন কার্যকারিতা সহ একটি নতুন ক্লাস পেয়েছি। OOP-এর এই নীতিটি প্রয়োজনীয় জাভা কোডের পরিমাণ উল্লেখযোগ্যভাবে হ্রাস করা সম্ভব করে তোলে, এইভাবে প্রোগ্রামারদের জীবন সহজ করে তোলে।

পলিমরফিজম

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

public class User {
    private String name;

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

    public void callAnotherUser(int number, AbstractPhone phone){
// And here's polymorphism: using the AbstractPhone type in the code!
        phone.call(number);
    }
}
 }
এখন আমরা বিভিন্ন ধরণের ফোন বর্ণনা করব। প্রথম ফোনগুলির মধ্যে একটি:

public class ThomasEdisonPhone extends AbstractPhone {

public ThomasEdisonPhone(int year) {
    super(year);
}
    @Override
    public void call(int outgoingNumber) {
        System.out.println("Crank the handle");
        System.out.println("What number would you like to connect to?");
    }

    @Override
    public void ring(int incomingNumber) {
        System.out.println("The phone is ringing");
    }
}
একটি সাধারণ ল্যান্ডলাইন ফোন:

public class Phone extends AbstractPhone {

    public Phone(int year) {
        super(year);
    }

    @Override
    public void call(int outgoingNumber) {
        System.out.println("Calling " + outgoingNumber);
    }

    @Override
    public void ring(int incomingNumber) {
        System.out.println("The phone is ringing");
    }
}
এবং অবশেষে, একটি দুর্দান্ত ভিডিও ফোন:

public class VideoPhone extends AbstractPhone {

    public VideoPhone(int year) {
        super(year);
    }
    @Override
    public void call(int outgoingNumber) {
        System.out.println("Connecting video call to " + outgoingNumber);
    }
    @Override
    public void ring(int incomingNumber) {
        System.out.println("Incoming video call from " + incomingNumber);
    }
  }
আমরা main() পদ্ধতিতে বস্তু তৈরি করব এবং callAnotherUser() পদ্ধতি পরীক্ষা করব:

AbstractPhone firstPhone = new ThomasEdisonPhone(1879);
AbstractPhone phone = new Phone(1984);
AbstractPhone videoPhone=new VideoPhone(2018);
User user = new User("Jason");
user.callAnotherUser(224466, firstPhone);
// Crank the handle
// What number would you like to connect to?
user.callAnotherUser(224466, phone);
// Calling 224466
user.callAnotherUser(224466, videoPhone);
// Connecting video call to 224466
ব্যবহারকারী অবজেক্টে একই পদ্ধতিতে কল করলে বিভিন্ন ফলাফল পাওয়া যায়। প্রোগ্রামটি চলাকালীন পাস করা নির্দিষ্ট ধরণের অবজেক্টের উপর ভিত্তি করে callAnotherUser() পদ্ধতির ভিতরে কল পদ্ধতির একটি নির্দিষ্ট বাস্তবায়ন গতিশীলভাবে নির্বাচন করা হয় । এটি পলিমারফিজমের প্রধান সুবিধা - রানটাইমে একটি বাস্তবায়ন বেছে নেওয়ার ক্ষমতা। উপরে দেওয়া ফোন ক্লাসের উদাহরণগুলিতে, আমরা মেথড ওভাররাইডিং ব্যবহার করেছি — একটি কৌশল যেখানে আমরা মেথড সিগনেচার পরিবর্তন না করে বেস ক্লাসে সংজ্ঞায়িত একটি পদ্ধতির বাস্তবায়ন পরিবর্তন করি। এটি মূলত পদ্ধতিটিকে প্রতিস্থাপন করে: যখন প্রোগ্রামটি কার্যকর করা হয় তখন সাবক্লাসে সংজ্ঞায়িত নতুন পদ্ধতিটিকে বলা হয়। সাধারণত, যখন আমরা একটি পদ্ধতিকে ওভাররাইড করি, @Overrideটীকা ব্যবহার করা হয়। এটি কম্পাইলারকে ওভাররাইড এবং ওভাররাইডিং পদ্ধতির স্বাক্ষর পরীক্ষা করতে বলে। অবশেষে, আপনার জাভা প্রোগ্রামগুলি OOP এর নীতিগুলির সাথে সামঞ্জস্যপূর্ণ তা নিশ্চিত করতে, এই টিপসগুলি অনুসরণ করুন:
  • একটি বস্তুর প্রধান বৈশিষ্ট্য সনাক্ত;
  • সাধারণ বৈশিষ্ট্য এবং আচরণ সনাক্ত করুন এবং ক্লাস তৈরি করার সময় উত্তরাধিকার ব্যবহার করুন;
  • বস্তু বর্ণনা করতে বিমূর্ত প্রকার ব্যবহার করুন;
  • সর্বদা একটি ক্লাসের অভ্যন্তরীণ বাস্তবায়নের সাথে সম্পর্কিত পদ্ধতি এবং ক্ষেত্রগুলি লুকানোর চেষ্টা করুন।
মন্তব্য
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION