অ্যান্টি-প্যাটার্ন কী?


193

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

বিরোধী-নিদর্শন কী, কেউ কি আমাকে সহজ কথায় ব্যাখ্যা করতে পারেন? উদ্দেশ্য কি? তারা কি করে? এটা খারাপ জিনিস না ভাল জিনিস?




এটি খারাপ হিসাবে বিবেচিত, তবে এটিই হতে পারে একমাত্র সমাধান। দু'বার ভাবি আর যাও।
Ван Ван

উত্তর:


245

অ্যান্টি-প্যাটার্নগুলি সফ্টওয়্যার বিকাশের কিছু নির্দিষ্ট নিদর্শন যা খারাপ প্রোগ্রামিং অনুশীলন হিসাবে বিবেচিত হয়।

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

উদাহরণস্বরূপ, অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিংয়ে, ধারণাটি হল সফ্টওয়্যারটিকে ছোট ছোট টুকরোতে অবজেক্ট বলে আলাদা করা। অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিংয়ের একটি অ্যান্টি-প্যাটার্ন হ'ল object শ্বর অবজেক্ট যা প্রচুর ফাংশন সম্পাদন করে যা বিভিন্ন অবজেক্টে আরও ভালভাবে বিভক্ত হয়ে যায়।

উদাহরণ স্বরূপ:

class GodObject {
    function PerformInitialization() {}
    function ReadFromFile() {}
    function WriteToFile() {}
    function DisplayToScreen() {}
    function PerformCalculation() {}
    function ValidateInput() {}
    // and so on... //
}

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

class FileInputOutput {
    function ReadFromFile() {}
    function WriteToFile() {}
}

class UserInputOutput {
    function DisplayToScreen() {}
    function ValidateInput() {}
}

class Logic {
    function PerformInitialization() {}
    function PerformCalculation() {}
}

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


9
গডঅবজেক্টের পাশে অ্যান্টি-প্যাটার্নসের অন্য কোনও উদাহরণ?
টমাসজ মুলারসিজিক

@ টমাসজ প্রোগ্রামিং পাস্তা এর একটি উদাহরণ। এটি অনেক ছোট ছোট বস্তুর মধ্যে দুর্বল এনক্যাপসুলেশন হিসাবে সেরা হিসাবে সাধারণীকরণ করা হয়। এটা ঈশ্বরের বস্তুর বিপরীত বিবেচনা en.wikipedia.org/wiki/Spaghetti_code
AWrightIV

@ টমাসজ যা কিছু খারাপ তা কিন্তু কিছু লোক এটি সম্পন্ন করে এটি একটি অ্যান্টিপ্যাটার্ন। উদাহরণস্বরূপ, try: <do something>; except: passপাইথনের কার্ডিনাল সিন অ্যান্টিপেট্টার হতে পারে। এটি দেখুন: realpython.com/blog/python/…
এরিক

1
একটি সিঙ্গেলটনকে কী এন্টি-প্যাটার্ন হিসাবে বিবেচনা করা যেতে পারে কারণ সমান্তরালে পরীক্ষাগুলি ঠাট্টা করা এবং চালানো শক্ত করে তোলে (যেহেতু সমস্ত পরীক্ষাগুলি একই সিঙ্গলটন ব্যবহার করে এবং এমন পরিবর্তন ঘটায় যার ফলে অসঙ্গতি ঘটে)?
lostsoul29

63

যখনই আমি অ্যান্টি-প্যাটার্নগুলি সম্পর্কে শুনি, আমি অন্য একটি শব্দটি প্রত্যাহার করি। ডিজাইন গন্ধ।

"ডিজাইনের গন্ধগুলি ডিজাইনের নির্দিষ্ট কাঠামো যা মৌলিক নকশার নীতি লঙ্ঘন এবং নকশার মানকে নেতিবাচকভাবে প্রভাবিত করে।" ("সফটওয়্যার ডিজাইনের গন্ধের জন্য রিফ্যাক্টরিং: প্রযুক্তিগত debtণ পরিচালনার" থেকে)

লঙ্ঘনকারী নকশার নীতিগুলির উপর ভিত্তি করে অনেকগুলি ডিজাইনের গন্ধ শ্রেণিবদ্ধ রয়েছে:

বিমূর্ত গন্ধ হয়

মিসিং অ্যাবস্ট্রাকশন: ক্লাস বা ইন্টারফেস তৈরির পরিবর্তে ডেটা বা এনকোডযুক্ত স্ট্রিংগুলির ক্লাম্প ব্যবহার করা হয় তখন এই গন্ধটি দেখা দেয়।

অপরিহার্য বিমূর্ততা: কোনও অপারেশনকে ক্লাসে রূপান্তরিত করা হলে এই গন্ধ দেখা দেয়।

অসম্পূর্ণ বিমূর্ততা: যখন কোনও বিমূর্ততা পরিপূরক বা আন্তঃসম্পর্কিত পদ্ধতিগুলিকে সম্পূর্ণ সমর্থন করে না তখন এই গন্ধ উত্থিত হয়।

বহুমুখী বিমূর্ততা: এই গন্ধ তখন উত্থাপিত হয় যখন কোনও বিমূর্তির উপর এটির একাধিক দায়িত্ব অর্পিত হয়।

অপ্রয়োজনীয় বিমূর্ততা: এই গন্ধটি তখন ঘটে যখন একটি বিমূর্ততা যা আসলে প্রয়োজন হয় না (এবং এভাবে এড়ানো যেত) একটি সফ্টওয়্যার ডিজাইনে প্রবর্তিত হয়।

অপব্যবহারযোগ্য বিমূর্ততা: কোনও বিমূর্ততা অব্যবহৃত অবস্থায় রেখে দেওয়া হয় (হয় সরাসরি ব্যবহার করা হয় না বা পৌঁছনীয় হয় না) তখন এই গন্ধটি দেখা দেয়।

সদৃশ বিমূর্ততা: দুটি বা তার বেশি বিমূর্তির অভিন্ন নাম বা অভিন্ন বাস্তবায়ন বা উভয়ই থাকে তখন এই গন্ধটি উত্থিত হয়।

এনক্যাপসুলেশনের গন্ধ হয়

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

ফুটো এনক্যাপসুলেশন: এই গন্ধটি তখন উত্থাপিত হয় যখন কোনও বিমূর্ততা তার প্রকাশ্য ইন্টারফেসের মাধ্যমে "প্রকাশ" বা "ফাঁস" বাস্তবায়ন বিবরণ দেয়।

অনুপস্থিত এনক্যাপসুলেশন: এই গন্ধটি তখন ঘটে যখন বাস্তবায়নের বৈচিত্রগুলি কোনও বিমূর্ততা বা শ্রেণিবিন্যাসের মধ্যে আবদ্ধ না হয়।

অব্যক্ত এনক্যাপসুলেশন: এই গন্ধটি তখনই উত্থাপিত হয় যখন ক্লায়েন্ট কোডগুলি হায়ারার্কির মধ্যে ইতিমধ্যে এনক্যাপুলেটেড ধরণের প্রকারের বৈকল্পিকতা ব্যবহার করার পরিবর্তে স্পষ্টত প্রকারের চেক (যদি চেইনযুক্ত if-else ব্যবহার করে বা বস্তুর ধরণটি পরীক্ষা করে এমন স্যুইচ স্টেটমেন্ট ব্যবহার করে) ব্যবহার করে smell

Modulariization গন্ধ

ভাঙা মডুলারাইজেশন: এই গন্ধ তখন উত্থিত হয় যখন ডেটা এবং / বা পদ্ধতিগুলি আদর্শভাবে একটি একক বিমূর্তিতে রূপান্তরিত হওয়া উচিত ছিল এবং একাধিক বিমূর্ততা জুড়ে ছড়িয়ে পড়ে।

অপর্যাপ্ত Modulariization: এই গন্ধ উত্থাপিত হয় যখন একটি বিমূর্ততা উপস্থিত থাকে যা সম্পূর্ণরূপে পচে যায়নি, এবং আরও পরে পচন তার আকার, বাস্তবায়ন জটিলতা বা উভয় হ্রাস করতে পারে।

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

হাব-লাইক মডুলারাইজেশন: এই গন্ধটি তখনই উত্থাপিত হয় যখন বিমূর্তনের সাথে অনেকগুলি অন্যান্য বিমূর্ততা সহ নির্ভরতা (আগত এবং বহির্গামী উভয়) থাকে।

হায়ারার্কির গন্ধ হয়

অনুপস্থিত হায়ারার্কি: এই গন্ধটি তখনই উত্থাপিত হয় যখন কোনও কোড বিভাগটি শর্তাধীন যুক্তি ব্যবহার করে (সাধারণত "ট্যাগযুক্ত প্রকারের" সাথে মিলিতভাবে) আচরণে স্বতন্ত্রভাবে পরিচালনা করতে যেখানে একটি শ্রেণিবিন্যাস তৈরি করা যেতে পারে এবং সেই সমস্ত প্রকারভেদগুলি encapsulate করতে ব্যবহৃত হতে পারে।

অপ্রয়োজনীয় শ্রেণিবিন্যাস: পুরো উত্তরাধিকারের শ্রেণিবদ্ধতা যখন অপ্রয়োজনীয় তখন এই গন্ধটি উত্থাপিত হয়, এটি নির্দেশ করে যে নির্দিষ্ট নকশার প্রেক্ষাপটের জন্য উত্তরাধিকার অযথা প্রয়োগ করা হয়েছে।

অনুপযুক্ত হায়ারার্কি: শ্রেণিবিন্যাসের ধরণের মধ্যে অপ্রয়োজনীয় সদৃশ যখন হয় তখন এই গন্ধটি দেখা দেয়।

প্রশস্ত হায়ারার্কি: যখন উত্তরাধিকারের স্তরক্রম "খুব" প্রশস্ত থাকে তখন মধ্যবর্তী প্রকারগুলি অনুপস্থিত হতে পারে এমন ইঙ্গিত দিয়ে এই গন্ধটি দেখা দেয়।

অনুমানমূলক শ্রেণিবিন্যাস : এই শ্রেণিবিন্যাস উত্থিত হয় যখন শ্রেণিবদ্ধের এক বা একাধিক ধরণের অনুমানমূলকভাবে সরবরাহ করা হয় (যেমন, বাস্তবের প্রয়োজনের পরিবর্তে কল্পনাশক্তির ভিত্তিতে)।

গভীর হায়ারার্কি: যখন উত্তরাধিকারের স্তরক্রম "অত্যধিক" গভীর হয় তখন এই গন্ধ উত্থিত হয়।

বিদ্রোহী হায়ারার্কি: এই গন্ধ উত্থাপিত হয় যখন কোনও উপপ্রকার তার সুপার টাইপ (গুলি) দ্বারা সরবরাহিত পদ্ধতিগুলি প্রত্যাখ্যান করে।

ব্রোকেন হায়ারার্কি: এই গন্ধটি তখন উত্থিত হয় যখন একটি সুপারটাইপ এবং এর সাব টাইপ ধারণামূলকভাবে একটি "আইএস-এ" সম্পর্ক ভাগ করে না দেয় যার ফলস্বরূপ ভাঙা বিকল্প বদলে যায় ability

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

সাইক্লিক হায়ারার্কি: এই গন্ধ তখন উত্থিত হয় যখন শ্রেণিবিন্যাসের একটি সুপারটাইপ তার কোনও উপ-টাইপের উপর নির্ভর করে।


উপরের সংজ্ঞা এবং শ্রেণিবিন্যাস "সফ্টওয়্যার ডিজাইনের গন্ধের জন্য রিফ্যাক্টরিং: প্রযুক্তিগত debtণ পরিচালনার জন্য" বর্ণিত হয়েছে । আরও কিছু প্রাসঙ্গিক সংস্থান এখানে পাওয়া যাবে


41

একটি ধরণটি কোনও শ্রেণীর কোনও সমস্যার সমাধান কীভাবে করা যায় তার একটি ধারণা। একটি অ্যান্টি-প্যাটার্ন হ'ল এটি কীভাবে সমাধান করা যায় না সে ধারণা যা এই ধারণাটি বাস্তবায়নের ফলে খারাপ ডিজাইনের ফলস্বরূপ।

একটি উদাহরণ: একটি "প্যাটার্ন" কোড পুনরায় ব্যবহারের জন্য একটি ফাংশন ব্যবহার করা হবে, একটি "অ্যান্টি-প্যাটার্ন" একই জন্য অনুলিপি-পেস্ট ব্যবহার করা হবে। উভয়ই একই সমস্যা সমাধান করে তবে একটি ফাংশন ব্যবহার করা সাধারণত কপি-পেস্টের চেয়ে বেশি পঠনযোগ্য এবং রক্ষণাবেক্ষণযোগ্য কোডের দিকে নিয়ে যায়।


18

একটি অ্যান্টি-প্যাটার্ন একটি সমস্যা সমাধান না করার একটি উপায়। তবে এর আরও রয়েছে: সমস্যাটি সমাধানের চেষ্টাতে এটি প্রায়শই দেখা যায়।


13

আপনি যদি সত্যই অ্যান্টিপ্যাটার্নগুলি অধ্যয়ন করতে চান তবে অ্যান্টিপ্যাটার্নস বইটি পান (আইএসবিএন -13: 978-0471197133)।

এটিতে তারা সংজ্ঞায়িত করেন "একটি অ্যান্টিপ্যাটার্ন একটি সাহিত্যিক ফর্ম যা কোনও সমস্যার একটি সাধারণভাবে ঘটে যাওয়া সমাধানের বর্ণনা দেয় যা সিদ্ধান্তগতভাবে নেতিবাচক পরিণতি তৈরি করে।"

সুতরাং, যদি এটি কোনও খারাপ প্রোগ্রামিং অনুশীলন হয় তবে সাধারণ নয় - একটি অ্যাপ্লিকেশন, একটি সংস্থা বা একটি প্রোগ্রামার পর্যন্ত সীমাবদ্ধ থাকে তবে এটি অ্যান্টিপ্যাটার্ন সংজ্ঞাটির "প্যাটার্ন" অংশটি পূরণ করে না।


9

গণ্ডগোল করার একটি সাধারণ উপায় to গড / কিচেনসিংক ক্লাসের মতো (উদাহরণস্বরূপ)।


6

মজার বিষয় হল সমস্যা সমাধানের একটি প্রদত্ত উপায় একটি প্যাটার্ন এবং একটি অ্যান্টি-প্যাটার্ন উভয়ই হতে পারে। সিঙ্গেলটন এটির প্রধান উদাহরণ। এটি সাহিত্যের উভয় সেট প্রদর্শিত হবে।


6

একটি অ্যান্টি-প্যাটার্ন হ'ল ডিজাইনের প্যাটার্নের পরিপূরক । একটি অ্যান্টি-প্যাটার্ন হ'ল একটি টেমপ্লেট সমাধান যা আপনার নির্দিষ্ট পরিস্থিতিতে ব্যবহার করা উচিত নয়।


6

ঠিক ডিজাইনের প্যাটার্নের মতোই , একটি অ্যান্টি-প্যাটার্ন হ'ল একটি নির্দিষ্ট সমস্যা সমাধানের একটি টেমপ্লেট এবং পুনরাবৃত্তিযোগ্য উপায়, তবে একটি অনুকূল এবং অকার্যকর উপায়ে।


4

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

"একটি সাধারণভাবে ব্যবহৃত প্রক্রিয়া, কাঠামো বা কর্মের ধরণ যা প্রাথমিকভাবে কোনও সমস্যার উপযুক্ত এবং কার্যকর প্রতিক্রিয়া হিসাবে উপস্থিত হওয়া সত্ত্বেও সাধারণত উপকারী ফলাফলের চেয়ে আরও খারাপ পরিণতি হয়” "

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


2

অ্যান্টি-প্যাটার্নগুলি এমন সাধারণ উপায় যা লোকেদের ভুল উপায়ে প্রোগ্রাম করার ঝুঁকি রয়েছে, বা কমপক্ষে এত ভাল উপায় নয়।


0

প্রদত্ত সফ্টওয়্যার বিকাশের পরিবেশের জন্য যে কোনও ডিজাইনের প্যাটার্ন ভালের চেয়ে বেশি ক্ষতি করছে সেটিকে অ্যান্টি-প্যাটার্ন হিসাবে বিবেচনা করা হবে।

কিছু অ্যান্টি-প্যাটার্ন সুস্পষ্ট তবে কিছু না। উদাহরণস্বরূপ সিঙ্গেলটন, যদিও অনেকে এটিকে পুরানো ডিজাইনের ধরণটিকে ভাল বলে মনে করেন তবে অন্যরাও আছেন না।

আপনি প্রশ্নটি যাচাই করতে পারেন সিলেটলেট সম্পর্কে এত খারাপ কী? এটি সম্পর্কে বিভিন্ন মতামত আরও ভালভাবে বুঝতে।


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

0

অ্যালগরিদমের মতো আপনি ব্রুট ফোর্স ব্যবহার করে সমাধানটি অর্জন করতে পারেন তবে পরিস্থিতি জটিল হয়ে উঠলে আপনাকে অনেক মূল্য দিতে হবে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.