1. কোম্পানির ইতিহাস

আমি আপনাকে একটি গল্প বলতে চাই যা দেখায় কিভাবে OOP বড় সিস্টেমের জটিলতার সাথে লড়াই করতে সাহায্য করে। OOP এর উদ্দেশ্য বোঝার জন্য এটি আপনার জন্য প্রয়োজনীয় ।

একবার একটি ছোট কোম্পানি ছিল যেটি আন্তঃগ্যাল্যাকটিক শিপিং পরিষেবা সরবরাহ করে ...

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

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

আর তখনই সমস্যা শুরু হয়। আরও লোক ছিল , এবং তারা একে অপরের পথে যেতে শুরু করেছিল।

বিপণনকারী একটি নতুন বিজ্ঞাপন প্রচারে ব্যাঙ্ক অ্যাকাউন্ট ড্রেন করে ফেলে, তাই এমন পণ্য কেনার জন্য কোনও অর্থ নেই যা জরুরিভাবে পাঠানো দরকার।

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

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

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

কিছু একটা করা দরকার ছিল, তাই বস সিদ্ধান্ত নিলেন মনোলিথিক কোম্পানিকে কয়েকটি বিভাগে ভাগ করার। তিনি একটি শিপিং বিভাগ, একটি বিপণন বিভাগ, একটি সংগ্রহ বিভাগ, একটি অর্থ বিভাগ এবং একটি তালিকা বিভাগ তৈরি করেছিলেন। কেউ আর সহজভাবে স্পেসশিপ নিতে পারে না। শিপিং বিভাগের প্রধান ডেলিভারি সম্পর্কে সমস্ত তথ্য পেয়েছিলেন এবং সবচেয়ে লাভজনক অর্ডার দিয়ে কুরিয়ারে জাহাজটি জারি করেছিলেন। অতিরিক্তভাবে, গুদামটি কুরিয়ারকে তাদের পছন্দসই পণ্যগুলি নিতে দেয়নি। পরিবর্তে, গুদাম থেকে পণ্য বাছাই একটি নিয়ন্ত্রিত প্রক্রিয়া হয়ে ওঠে। অর্থ বিভাগ একটি বিপণন প্রচারের জন্য তহবিল প্রকাশ করবে না যদি এটি জানত যে শীঘ্রই একটি ক্রয় হবে। প্রতিটি বিভাগের একজন জনসাধারণের মুখ ছিল - বিভাগীয় প্রধান।প্রতিটি বিভাগের অভ্যন্তরীণ কাঠামো ছিল নিজস্ব ব্যবসা। যদি একটি কুরিয়ার পণ্য পেতে চায়, সে গুদাম ব্যবস্থাপকের কাছে গিয়েছিল, গুদামে নয়। যদি একটি নতুন আদেশ আসে, এটি শিপিং বিভাগের প্রধান ( public-facing representative) দ্বারা গৃহীত হয়েছিল এবং একটি কুরিয়ার ( someone not authorized to interact with the other departments) দ্বারা নয়।

অন্য কথায়, বস সম্পদ এবং ক্রিয়াকলাপগুলিকে একীভূত করে সংস্থানগুলিকে গোষ্ঠীতে (বিভাগ) ভাগ করে এবং অন্যদেরকে বিভাগের অভ্যন্তরীণ কাঠামোতে হস্তক্ষেপ করতে নিষেধ করে। আন্তঃবিভাগীয় মিথস্ক্রিয়া একটি নির্দিষ্ট ব্যক্তির মাধ্যমে যেতে হয়েছিল।

OOP এর দৃষ্টিকোণ থেকে , এটি প্রোগ্রামটিকে বস্তুতে ভাগ করা ছাড়া আর কিছুই নয়। পদ্ধতি এবং ভেরিয়েবলের একটি মনোলিথিক প্রোগ্রাম বস্তুর সমন্বয়ে একটি প্রোগ্রামে পরিণত হয়। এবং বস্তুর ভেরিয়েবল এবং পদ্ধতি আছে.

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

এটি তার বিশুদ্ধতম আকারে বিভক্ত এবং জয়।


2. কিভাবে প্রোগ্রাম তৈরি করা হয়

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

প্রায়শই প্রোগ্রামিংয়ে, আপনি এমন কিছু করতে পারেন না যেভাবে আপনি মূলত উদ্দেশ্য করেছিলেন এবং অনেকগুলি পুনরায় কাজ করতে হবে। গ্রাহকের প্রয়োজনীয়তা আরও প্রায়ই পরিবর্তিত হয়।

কিন্তু যদি গ্রাহক একটি খুব সুনির্দিষ্ট স্পেসিফিকেশন প্রদান করেন? যে জিনিস আরও খারাপ করে তোলে. সময়ের সাথে সাথে পণ্যটির সাথে কী ঘটে তা দেখে নিন।

পণ্যের সাফল্য গ্রাহককে একটি নতুন সংস্করণ প্রকাশ করতে চায়, এবং তারপরে অন্য এবং অন্যটি। এবং, অবশ্যই, আপনাকে যা করতে হবে তা হল বিদ্যমান পণ্যে "ছোট পরিবর্তন" যোগ করা। সুতরাং আপনি দেখতে পাচ্ছেন যে পণ্যের বিকাশ হচ্ছে ক্রমাগত পরিবর্তনের একটি ক্রম। শুধু টাইম স্কেল ভিন্ন। একটি নতুন সংস্করণ সপ্তাহে একবার, মাসে একবার বা প্রতি ছয় মাসে একবার প্রকাশিত হতে পারে।

এবং এই সব থেকে আমরা কি উপসংহার টানতে পারি? পণ্যের অভ্যন্তরীণ কাঠামোটি এমনভাবে বজায় রাখা দরকার যা ন্যূনতম পুনর্ব্যবহার সহ উল্লেখযোগ্য (এবং ছোট) পরিবর্তনগুলি করতে দেয়।

বস্তুর সমন্বয়

কিন্তু সেটা করার সিদ্ধান্ত নেওয়ার চেয়ে সেটা করা আরও কঠিন। আমরা ইতিমধ্যেই বলেছি যে একটি প্রোগ্রাম এমন বস্তু নিয়ে গঠিত যা একে অপরের সাথে যোগাযোগ করে। আসুন বোর্ডে আমাদের প্রোগ্রামের সমস্ত অবজেক্ট আঁকুন, পয়েন্ট দ্বারা তাদের প্রতিনিধিত্ব করুন। এবং আসুন প্রতিটি বস্তু (বিন্দু) থেকে অন্যান্য সমস্ত বস্তুর (বিন্দু) সাথে তীর আঁকুন যার সাথে এটি ইন্টারঅ্যাক্ট করে।

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

আলগা-কাপলিং নীতি

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

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

ভালোভাবে বেছে নিয়েছেন। কিন্তু যদি তারা ভালভাবে নির্বাচিত না হয়? তারপর পরিবর্তনের ক্ষমতা দ্রুত নিঃশেষ হয়ে যায় এবং আপনাকে পুরো সিস্টেমটি পুনরায় করতে হবে। এটা সময়ে সময়ে করতে হবে। আপনি ভবিষ্যতের ভবিষ্যদ্বাণী করতে পারবেন না, তবে আপনি ন্যূনতম রেডো সংখ্যা রাখতে পারেন।

বিমূর্তকরণের নীতি

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

এই অংশগুলির অভ্যন্তরীণ কাঠামো লুকিয়ে রাখা এবং অন্যান্য অংশগুলির সাথে মিথস্ক্রিয়াকে কঠোরভাবে সীমিত করা হল এনক্যাপসুলেশন এনক্যাপসুলেশন এবং বিমূর্ততা হল OOP- এর মূল ভিত্তি । একটি ভাল প্রোগ্রাম এই দুটি নীতি অনুসরণ করা আবশ্যক. ভবিষ্যতে, আমরা বাকি নীতিগুলি দেখব এবং সেগুলি কী সুবিধা প্রদান করে তা অন্বেষণ করব৷