সলিড নীতি অনুসারে খোলা / বন্ধ

বন্ধ নীতি খুলুন
পদ্ধতি

সফ্টওয়্যার সত্তা (শ্রেণি, মডিউল, ফাংশন, ইত্যাদি) এক্সটেনশনের জন্য উন্মুক্ত হওয়া উচিত, তবে সম্পাদনার জন্য বন্ধ করা উচিত।

সফ্টওয়্যারটি ডিজাইন করা: মডিউল, ক্লাস এবং ফাংশনগুলি এমনভাবে করা যায় যে যখন নতুন কার্যকারিতা প্রয়োজন হয় তখন আমাদের বিদ্যমান কোডটি সংশোধন করা উচিত নয় বরং নতুন কোড লিখতে হবে যা বিদ্যমান কোড ব্যবহার করবে। এটি অদ্ভুত লাগতে পারে, বিশেষত জাভা, সি, সি ++ বা সি # এর মতো ভাষার সাথে যেখানে এটি কেবল উত্স কোডের ক্ষেত্রেই নয়, বাইনারিগুলিতেও প্রযোজ্য। আমরা এমন উপায়ে নতুন বৈশিষ্ট্য তৈরি করতে চাই যাতে বিদ্যমান বাইনারি, এক্সিকিউটেবল বা ডিএলএলগুলির পুনরায় বিতরণের প্রয়োজন হয় না।
SOLID প্রসঙ্গে OCP

 

পরিপূরক এসআরপি এবং ওসিপি

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

 

ওসিপি নীতি লঙ্ঘনের উদাহরণ

খাঁটি প্রযুক্তিগত দৃষ্টিকোণ থেকে, মুক্ত / বন্ধ নীতিটি খুব সহজ। নীচের মতো দুটি শ্রেণীর মধ্যে একটি সহজ সম্পর্ক ওসিপি নীতি লঙ্ঘন করে।

ব্যবহারকারীর যুক্তি

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

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

 

ফাংশন পরীক্ষাআইটিক্যানগেটপ্রেগ্রিফসফিলএএসএপিয়ারসেন্ট () {
     $ ফাইল = নতুন ফাইল ();
     $ ফাইল-> দৈর্ঘ্য = 200;
     $ ফাইল-> প্রেরণ = 100;
     $ অগ্রগতি = নতুন অগ্রগতি ($ ফাইল);
     $ এটি-> assertEquals (50, $ অগ্রগতি-> getAsPercent ());
}

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

 

ক্লাস ফাইল {
     পাবলিক দৈর্ঘ্য;
     সর্বজনীন $ প্রেরণ;
}

 

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

 

বর্গ অগ্রগতি {

     ব্যক্তিগত $ ফাইল;

     ফাংশন __ কনস্ট্রাক্ট (ফাইল $ ফাইল) {
          $ এই-> ফাইল = $ ফাইল;
     }

     ফাংশন getAsPercent () {
          ফিরুন - এই-> ফাইল-> প্রেরণ * 100 / $ এটি-> ফাইল-> দৈর্ঘ্য;
     }

}

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

এই কোডটি সঠিক বলে মনে হচ্ছে, তবে এটি মুক্ত / বন্ধ নীতি লঙ্ঘন করে।

কিন্তু কেন?

এবং কিভাবে?

 

প্রয়োজনীয়তা পরিবর্তন করার চেষ্টা করা যাক

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

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

 

সম্ভাব্য সমাধান

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

বর্গ অগ্রগতি {

     ব্যক্তিগত $ ফাইল;

     ফাংশন __ কনস্ট্রাক্ট ($ ফাইল) {
         $ এই-> ফাইল = $ ফাইল;
     }

    ফাংশন getAsPercent () {
         ফিরুন - এই-> ফাইল-> প্রেরণ * 100 / $ এটি-> ফাইল-> দৈর্ঘ্য;
     }

}

আমরা এখন অগ্রগতিতে যে কোনও কিছুই চালু করতে পারি। এবং যে কোনও অর্থ, আমি আক্ষরিক অর্থ:

ক্লাস সংগীত {

পাবলিক দৈর্ঘ্য;
সর্বজনীন $ প্রেরণ;

পাবলিক $ শিল্পী;
সর্বজনীন $ অ্যালবাম;
পাবলিক-রিলিজডেট;

অ্যালবামকভারফাইলে ফাংশন () {
'চিত্র / কভার /' ফিরিয়ে দিন। $ এই-> শিল্পী। '/'। $ এটি-> অ্যালবাম। '.png';
}
}

এবং উপরের মতো মিউজিক ক্লাস পুরোপুরি কার্যকর করবে। আমরা খুব সহজেই ফাইলের অনুরূপ একটি পরীক্ষা দিয়ে এটি পরীক্ষা করতে পারি।
ফাংশন পরীক্ষাআইটিক্যানগেটপোগ্রেসঅফ্যামিউজিক স্ট্রিমএএসপিয়ারসেন্ট () {
$ সংগীত = নতুন সংগীত ();
$ সংগীত-> দৈর্ঘ্য = 200;
$ সংগীত-> প্রেরণ = 100;

$ অগ্রগতি = নতুন অগ্রগতি ($ সঙ্গীত);

$ এটি-> assertEquals (50, $ অগ্রগতি-> getAsPercent ());
}

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

বর্গ অগ্রগতি {

ব্যক্তিগত $ পরিমাপযোগ্য

ফাংশন __ কনস্ট্রাক্ট ($ পরিমাপযোগ্য কনটেন্ট) {
$ এটি-> পরিমাপযোগ্য কনটেন্ট = $ পরিমাপযোগ্য কনটেন্ট;
}

ফাংশন getAsPercent () {
রিটার্ন - এটি-> পরিমাপযোগ্য কনটেন্ট-> প্রেরণ * 100 / $ এটি-> পরিমাপযোগ্য কনটেন্ট-> দৈর্ঘ্য;
}

}

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

Uনা ক্লাস যা বেস ক্লাসের কোনও পদ্ধতিকে ওভাররাইড করে যাতে বেস ক্লাস চুক্তিটি উত্পন্ন শ্রেণীর দ্বারা সম্মানিত না হয়। 

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

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

এই সমাধানটি কেবলমাত্র তখনই সুপারিশ করা হয় যদি নীচে অন্য টিপসের কোনওটিই সহজেই প্রয়োগ করা যায় না বা যদি তারা গুরুতর স্থাপত্য পরিবর্তনগুলি চাপিয়ে দেয় যা চেষ্টার নিশ্চয়তা দেয় না।

এরকোল পালমেরি

সিভি এরকোল পামেরি
কোন মন্তব্য নেই

Lascia উন commento

আপনার ইমেল ঠিকানা প্রকাশিত হবে না। বাধ্যতামূলক ক্ষেত্রগুলি চিহ্নিত করা হয়েছে *

ব্যবসায় গোয়েন্দা কৌশল
পদ্ধতি
সফল ব্যবসায়ের বুদ্ধি জন্য কৌশল

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

সলিড কঠিন জ্যামিতিক পরিসংখ্যান
প্রশিক্ষণ
1
SOLID অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিংয়ের 5 টি মূলনীতি কী

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

উদ্ভাবন অর্থ
পদ্ধতি
একটি উদ্ভাবন তৈরির 4 টি (ব্যবহারিক) পদক্ষেপ

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