OOP-এ Abstraction: জটিলতা লুকিয়ে রাখা

আপনি কিছু সহজ পদক্ষেপের মাধ্যমে একটি গাড়ি চালান। আপনি এক্সিলারেটর চাপেন। আপনি স্টিয়ারিং ঘোরান। আপনি ব্রেক চাপেন।

ইঞ্জিনে কীভাবে জ্বালানি প্রবেশ করে তা জানার প্রয়োজন নেই। পিস্টন কীভাবে নড়ে বা গিয়ার কীভাবে পরিবর্তন হয় তা বোঝার প্রয়োজন নেই। গাড়ি এই বিষয়গুলো আপনার কাছ থেকে লুকিয়ে রাখে। আপনি একটি জটিল মেশিন নিয়ন্ত্রণ করার জন্য একটি সহজ ইন্টারফেস ব্যবহার করেন।

সফটওয়্যারও একইভাবে কাজ করে।

একটি ইমেল পাঠানোর কথা ভাবুন। আপনি একটি কমান্ড কল করেন: emailService.send()

পেছনের কাজগুলো (behind the scenes) অনেক কিছু ঘটে:

আপনার এই ধাপগুলো দেখার প্রয়োজন নেই। আপনি শুধু চান যে ইমেলটি চলে যাক।

আপনি যদি Abstraction ব্যবহার না করতেন, তবে আপনার কোড দেখতে এমন হতো:

প্রতিবার এটি করা সমস্যা তৈরি করে। আপনার কোডের প্রতিটি অংশ অতিরিক্ত তথ্য জেনে ফেলে। আপনি যদি আপনার ইমেল প্রোভাইডার পরিবর্তন করেন, তবে আপনাকে মেইল পাঠানো প্রতিটি লাইন আপডেট করতে হবে। আপনার সিস্টেম পরিবর্তন করা কঠিন হয়ে পড়ে।

Abstraction এই সমস্যার সমাধান করে। এটি একটি অবজেক্ট কী করে তা দেখায় কিন্তু এটি কীভাবে কাজ করে তা লুকিয়ে রাখে।

আপনি একটি সহজ ইন্টারফেস প্রকাশ করেন। কলকারী (caller) শুধুমাত্র কাজের দিকে মনোনিবেশ করে। ইমপ্লিমেন্টেশন (implementation) লুকিয়ে থাকে। এটি আপনার কোডকে ডিকাপলড (decoupled) এবং রক্ষণাবেক্ষণ সহজ রাখে।

মানুষ প্রায়ই Abstraction-কে Encapsulation-এর সাথে গুলিয়ে ফেলে।

Encapsulation জিজ্ঞাসা করে: এই ডেটা কে পরিবর্তন করতে পারে? এটি ইন্টারনাল স্টেট (internal state) রক্ষা করে। Abstraction জিজ্ঞাসা করে: ব্যবহারকারীর কোন তথ্যগুলো দেখা প্রয়োজন? এটি জটিলতা লুকিয়ে রাখে।

তারা উন্নত সিস্টেম তৈরির জন্য একসাথে কাজ করে।

এরপর, আমরা Inheritance নিয়ে দেখব। আমরা একটি প্রশ্নের উত্তর দেব: যদি অবজেক্টগুলো একই আচরণ শেয়ার করে, তবে কি আপনাকে একই কোড দুবার লিখতে হবে?

Source: https://dev.to/ashay_tiwari_3658168ad5db/abstraction-in-oop-hiding-complexity-without-hiding-capability-1111