আপনি নিকৃষ্টতম অ্যান্টি-প্যাটার্নগুলি এসেছেন [বন্ধ]


9

একজন প্রোগ্রামার হিসাবে আপনি আপনার ক্যারিয়ারে সবচেয়ে খারাপ এন্টি-প্যাটার্নগুলি কী কী?

আমি বেশিরভাগ জাভাতে জড়িত, যদিও এটি সম্ভবত ভাষা-স্বাধীন।

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

উত্তর:


38

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


7
ভাল অন্তত আপনি নিরাপদে এটি মুছতে পারেন। আমি যার সাথে কাজ করেছি তার বিপরীতে ঘন ঘন পদ্ধতিগুলির নাম পরিবর্তন করা এবং মৃত কোডটি অ্যাক্সেসযোগ্য ছেড়ে দেওয়া হবে। Blech।
জয়

@ সাইরেনা, আপনি এরিকের সাথেও কাজ করেছেন?!?!
ক্যাফগিকে

আমার কাছে একবার প্রচুর কোড ছিল যা জিনিসগুলি লক আউট করার জন্য # আইডিফিড কমেন্ট ব্যবহার করেছিল। কেউ মন্তব্য না করা পর্যন্ত দুর্দান্ত কাজ করেছেন until
মাইকেল কোহেন

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

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

19

আমি "কপি-পাস্তা" দিয়ে আরও একটি স্পষ্টভাবে আঘাত করব। কোডটি অনুলিপি করা যা আপনি যা চান তার প্রায় অনুরূপ, তারপরে কয়েকটি জিনিস পরিবর্তন করে (কোনও পদ্ধতিতে বের করার পরিবর্তে)।

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


16

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

কীভাবে (না) জাভাতে ফ্যাক্টরিয়াল লিখবেন বা তাই আমরা আপনার অ্যালগরিদমে একটি কারখানা স্থাপন করি


3
অসাধারণ! এখন ফ্যাক্টরিয়াল ওয়েলস সার্ভিস কোথায়? : পি
হতাশাহীন

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

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

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

তার জন্য ধন্যবাদ, ভাল পড়া।
Syg


14

অঞ্চল

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

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

অঞ্চলগুলি বিকাশকারীদের তাদের কৃপণকে "সরল দৃষ্টিতে" লুকিয়ে রাখতে উত্সাহিত করে।


15
অঞ্চলগুলির জন্য +1 বিকাশকারীদের তাদের বোকাটিকে "স্পষ্ট" দর্শনে উত্সাহ দেয় plain যাইহোক, যখন সঠিকভাবে ব্যবহার করা হয় তখন আমি দেখতে পাচ্ছি যে অঞ্চলগুলি যৌক্তিকভাবে কোডগুলিকে একত্রিত করতে এবং পরবর্তী সময়ে সহজেই খুঁজে পেতে সহায়তা করে।
ড্যারেন ইয়ং

ভাঁজ সম্পাদকদের ক্ষেত্রে এটি দীর্ঘকাল ধরে একটি সমস্যা। আমি সর্বশেষ ওসিসিএমে প্রোগ্রাম করার সময় একই ধরণের কাজ করতাম।
মাইকেল কোহেন

2
আমি অঞ্চলগুলি পছন্দ করি ... তবে কেবল সংস্থার জন্য ... কোডের ডিজিটাল রিমগুলি গোপন করছি না।
আইএবস্ট্র্যাক্ট

3
+1 টি। এ কারণেই অঞ্চলগুলি ব্যবহার করা স্টাইলকপ বিধি SA1124 লঙ্ঘন করে DoNotUseRegions
আর্সেনি মরজেনকো

1
আমার কাছে এমন প্রকল্প রয়েছে যা এসকিউএল-তে বিপুল সংখ্যক ক্ষেত্রের সাথে কাজ করে এবং কোড যেটি আপডেট করে / তৈরি করে তা অনেকগুলি লাইন। একটি অঞ্চল #region SQL Updateএটিকে সঙ্কুচিত করে তোলে তাই কম স্ক্রোলিংয়ের প্রয়োজন হয়।
জেলটন


9

ওভারলোডিং পদ্ধতি নয়:

// Do something
public int doSomething(Data d);

// Do same thing, but with some other data
public int doSomething2(SomeOtherData d);

পরিষ্কারভাবে দেখায় যে প্রোগ্রামার ওভারলোডিং বোঝে না।


5

লুপ সুইচ সিকোয়েন্সস

http://en.wikipedia.org/wiki/Loop-switch_sequence

তারা আমাকে শেষ পর্যন্ত বিরক্ত করে এবং প্রকৃতপক্ষে দেখায় যে দেব কতটা অনভিজ্ঞ ছিলেন


আহ, একটি সমাপ্ত রাষ্ট্রীয় মেশিন :)

এই সমাধিস্থ স্মৃতিগুলি কেন আপনার সামনে আনতে হবে? আমার খুব সুন্দর দিনটি কাটছিল।
মালাচি

5

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


4

ক্লায়েন্টে রাষ্ট্র রাখুন।

একবার ওয়েব অ্যাপ্লিকেশন নিয়ে কাজ করেছিল যেখানে সমস্ত রাজ্য ব্রাউজারে রাখা হয়েছিল। (সমস্যা-মুক্ত স্কেলাবিলিটি নিশ্চিত করতে সমস্ত ব্যতিক্রম উপেক্ষা করা হয়েছিল)।


আপনি দয়া করে বিস্তারিত বলতে পারেন? ইমো, কোনও ওয়েব অ্যাপ্লিকেশনের জন্য, এটি ঠিক আছে যখন একমাত্র রাষ্ট্র ব্রাউজারে থাকে (যেমন, কুকিজ), এবং সার্ভারটি 'ভাগ করে কিছুই নেই'। বা 'অ্যাপ্লিকেশন ডেটাবেস'-এর মতো' রাজ্য 'বলতে কী বোঝায়?
কেপলা

রাজ্য: কাজ করতে আসল তথ্য হিসাবে।

ওও আমার গভীর সহানুভূতি রয়েছে।
কেপলা

4

প্রচুর চেক ইন

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

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


1
কিছু না করা সবসময় খারাপ পরিস্থিতি নয়। কখনও কখনও পুনর্লিখনের কোড না থেকে স্ক্র্যাচ থেকে এটি লিখতে ভাল ...
মালাচি

4

বর্তমানে, আমি লিগ্যাসি কোডের একটি অংশ নিয়ে কাজ করছি এবং পূর্ববর্তী কোডার যেভাবে প্রথম তালিকার প্রথম উপাদানটি পেয়েছে তা আমি পছন্দ করি:

String result;
for(int i = 0; i < someList.size(); i++) {
    result = someList.get(i);
    break;
}

তবে আমি সবচেয়ে খারাপভাবে এই কোডটিতে দেখেছি ক্লাসগুলি ইনলাইন জেএসপি পৃষ্ঠাগুলি সংজ্ঞায়িত করছে, স্ক্রিপ্টলেট এবং আউট প্রিন্টলন ব্যবহার করে সমস্ত এইচটিএমএল, সিএসএস এবং জাভাস্ক্রিপ্ট লিখুন-


4

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

এটি একটি বিভাগীয় নীতি ছিল এ বিষয়টি একটি একক বিকাশকারীকে এভাবে আচরণ করার চেয়ে আরও খারাপ করে তুলেছে।


3

একটি স্ট্রিং আক্ষরিক লক করা

synchronized("one") { /* block one A*/ }

synchronized("one") { /* block one B*/ }

খুব দীর্ঘ শ্রেণীর নাম। (জেআরই তে)

com.sun.java.swing.plaf.nimbus.
InternalFrameInternalFrameTitlePaneInternalFrameTitlePaneMaximizeButtonWindowNotFocusedState

দরিদ্র উত্তরাধিকারের কাঠামো

com.sun.corba.se.internal.Interceptors.PIORB extends
com.sun.corba.se.internal.POA.POAORB extends
com.sun.corba.se.internal.iiop.ORB extends
com.sun.corba.se.impl.orb.ORBImpl extends
com.sun.corba.se.spi.orb.ORB extends
com.sun.corba.se.org.omg.CORBA.ORB extends 
org.omg.CORBA_2_3.ORB extends
org.omg.CORBA.ORB

একটি ব্যতিক্রম যা হয় না।

public interface FlavorException { }

অর্থহীন এবং ক্রিপ্টিক ত্রুটি হ্যান্ডলিং

if (properties.size() > 10000)
   System.exit(0);

অবজেক্টের অপ্রয়োজনীয় সৃষ্টি

Class clazz = new Integer(0).getClass();
int num = new Integer(text).intValue();

অন্যান্য উদ্দেশ্যে ব্যতিক্রম ছোঁড়া

try {
    Integer i = null;
    Integer j = i.intValue();
} catch (NullPointerException e) {
    System.out.println("Entering "+e.getStackTrace()[0]);
}

স্থির পদ্ধতিতে উদাহরণস্বরূপ অবজেক্টগুলি ব্যবহার করা।

Thread.currentThread().sleep(100);

একটি চূড়ান্ত নয় এমন ফিল্ডে সিঙ্ক্রোনাইজ করা

synchronized(list) {
   list = new ArrayList();
}

একটি ধ্রুব স্ট্রিংয়ের অর্থহীন অনুলিপি

String s = new String("Hello world");

স্ট্রিং.টোস্ট্রিং () এ অর্থহীন কল

String s = "Hello";
String t = s.toString() + " World";

কিছু স্মৃতি মুক্ত করতে System.gc () এ কল করুন

স্থানীয় ভেরিয়েবলটি কিছু মেমরি মুক্ত করতে নালায় সেট করা

    // list is out of scope anyway.
    list = null;
}

পারফরম্যান্স কারণে (বা অন্য কোনও মাইক্রো-মাইক্রো-অপ্টিমাইজেশন) i ++ এর পরিবর্তে ++ i ব্যবহার করা হচ্ছে


এগুলি অ্যান্টি-প্যাটার্নগুলি অগত্যা নয়, কেবল খারাপ কোডিং।
গ্যারি উইলওবি

@ গ্যারি বা উন্নয়নের দুর্বল নিদর্শনগুলি আমি পুনরাবৃত্তি দেখতে পাচ্ছি। সম্ভবত কোনও অ্যান্টি-প্যাটার্নের কঠোর সংজ্ঞার মধ্যে নয়।
পিটার লরে

1
@ পিটার: "কিছু স্মৃতি মুক্ত করার জন্য System.gc () এ কল করুন", আমি একটি উপলক্ষ দেখেছি যেখানে জিসিকে সুস্পষ্টভাবে ডাকা না হলে নেট নেট আউটআফ মেমরি ব্যতিক্রম সহ বিস্ফোরিত হবে। অবশ্যই এটি একটি নিয়মের চেয়ে বেশি ব্যতিক্রম ছিল।
কোডার

3

কোডটি দিয়ে ছিটানো:

// TODO: 

অথবা

// TODO: implement feature 

কোন অতিরিক্ত তথ্য ছাড়া।


2

ডমিগুলির জন্য আইট্রেটার:

Iterator iCollection = collection.iterator();
for(int i = 0 ; i < collection.size() ; i++ ){
    if(collection.get(i) == something){
       iCollection.remove();
    }
 }

Singletono-কারখানার:

public class SomeObject{
   private SomeObject() {}
   public static SomeObject getInstance(){
       return new SomeObject();
   }
}

যদি-অন্য চালিত বিকাশ (ওপেন ক্লোজ নীতিও বলা হয় - বোঝার জন্য পরিবর্তনের জন্য উন্মুক্ত):

if (sth1){
...  
}else if(sth2){
..
}
...
..
else if(sth1000000000000){
...
}

স্ট্রিংপ্যাটার্ন (স্ট্রিংওজেক্ট নামেও পরিচিত):

a) sendercode
if(sth1)
   str+="#a";
if(sth2)
   str+="#b";
...
if(sth1000)
   str+="#n";

b) receiver
   regexp testing if str contains #a, #b, ... #n

যে else ifপ্রায়ই তারপর একমাত্র উপায় জিনিষ করাতে, যদিও। আমি স্ট্রিং সম্পর্কে চিন্তা করছি; একটি সুইচ ব্যবহার করতে পারবেন না। এটি কার্যকর হওয়ার জন্য শর্তগুলি একই রকম হওয়া উচিত।
মাইকেল কে

প্রতিটি আইএমএইচও করুন / অন্যথায় সাধারণ ম্যাপিং বা দর্শনার্থীর ধরণ দিয়ে প্রতিস্থাপন করা যেতে পারে। স্ট্রিংয়ের ক্ষেত্রে যেমন আপনার কাছে প্রোপার্টি ফাইল থাকতে পারে: someString1 = some.package.ObjectToHandleSomeString1
Marcin

2
Singleton হয় একটি কারখানা । কোডটিতে কোনও ভুল নেই। কেবলমাত্র ভুলটি হতে পারে যে বাইরের কোডটি অনুমান করে তোলে যে প্রতিটি কল getInstanceএকই দৃষ্টিতে ফিরে আসে। এই ধরনের অনুমানের ফলে এনক্যাপসুলেশন ভেঙে যায় এবং এটি প্রকৃতপক্ষে অ্যান্টি-নিদর্শনগুলির মধ্যে একটি সাধারণ।
back2dos

স্পষ্টতই এ কারণেই এটি বিভ্রান্তিকর :) :) যদি পদ্ধতিটিকে ক্রিয়েট () বলা হত বা প্রতিটি জিনিস পুরোপুরি ঠিকঠাক হয়ে উঠত তবে একই ঘটনাটি ফিরে আসত
মার্সিন মিশালস্কি

2

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

এটি আরও জেনেরিকের সাথে যুক্ত হয়েছে যদিও, এটি করবে প্যাটার্ন, এটির জন্য এখানে একটি প্রতিনিধি কোডের কোড রয়েছে:

int num = new Integer( stringParam ).parseInt( stringParam );

এটি সব পরে কাজ করে।


2

আমি পুরোপুরি বিমূর্ত বিপরীততা বা উচ্চ-স্তরের আদিমদের শীর্ষে নিম্ন-স্তরের আদিমদের পুনর্বিবেচনাকে ঘৃণা করি । যদিও কখনও কখনও এটি খারাপ ভাষা ডিজাইনারদের দ্বারা হয়, খারাপ প্রোগ্রামারদের দ্বারা নয়। উদাহরণ:

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

  2. ম্যাটল্যাব এবং আর-তে, জোর দিয়েছিলেন যে সমস্ত কিছু আদিম না হয়ে ভেক্টর / ম্যাট্রিক্স।

  3. আমরা যখন ম্যাটল্যাবকে ধাক্কা দিচ্ছি তখন কীভাবে এটির কোনও পূর্ণসংখ্যা থাকে না, সুতরাং আপনার যখন একটি পূর্ণসংখ্যার প্রয়োজন হয় তখন আপনাকে একটি দ্বিগুণ ব্যবহার করতে হবে।

  4. লুপ লেখার জন্য আপনাকে ফাংশন কলগুলি ব্যবহার করতে হবে এমন খাঁটি কার্যকরী ভাষা।


1

এটি অবশ্যই অনুলিপি / আটকানো হবে, আমি এর ফলে প্রচুর খারাপ কোড হয়ে যাচ্ছি দেখেছি, এটি এবং কাউবয় কোডিং এবং এর থেকে প্রাপ্ত সমস্ত কিছুই। (গড ক্লাস, অতিরিক্ত বড় পদ্ধতি, খারাপ থিংক অ্যালগরিদম ইত্যাদি)

এবং যদি নকশার নিদর্শনগুলির অনুমতি দেওয়া হয় তবে সেগুলি আমি বলব: কোনও পরিকল্পনা বা ডোমেন বিশ্লেষণ না করে কোনও পরিকল্পনা থেকে কর্মের সেট হিসাবে কোনও প্রকল্প করা Do


1

মাল্টি-ব্যবহার জাভা বিন -

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

এছাড়াও, প্রিয়জনকে ভুলতে পারি না

try{ 
   ... //many lines of likely dangerous operations
}
catch(Exception e){}

আইএমএইচও, ব্যতিক্রম দুর্গন্ধ। এগুলি সঠিকভাবে পেতে খুব শক্ত এবং তারা সুরক্ষার একটি ভ্রান্ত ধারণা তৈরি করে sense
কোডার

ব্যতিক্রমগুলির দুর্গন্ধ সম্পর্কে আপনার মতামত যাই হোক না কেন, নিঃশব্দে গিলে ফেললে আরও দুর্গন্ধ হয়।
স্টিভ বি।

1

একজন প্রাক্তন সহকর্মীর কেবলমাত্র নতুন তৈরির পরিবর্তে তাদের বৈশিষ্ট্যগুলি ওভাররাইট করে পুনরায় ব্যবহারের অভ্যাস ছিল। নতুন বৈশিষ্ট্যগুলি প্রয়োগ করার সময় এটি যে পরিমাণ সমস্যার সৃষ্টি করেছে তা আমি কখনই ভাবতে পারি না।


1

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


পৃষ্ঠাগুলির মধ্যে ডেভড গবগুলি পাস করার জন্য এএসপি.নেট-এর সেশন এবং ভিউস্টেটের উপর নির্ভর করার মতো একরকম শোনায়, যা প্রায়শই দুঃখজনকভাবে প্রয়োজন ...
ওয়েন মোলিনা

1

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


0

আমি মনে করি যে আমি দেখেছি এমন একটি খারাপ অ্যান্টি-প্যাটার্নগুলির মধ্যে একটি কম্পিউটার মেমোরি ব্যবহার না করে একটি ডাটাবেস টেবিলকে অস্থায়ী সঞ্চয়স্থান হিসাবে ব্যবহার করা জড়িত।

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

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

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

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

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

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

দ্রষ্টব্য: আমি বলছি না যে এই প্যাটার্নটি অন্তর্নিহিতভাবে খারাপ, তবে এই উদাহরণে আমি অপ্রয়োজনীয় বলে মনে করি যখন মৌলিক ওও নীতিগুলি পর্যাপ্ত হত।

আমি এই অ্যান্টি-প্যাটার্নটির কোনও নাম সম্পর্কে নিশ্চিত নই কারণ এই প্রথম এমন কোনও কাজ আমি প্রথম দেখলাম। এই ছেলের জন্য আপনি যে কোনও ভাল নাম ভাবতে পারেন?


আমি এটিকে কম্বল সমস্যা বলব না। এটি কতটা অস্থায়ী ডেটা সংরক্ষণ করা হচ্ছে এবং এর সাথে কী করা হচ্ছে তার উপর নির্ভর করবে।
গ্র্যান্ডমাস্টারবি

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

2
আপনি নিজের সমস্যার ডোমেন উল্লেখ করেন না, তবে সবসময় কোনও খারাপ জিনিস হয় না, অন্য কোথাও এ জাতীয় অবস্থা রাখলে প্রক্রিয়াগুলি স্কেল করা যায় এবং দীর্ঘ সময়কালে আত্ম-সংক্ষিপ্ত হতে পারে, ডিবাগিংয়ে সহায়তা করতে পারে। ডিবি অ্যাক্সেস কর্মক্ষমতা সংক্রান্ত সমস্যা বা উদ্বেগ সৃষ্টি করছিল?
Jé ক্যু

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

0

ঘোড়া-আগে-ঘোড়া - ওরফে ইউমাইটনিডআইটি

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

  • বিমূর্ত ধারণা, ক্রস রেফারেন্স সহ একটি আরডিএমবিস স্কিমা তৈরি করা - সংক্ষেপে একটি অতিরিক্ত-সাধারণীকরণ করা ডেটা কিউব ... এবং এরপরে সমস্ত কিছু মডেলের চারপাশে লেখার বৈশিষ্ট্য।

ইয়াগনি'র দুষ্ট যোজন ভাই হবেন, তাই না?
ওয়েইন মোলিনা

0

আইএমওটি দেখেছি সবচেয়ে খারাপ এন্টি-প্যাটার্নটি হ'ল "আমাদের কোনও দুর্গন্ধের ধরণের দরকার নেই" অ্যান্টি-প্যাটার্ন: ধারণা যে নকশার ধরণগুলি সময়ের অপচয় এবং আপনি কেবলমাত্র একসাথে opালু করে কোডটি দ্রুত লিখতে পারেন এবং অনুলিপি / প্রয়োজন হিসাবে আটকানো

সম্মানজনক উল্লেখ কোড রয়েছে যা পুরাতন VB6 স্টাইল ব্যবহার করে ডাটাবেস থেকে একটি বস্তু লোড করে:

Foobar oFoo = new Foobar();
oFoo.FooID = 42;
if (oFoo.Load()) { 
    // do something with oFoo
}

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

এছাড়াও, এই জাতীয় জিনিস:

// this name is misleading, we may not always want to stand in fire,
// we may want to stand in slime or voidzones or ice patches...
public Foobar StandInFire() { }

// why is this here???
public string BeatWithNerfBat(string whom) { }

// ????
public int GivePony(string to) { }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.