প্রিয় (চালাক) ডিফেন্সিভ প্রোগ্রামিং সেরা অভ্যাসসমূহ [বন্ধ]


148

আপনি যদি ডিফেন্সিভ কোডিংয়ের জন্য আপনার প্রিয় (চতুর) কৌশলগুলি বেছে নিতে চান তবে সেগুলি কী হবে? যদিও আমার বর্তমান ভাষাগুলি জাভা এবং অবজেক্টিভ-সি (সি ++ এর পটভূমি সহ), কোনও ভাষাতে নির্দ্বিধায় উত্তর দিন। আমাদের এখানে 70০% ইতিমধ্যে জেনে রয়েছে সেগুলি ব্যতীত চতুর প্রতিরক্ষামূলক কৌশলগুলিতে এখানে জোর দেওয়া হবে । সুতরাং এখন আপনার কৌশলগুলির ব্যাগটি গভীরভাবে খননের সময় is

অন্য কথায় এই উদ্দীপনাহীন উদাহরণ ব্যতীত অন্য কিছু চিন্তা করার চেষ্টা করুন :

  • if(5 == x) পরিবর্তে if(x == 5) : অনিচ্ছাকৃত কার্যভার এড়ানোর জন্য

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

- আপনার ভেরিয়েবলগুলি পরিবর্তন করার প্রয়োজন না হওয়া অবধি লক করুন

এটি হ'ল আপনি সমস্ত পরিবর্তনশীল ঘোষণা করতে পারবেন finalযতক্ষণ না আপনি জানেন যে আপনাকে এটি পরিবর্তন করতে হবে, আপনি যে বিন্দুতে মুছে ফেলতে পারবেন final। একটি সাধারণ অজানা তথ্য হ'ল এটি পদ্ধতি প্যারামগুলির জন্যও বৈধ:

public void foo(final int arg) { /* Stuff Here */ }

- যখন খারাপ কিছু ঘটে, তখন প্রমাণের একটি ট্রেইল পেছনে রেখে দিন

আপনার ব্যতিক্রম হলে আপনি করতে পারেন এমন অনেকগুলি বিষয় রয়েছে: স্পষ্টতই এটি লগ করা এবং কিছু পরিষ্কার করা কিছু জিনিস হতে পারে। তবে আপনি প্রমাণের একটি ট্রেইলও ছেড়ে দিতে পারেন (উদাহরণস্বরূপ "লন্ডন ফাইলে ফাইলের অক্ষর" বা 99999 এর মতো সেন্ডেনেলের মানগুলিতে ভেরিয়েবলগুলি সেট করা ডিবাগারে কার্যকর হবে, যদি আপনি কোনও ব্যতিক্রম-অবরুদ্ধের ঘটনাটি কাটিয়ে ওঠেন catch)।

- যখন এটি ধারাবাহিকতায় আসে: শয়তানটি বিশদে থাকে

আপনি যে অন্যান্য লাইব্রেরি ব্যবহার করছেন তার সাথে সামঞ্জস্য হন। উদাহরণস্বরূপ, জাভাতে, আপনি যদি এমন একটি পদ্ধতি তৈরি করে যা মানের একটি ব্যাপ্তি তৈরি করে তবে নীচে আবদ্ধ অন্তর্ভুক্ত এবং উপরের সীমাটি একচেটিয়া করে তোলে । এটি String.substring(start, end)এটি একই পদ্ধতিতে পরিচালিত পদ্ধতিগুলির সাথে সামঞ্জস্য করবে । সূর জেডিকে এই জাতীয় আচরণের জন্য আপনি এই জাতীয় সমস্ত পদ্ধতি খুঁজে পাবেন কারণ এটি অ্যারের সাথে সামঞ্জস্যপূর্ণ উপাদানগুলির পুনরাবৃত্তি সহ বিভিন্ন ক্রিয়াকলাপ তৈরি করে, যেখানে সূচকগুলি জিরো ( অন্তর্ভুক্ত ) থেকে অ্যারের দৈর্ঘ্য ( একচেটিয়া ) পর্যন্ত থাকে।

তাহলে আপনার কয়েকটি প্রিয় রক্ষণাত্মক অনুশীলনগুলি কী কী?

আপডেট: আপনি যদি ইতিমধ্যে না থাকেন তবে নির্দ্বিধায় চিম্বন করুন official আমি সরকারী উত্তরটি বেছে নেওয়ার আগে আরও প্রতিক্রিয়া জানাতে একটি সুযোগ দিচ্ছি।


আমি এখানে আমাদের 30% অজ্ঞদের প্রতিনিধিত্ব করতে চাই যেগুলি সহজ কৌশলগুলি না জানেন । "স্পষ্ট" কৌশলগুলির সাথে কারও লিংক আছে একটি ভিত্তি হিসাবে প্রত্যেকের জানা উচিত?
elliot42


আপনি কেন অফিসিয়াল উত্তর বেছে নেবেন? এটি পুরোপুরি অস্পষ্ট মনে হচ্ছে।
bzlm

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

উত্তর:


103

সি ++ এ, আমি একবারে নতুন সংজ্ঞাটি পছন্দ করি যাতে এটি বেড়া-পোস্টের ত্রুটিগুলি ধরতে কিছু অতিরিক্ত মেমরি সরবরাহ করে।

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

উইকিউকনলজ লিখেছেন হিসাবে :

ডিফেন্সিভ প্রোগ্রামিং এড়ান, পরিবর্তে দ্রুত ব্যর্থ হন।

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


8
ডিফেন্সিভ প্রোগ্রামিং কোনও প্রোগ্রামের অন্যান্য অংশ দ্বারা চালিত অবৈধ শর্তাদি মোকাবিলার চেষ্টা করছে। অনুপযুক্ত ব্যবহারকারীর ইনপুট পরিচালনা করা সম্পূর্ণ আলাদা জিনিস।
জো সোল-ব্রিংগার 29:25

5
ত্রুটিযুক্ত ... নোট করুন যে ডিফেন্সিভ প্রোগ্রামিংয়ের এই সংজ্ঞাটি প্রশ্নের মধ্যে অন্তর্নিহিত সংজ্ঞার কাছাকাছি নয়।
সল

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

6
আমি যুক্তি দিয়ে বলব যে "ব্যর্থ দ্রুত" পদ্ধতিগুলি রক্ষণাত্মক প্রোগ্রামিংয়ের একটি রূপ of
রায়ান দেলুচি

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

75

এসকিউএল

যখন আমাকে ডেটা মুছতে হবে, আমি লিখি

select *    
--delete    
From mytable    
Where ...

আমি যখন এটি চালাব, আমি জানতে পারি যে আমি কোথায় বিধিটি ভুলে গেছি বা খুঁজে পেয়েছি। আমার নিরাপত্তা আছে সবকিছু ঠিকঠাক থাকলে আমি '-' মন্তব্য টোকেনের পরে সমস্ত কিছু হাইলাইট করে তা চালিত করি।

সম্পাদনা করুন: আমি যদি প্রচুর ডেটা মুছে ফেলছি তবে আমি কেবল * এর পরিবর্তে গণনা (*) ব্যবহার করব


আমি এটি আমার আইফোনে লিখেছি, যেখানে আমি পাঠ্যটি নির্বাচন করতে পারি না। যদি কেউ আমার কোডটিকে কোড হিসাবে চিহ্নিত করতে পারে তবে এটি সত্যই প্রশংসিত হবে। ধন্যবাদ।
জন ম্যাকআইন্টির

6
আমি কেবল এটি একটি লেনদেনের মধ্যে
আবদ্ধ

36
শুরু করুন ট্রান্সেকশন | রোলব্যাক লেনদেন
Dalin Seivewright

3
+1 হ্যাঁ, আমি মনে করি এটি কোনও লেনদেনের সাথে প্রতিস্থাপন করা যেতে পারে তবে আমি এটি এইভাবে করার সরলতা পছন্দ করি।
রায়ান দেলুচি

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

48

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

গুরুতর কিছু ভুল হয়ে যাওয়ার পরে এটি ব্যবহার করা যেতে পারে এবং আপনাকে সমাপ্ত করতে হবে।

এই স্মৃতিটিকে আপ-ফ্রন্ট বরাদ্দ করা আপনাকে একটি সুরক্ষা-জাল সরবরাহ করে, কারণ আপনি এটিকে মুক্ত করতে পারেন এবং তারপরে নিম্নলিখিতটি করতে উপলভ্য মেমরিটি ব্যবহার করতে পারেন:

  • সমস্ত অবিরাম ডেটা সংরক্ষণ করুন
  • সমস্ত উপযুক্ত ফাইল বন্ধ করুন
  • একটি লগ ফাইলে ত্রুটি বার্তা লিখুন
  • ব্যবহারকারীর কাছে একটি অর্থবহ ত্রুটি উপস্থাপন করুন

এটাকে আমি একটি বৃষ্টি দিবস তহবিল বলে দেখেছি।
প্লিথ

42

ডিফল্ট কেস নেই এমন প্রতিটি স্যুইচ বিবৃতিতে, আমি একটি কেস যুক্ত করি যা একটি ত্রুটি বার্তা সহ প্রোগ্রামটি বন্ধ করে দেয়।

#define INVALID_SWITCH_VALUE 0

switch (x) {
case 1:
  // ...
  break;
case 2:
  // ...
  break;
case 3:
  // ...
  break;
default:
  assert(INVALID_SWITCH_VALUE);
}

2
অথবা একটি আধুনিক জড়িত ভাষায় একটি নিক্ষেপ।
টম হাটিন -

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

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

2
@ ডায়োমিডিস: আরেকটি কোণ হ'ল দৃ .়তার অসুবিধা রয়েছে যে এর প্রভাবগুলি সংকলন-সময়ে বিশ্বব্যাপী অক্ষম করা যেতে পারে।
বিভ্রান্ত

1
নিক্ষেপ করা ভাল। এবং তারপরে আপনি নিশ্চিত হয়ে নিন যে আপনার পরীক্ষার কাভারেজ পর্যাপ্ত।
ডমিনিক ক্রোনিন

41

আপনি যখন এনামের বিভিন্ন রাজ্য পরিচালনা করছেন (সি #):

enum AccountType
{
    Savings,
    Checking,
    MoneyMarket
}

তারপরে, কিছু রুটিনের ভিতরে ...

switch (accountType)
{
    case AccountType.Checking:
        // do something

    case AccountType.Savings:
        // do something else

    case AccountType.MoneyMarket:
        // do some other thing

    default:
-->     Debug.Fail("Invalid account type.");
}

এক পর্যায়ে আমি এই এনামটিতে আরও একটি অ্যাকাউন্টের प्रकार যুক্ত করব। এবং যখন আমি করব, আমি এই সুইচ স্টেটমেন্টটি ঠিক করতে ভুলে যাব। সুতরাং এই Debug.Failসত্যটির দিকে আমার দৃষ্টি আকর্ষণ করার জন্য ভয়াবহভাবে ক্র্যাশগুলি (ডিবাগ মোডে)। আমি যখন যুক্ত করব তখন case AccountType.MyNewAccountType:ভয়ানক ক্র্যাশ বন্ধ হয়ে যায় ... যতক্ষণ না আমি অন্য অ্যাকাউন্টের ধরণ যোগ করি এবং কেসগুলি এখানে আপডেট করতে ভুলে যাই।

(হ্যাঁ, পলিমারফিজম সম্ভবত এখানে আরও ভাল, তবে এটি আমার মাথার উপরের দিকের একটি উদাহরণ মাত্র))


4
আপনি যদি কেস ব্লকে কিছু এনাম পরিচালনা না করেন তবে বেশিরভাগ সংকলক সতর্কতা জারি করার জন্য যথেষ্ট স্মার্ট। তবে ডিফল্টটিকে ব্যর্থ হিসাবে সেট করা এখনও ভাল ফর্ম - একটি এনাম কেবল একটি সংখ্যা এবং যদি আপনি মেমরির দুর্নীতি পান তবে আপনার একটি অবৈধ মান উপস্থিত হতে পারে।
অ্যাডাম হাওস

সিতে, আমি শেষে একটি অবৈধ অ্যাকাউন্ট অ্যাকাউন্ট টাইপ করতাম। এটি কখনও কখনও দরকারী।
রায় তায়েক

1
@Adam - আপনি কম্পাইল কম্পাইলার একটি সতর্কবার্তা জারি করবে সবকিছু । আপনি যদি নতুন ক্লাস যুক্ত করেন এবং কেবল আংশিক পুনরায় সংকলন করেন, আপনি উপরের মতো কিছু লক্ষ্য করতে পারেন না এবং ডিফল্ট কেসটি আপনাকে সংরক্ষণ করবে। এটি নিঃশব্দে ব্যর্থ হবে না।
এডি

4
বিরতি মন্তব্যগুলিতে বোঝানো হয়েছে, স্ল্যাশেনি। : পি
রায়ান লুন্ডি

2
ডিবাগের পরে প্রোডাকশন কোডের জন্য একটি 'নতুন নটসোপোর্টড এক্সসেপশন ()' হওয়া উচিত।
user7116

35

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

FILE *fp = fopen(filename, "r");
if(fp == NULL) {
    fprintf(stderr, "ERROR: Could not open file %s\n", filename);
    return false;
}

চারপাশের উদ্ধৃতিগুলির এই অভাবটি %sসত্যই খারাপ, কারণ বলুন যে ফাইলের নামটি একটি খালি স্ট্রিং বা কেবল সাদা স্থান বা কিছু। মুদ্রিত বার্তা অবশ্যই হবে:

ERROR: Could not open file

সুতরাং, সবসময় করা আরও ভাল:

fprintf(stderr, "ERROR: Could not open file '%s'\n", filename);

তারপরে কমপক্ষে ব্যবহারকারী এটি দেখতে পান:

ERROR: Could not open file ''

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


4
ভাল, আমি এই সমস্যাটিও দেখেছি
অ্যালেক্স বারানোস্কি

28

এসকিউএল সুরক্ষা

কোনও এসকিউএল লেখার আগে যা ডেটা পরিবর্তন করবে, আমি পুরো জিনিসটি ঘূর্ণিত ব্যাক লেনদেনে মুড়ে রাখি:

BEGIN TRANSACTION
-- LOTS OF SCARY SQL HERE LIKE
-- DELETE FROM ORDER INNER JOIN SUBSCRIBER ON ORDER.SUBSCRIBER_ID = SUBSCRIBER.ID
ROLLBACK TRANSACTION

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

আপনি যখন সম্পূর্ণরূপে করছি নিশ্চিত করুন যে এটি যে আপনি যা প্রত্যাশা পরিবর্তন ROLLBACKকরতে COMMITএবং বাস্তব চালানোর জন্য।


তুমি এই আমাকে ঘুষি মারো! :-)
হাওয়ার্ড পিনসলে 30'09

2
আমি এটি সর্বদা করতাম, তবে এটি ডিবি ক্লাস্টারে এত বেশি অতিরিক্ত ওভারহেডের কারণ হয়ে যায় যে আমাকে থামতে হয়েছিল।
ঝ্যান লিংস

25

সমস্ত ভাষার জন্য:

কমপক্ষে সম্ভব প্রয়োজনীয় ভেরিয়েবলের সুযোগ কমিয়ে দিনএষো ভেরিয়েবলগুলি যা কেবলমাত্র তাদের পরবর্তী বিবৃতিতে বহন করার জন্য সরবরাহ করা হয়। যে ভেরিয়েবলগুলি নেই তা হ'ল ভেরিয়েবলগুলি যা আপনার বোঝার দরকার নেই এবং এর জন্য আপনাকে দায়ী করা যায় না। একই কারণে যখনই সম্ভব ল্যাম্বডাস ব্যবহার করুন।


5
এচিউ অংশটি ঠিক কী বোঝায়? আমি মাঝে মাঝে ভেরিয়েবলগুলি প্রবর্তন করি যা কেবল পরবর্তী লাইন পর্যন্ত বেঁচে থাকে। তারা একটি অভিব্যক্তির নাম হিসাবে পরিবেশন করে যা কোডটি আরও পঠনযোগ্য করে তোলে।
জুল 18

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

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

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

19

সন্দেহ হলে আবেদন বোমা!

প্রতিটি এবং প্রতিটি পদ্ধতির শুরুতে প্রতিটি প্যারামিটার পরীক্ষা করুন (এটি স্পষ্টভাবে নিজের কোডিং করা হোক বা চুক্তি ভিত্তিক প্রোগ্রামিং ব্যবহার করা এখানে গুরুত্বপূর্ণ নয়) এবং কোডের কোনও পূর্বশর্ত যদি সঠিক ব্যতিক্রম এবং / বা অর্থবহ ত্রুটি বার্তা দিয়ে বোমা দেয় is পূরণ না.

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


এবং অবশ্যই: জেনেরিক কোড (একটি ছোট গ্রন্থাগার, সি # তে এক্সটেনশন পদ্ধতিগুলি যাই হোক না কেন) ব্যবহার করুন easy সুতরাং আপনি কিছু param.NotNull("param")পরিবর্তে পরিবর্তে লিখতে পারেনif ( param == null ) throw new ArgumentNullException("param");
peSHIr

2
বা চুক্তি-ভিত্তিক প্রোগ্রামিং ব্যবহার করুন, স্পেক # এর মতো!
বিজেএলএম

এটি কী অ্যাপ্লিকেশন তা নির্ভর করে। আমি আশা করি ফ্লাই বাই ওয়্যার এয়ারক্র্যাফ্টের জন্য লোকেরা লিখিত কোড এবং পেসমাররা পিএসআইআইআর এর মতো ভাবেন না।
মার্কজে

6
@ মারকজে: আপনি সত্যিই তা পান না, তাই না? যদি এটি প্রাথমিকভাবে বোমা দেয় (= বিকাশকারী এবং পরীক্ষার সময়) এটি উত্পাদন হওয়ার সময়ে কখনই বোমা ফেলা উচিত নয়। সুতরাং আমি সত্যিই আশা করি তারা এই জাতীয় প্রোগ্রাম করবে!
পিএসশির

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

18

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

public List<T> getList() {
    return Collections.unmodifiableList(list);
}

আপনার ক্লাস থেকে এমন কোনও কিছু এড়াতে দেবেন না যার দরকার নেই!


+1 সি # তে এর জন্য পঠনযোগ্য সংগ্রহ রয়েছে।
tobsen

1
জাভা জন্য +1। আমি এটি সব সময় ব্যবহার করি
ফোর্টটিয়ার্নার

+1 ... আমি এটি অনেক কিছু করি (যদিও আমি আশা করি আরও লোকেরা এটি মনে রাখবেন)।
রায়ান দেলুচি

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

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

17

পার্ল, সবাই করে

use warnings;

আমি পছন্দ করি

use warnings FATAL => 'all';

এটি কোনও সংকলক / রানটাইম সতর্কতার জন্য কোডটিকে মরে যায়। এটি প্রায়শই অবিচ্ছিন্ন স্ট্রিংগুলি ধরতে কার্যকর।

use warnings FATAL => 'all';
...
my $string = getStringVal(); # something bad happens;  returns 'undef'
print $string . "\n";        # code dies here

আশা করি এটি আরও কিছুটা বিজ্ঞাপন দেওয়া হয়েছিল ...
ডিজেজি

16

সি #:

string myString = null;

if (myString.Equals("someValue")) // NullReferenceException...
{

}

if ("someValue".Equals(myString)) // Just false...
{

}

জাভাতেও একই রকম এবং সম্ভবত বেশিরভাগ ওও ভাষাগুলি।
MiniQuark

এটি অবজেক্টিভ-সিতে দুর্দান্ত, যেখানে শূন্য বার্তাগুলি পাঠানো সম্ভব (একটি নির্দিষ্ট লাইসেন্স সহ "নাল বস্তুর কল পদ্ধতি")) কল করা [নিল ইক্যুয়ালটোস্ট্রিং: @ "মূ"] মিথ্যা প্রত্যাবর্তন করবে।
জোল

আমি সি # উদাহরণের সাথে একমত নই। একটি ভাল সমাধান হ'ল "যদি (মাইস্ট্রিং ==" কিছু ভ্যালু ")" ব্যবহার করা হয় "। এছাড়াও কোনও নাল রেফারেন্স ব্যতিক্রম নয় এবং অবশ্যই আরও পাঠযোগ্য।
ড্যান সি

13
এই উদাহরণটি আপনাকে কেবলমাত্র আপনার প্রোগ্রামে একটি সম্ভাব্য বিপজ্জনক পরিস্থিতি লুকানোর অনুমতি দিচ্ছে। আপনি যদি এটি শূন্য হওয়ার প্রত্যাশা না করে থাকেন তবে আপনি এটি ব্যতিক্রম করতে চান এবং যদি আপনি এটি নਾਲ হওয়ার প্রত্যাশা করে থাকেন তবে আপনার এটি এটিকে পরিচালনা করা উচিত। এটি একটি খারাপ অভ্যাস।
rmeadora

2
সি # তে, আমি সবসময় কেবল স্ট্রিং ব্যবহার করি quএক্কুলস (<স্ট্রিং 1>, <স্ট্রিং 2>)। এগুলির দু'টিই শূন্য হয় কিনা তা বিবেচ্য নয়।
ডারসি ক্যাসেলম্যান

15

সি # স্ট্রিংয়ের চেকিংয়ে। স্ট্রিংয়ের উপর কোনও অপারেশন করার আগে দৈর্ঘ্য, সূচিপত্র, মধ্য ইত্যাদি

public void SomeMethod(string myString)
{
   if(!string.IsNullOrEmpty(myString)) // same as myString != null && myString != string.Empty
   {                                   // Also implies that myString.Length == 0
     //Do something with string
   }
}

[সম্পাদনা]
এখন আমি নেট নেট 4.0.০-তে নিম্নলিখিতগুলিও করতে পারি, এটি অতিরিক্তভাবে মানটি কেবল সাদাটে রাখে কিনা তা পরীক্ষা করে দেখায়

string.IsNullOrWhiteSpace(myString)

7
এটি ডিফেন্সিভ হচ্ছে না, সমস্যাটি উপেক্ষা করছে। হওয়া উচিত if (!string.IsNullOrEmpty(myString)) throw new ArgumentException("<something>", "myString"); /* do something with string */
এনাশনাশ

14

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


এবং - উইন্ডোজ - সি ++ এর জন্যও! (বিশেষ এসএইচ ব্যতিক্রম থ্রো এবং নিম্নলিখিত ক্যাচ সহ সক্ষম করা হয়েছে)।
ব্রায়ান হক

12

VB.NET এর সাথে, পুরো ভিজ্যুয়াল স্টুডিওর জন্য ডিফল্টরূপে অপশনটি স্পষ্ট এবং বিকল্প স্ট্রাইকটি চালু করুন।


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

1
যাইহোক, যে কেউ পুরানো কোডটি ব্যবহার করতে অপশন স্ট্রাইক ব্যবহার করেনি তা রূপান্তর করার জন্য, নোট করুন যে স্ট্রিংয়ে স্বতঃবর্তিত আইটেমগুলির ক্ষেত্রে তারা টসস্ট্রিং () ব্যবহার করছেন না; তারা স্ট্রিং থেকে একটি কাস্ট ব্যবহার করছে're আমার প্রারম্ভিক .NET দিনগুলিতে আমি এগুলিকে টুস্ট্রিং () ব্যবহার করার জন্য পরিবর্তন করতাম এবং এটি জিনিসগুলি বিশেষত এনামগুলির সাথে ভেঙে ফেলা হত।
রায়ান লুন্ডি

10

সি ++

#define SAFE_DELETE(pPtr)   { delete pPtr; pPtr = NULL; }
#define SAFE_DELETE_ARRAY(pPtr) { delete [] pPtr; pPtr = NULL }

তারপরে আপনার সমস্ত ' মোছা পিপিটিআর ' এবং ' মুছুন [] পিপিটিআর ' কলগুলি SAFE_DELETE (পিপিটিআর) এবং SAFE_DELETE_ARRAY (পিপিটিআর) এর সাথে প্রতিস্থাপন করুন

এখন ভুলক্রমে আপনি যদি পয়েন্টারটি মুছার পরে 'পিপিটিআর' ব্যবহার করেন তবে আপনি 'অ্যাক্সেস লঙ্ঘন' ত্রুটি পাবেন। এলোমেলো মেমরির বিপর্যয়ের চেয়ে এটি ঠিক করা আরও সহজ।


1
একটি টেম্পলেট ব্যবহার ভাল। এটি স্কোপড এবং ওভারলোডযোগ্য।

আমি বলতে ঠিক ছিল। ম্যাক্রোর পরিবর্তে একটি টেম্পলেট ব্যবহার করুন। আপনি যদি কোডটি দিয়ে কখনও পদক্ষেপের প্রয়োজন হয় সেভাবে আপনি পারেন।
স্টিভ রোয়ে

আমি শিখেছি যে স্কুলে ফিরে যাওয়ার হার্ড ডিবাগ করা সহজ ছিল। এটি তখন থেকে আমি ভুল করি নি। :)
গ্রেগ ডি

3
বা স্মার্ট পয়েন্টার ব্যবহার করুন ... বা হ্যাক, নতুন যাই হোক না কেন / এড়াতে যতটা সম্ভব আপনি মুছুন।
আরাফ্যাজিওন

1
@ আরাফ্যাঙ্গিয়ন: শুধু এড়িয়ে চলুন delete। ব্যবহার newঠিক আছে, যতক্ষণ না নতুন অবজেক্টটি স্মার্ট পয়েন্টারের মালিকানা লাভ করে।
আলেকজান্দ্রি সি

10

জাভা সহ, আপনি যদি চাপ বন্ধ করে দিয়ে প্রোডাকশন কোডটি চালান এমনকি এড্রেস কীওয়ার্ডটি ব্যবহার করা সহজ হতে পারে:

private Object someHelperFunction(Object param)
{
    assert param != null : "Param must be set by the client";

    return blahBlah(param);
}

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


। নেট, ডিবাগ.আস্রেটার একই কাজ করে। আপনি যখন মনে করেন এমন কোনও জায়গা রয়েছে যেখানে "এই রেফারেন্সটি এখানে বাতিল করা যায় না, তাই না?", আপনি একটি ডিবাগ রাখতে পারেন sএখানে সন্নিবেশ করান, যাতে এটি বাতিল হয়ে যেতে পারে, তবে আপনি বাগটি ঠিক করতে পারেন বা আপনার অনুমানগুলি পরিবর্তন করতে পারেন।
রায়ান লন্ডি

1
+1, সার্বজনীন পদ্ধতিতে চুক্তি ব্যর্থতার উপর চাপ দেওয়া উচিত, বেসরকারীদের দাবি করা উচিত
user7116

9

আমি খুঁজে পাইনি readonlyযে পর্যন্ত না আমি ReSharper পাওয়া শব্দ, কিন্তু আমি এখন বিশেষত সার্ভিস শ্রেণীর জন্য প্রবৃত্তিগতভাবে এটি ব্যবহার।

readonly var prodSVC = new ProductService();

আমি যা করতে পারি তার সমস্ত ক্ষেত্রে জাওয়ার সমতুল্য 'চূড়ান্ত' কীওয়ার্ডটি ব্যবহার করি। এটি ক্ষেত্রটি সেট না করা / বিভ্রান্তিকর সুইচগুলি লেখার মতো যা আপনাকে একাধিকবার ক্ষেত্র সেট করতে পারে সেভাবে হাড়ের মাথায় চালানো থেকে আপনি সত্যিই বাঁচান। আমি স্থানীয় বৈকল্পিক / পরামিতিগুলি চিহ্নিত করার সম্ভাবনা কম তবে আমার ধারণা এটি ক্ষতি করতে পারে না।
আউটলা প্রোগ্রামার 4

সি # আপনাকে স্থানীয় ভেরিয়েবলগুলি কেবলমাত্র
পঠন

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

সি # তে একটি পঠনযোগ্য কাঠামো এটিকে কখনও পরিবর্তিত হতে বাধা দিত।
স্যামুয়েল

9

জাভাতে, যখন কিছু হচ্ছে এবং আমি কেন জানি না, আমি মাঝে মাঝে লোগ 4 জে এর মতো ব্যবহার করব:

if (some bad condition) {
    log.error("a bad thing happened", new Exception("Let's see how we got here"));
}

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


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

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

2
আপনি নতুন ব্যতিক্রম ("বার্তা" )ও ব্যবহার করতে পারেন print মুদ্রণস্ট্যাকট্রেস (); কোনও নিক্ষেপ বা ধরার প্রয়োজন নেই, তবে আপনি লগ এ এখনও একটি চমৎকার স্ট্যাকট্র্যাস পাবেন। স্পষ্টতই, এটি উত্পাদন কোডে থাকা উচিত নয়, তবে এটি ডিবাগিংয়ের জন্য খুব কার্যকর হতে পারে।
উয়র্ন

9

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

উদাহরণ:

class Foo
{
   virtual void DoSomething();
}

class Bar: public Foo
{
   void DoSomething() override { /* do something */ }
}

জাভা-র জন্য এটি ক্লাস ফু-অকার্যকর ডোসোমিংথিং () {}} ক্লাস বার {@ ওভাররাইড শূন্য ডোসোমেটিং () {} a যদি এটি টীকাটি হারিয়ে না যায় তবে একটি সতর্কতা দেবে (সুতরাং আপনি যে পদ্ধতিটি করেননি সে নিঃশব্দে ওভাররাইড করতে পারবেন না) এর অর্থ) এবং যখন টীকাগুলি থাকে তবে এটি কোনও কিছুর উপর নির্ভর করে না।
উয়র্ন

ভাল ... আমি এই সম্পর্কে জানতাম না ... এটি মাইক্রোসফ্ট নির্দিষ্ট বলে মনে হয় খুব খারাপ ... তবে কিছু ভাল #
ডিফাইনগুলি

8

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

এটি কয়েকটি রেস শর্ত এবং সিউডো-ডেডলক শর্তগুলি বিচ্ছিন্ন করতে সহায়তা করেছে যা আমি এটি করা শুরু করার আগে রহস্যময় ছিল।


1
এই জাতীয় টাইমআউটগুলির সাথে অপেক্ষা করা অপেক্ষা অন্যান্য, আরও খারাপ, সমস্যার লক্ষণ।
ডিক্রোকস

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

8

সি শার্প

  • সর্বজনীন পদ্ধতিতে রেফারেন্স ধরণের পরামিতিগুলির জন্য নন-নাল মানগুলি যাচাই করুন।
  • আমি sealedক্লাসগুলির জন্য নির্ভর করে না যেখানে নির্ভরতাগুলি এড়াতে এড়াতে আমি প্রচুর ব্যবহার করি। উত্তরাধিকার মঞ্জুর করার বিষয়টি দুর্ঘটনাক্রমে নয়, স্পষ্টভাবে করা উচিত।

8

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

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


1
ত্রুটি বার্তার জন্য কোড লেখার সময়, বার্তাটি পড়ুন এবং আপনি পরবর্তীটি কী জানতে চান তা জিজ্ঞাসা করুন, তারপরে এটি যুক্ত করুন। অযৌক্তিক হওয়া পর্যন্ত পুনরাবৃত্তি করুন। উদাহরণস্বরূপ: "সীমার বাইরে।" সীমার বাইরে কি? "ফুফ কাউন্ট অফ রেঞ্জ" " মান কী ছিল? "ফু গণনা (42) সীমার বাইরে" " পরিসীমা কত? "ফু গণনা (42) সীমার বাইরে (549 থেকে 666)" "
HABO

7

সি # তে, asকাস্ট করতে কীওয়ার্ডটি ব্যবহার করুন ।

string a = (string)obj

যদি আপত্তিটি স্ট্রিং না হয় তবে একটি ব্যতিক্রম ছুঁড়ে ফেলবে

string a = obj as string

আপত্তি একটি স্ট্রিং না হলে একটি নাল ছেড়ে দেবে leave

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

আমার নিজস্ব কোডে, আমি দেখতে পাই যে আমি asপ্রায় 75% সময়ের (cast)বাক্য গঠন এবং প্রায় 25% বাক্য গঠন ব্যবহার করি ।


সঠিক, তবে এখন আপনাকে রেফারেন্সটি ব্যবহার করার আগে নালটি পরীক্ষা করতে হবে।
ব্রায়ান রাসমুসেন

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

হ্যাঁ. এটি কেবল তখনই কার্যকর যখন আপনি যদি সঠিক ধরণের না হন তবে আপনি যদি নালার চান। কিছু ক্ষেত্রে কার্যকর: সিলভারলাইটে যেখানে নিয়ন্ত্রণ যুক্তি এবং নকশাকে প্রায়শই পৃথক করা হয়, যুক্তিটি যদি বোতাম হয় তবেই নিয়ন্ত্রণ "আপ" ব্যবহার করতে চায়। যদি তা না হয় তবে এটি (n নাল) অস্তিত্বহীন।
Sander

2
এটি দুর্গে বড় বলরুম উইন্ডোয়ের মতো রক্ষণাত্মক বলে মনে হয়। তবে এটি একটি সুন্দর দৃশ্য!
পন্টাস গ্যাগ

1
এটি আমাকে এমন কারও মনে করিয়ে দেয় যিনি ব্যতিক্রমগুলি ব্যবহার করেন নি কারণ 'তারা প্রোগ্রামগুলি ভেঙে দিয়েছে'। আপনি যদি কোনও প্রত্যাশিত শ্রেণি না করেন যখন আপনি নির্দিষ্ট আচরণ চান তবে আমার মনে হয় আমি এটি অন্যভাবে কোড করব। is/instanceofমনে বসন্ত
কির্চস্টেইন

6

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

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

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


6

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

ইন শীর্ষ 25 সর্বাধিক বিপজ্জনক প্রোগ্রামিং ত্রুটি "অপ্রকৃত ইনপুট ভ্যালিডেশন" বিভাগে "এর মাঝে উপাদান অসুরক্ষিত মিথস্ক্রিয়া" সবচেয়ে বিপজ্জনক ভুল।

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

অর্ডার বাস্তবায়নের লক্ষ্যে invariants , আমি কোন ক্লাসে একটি পদ্ধতি লিখুন চেক "শ্রেণী দৃঢ়তা", যে পূর্বশর্ত এবং postcondition ম্যাক্রো দ্বারা authomatically বলা উচিত।

আমি কোড চুক্তি গ্রন্থাগারটি মূল্যায়ন করছি ।


6

জাভা

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

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

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

কখনও ক্লোন ব্যবহার করবেন না, একটি অনুলিপি নির্মাণকারী ব্যবহার করুন

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


5

আমি পিএইচপিকে echoখুব বেশি বার লিখতে ভুলে গেছি :

<td><?php $foo->bar->baz(); ?></td>
<!-- should have been -->
<td><?php echo $foo->bar->baz(); ?></td>

আমাকে চিরকালের জন্য চেষ্টা করতে হবে এবং বের করতে হবে - কেন বাজ () কেন কিছুই ফিরিয়ে দিচ্ছে না যখন বাস্তবে আমি কেবল এটি প্রতিধ্বনি করছিলাম না! : -S তাই আমি একটি EchoMeশ্রেণী তৈরি করেছি যা প্রতিধ্বনিত হওয়া উচিত এমন কোনও মানকে ঘিরে রাখা যেতে পারে:

<?php
class EchoMe {
  private $str;
  private $printed = false;
  function __construct($value) {
    $this->str = strval($value);
  }
  function __toString() {
    $this->printed = true;
    return $this->str;
  }
  function __destruct() {
    if($this->printed !== true)
      throw new Exception("String '$this->str' was never printed");
  }
}

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

function baz() {
  $value = [...calculations...]
  if(DEBUG)
    return EchoMe($value);
  return $value;
}

সেই কৌশলটি ব্যবহার করে, অনুপস্থিত প্রথম উদাহরণটি echoএখন একটি ব্যতিক্রম নষ্ট করবে ...


ডেস্ট্রাক্টর কি $ এটি-> মুদ্রিত! == সত্যের জন্য পরীক্ষা করা উচিত নয়?
কার্স্টেন

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

আমি কি কিছু মিস করছি? তবে আমার কাছে মনে হচ্ছে এটি কোডিংয়ের জন্য ক্ষতিপূরণ দেওয়ার চেষ্টা করছে: AnObject.ToStringপরিবর্তে Writeln(AnObject.ToString)?
বিভ্রান্ত

হ্যাঁ, তবে পিএইচপি করতে ভুলটি আরও সহজ
খুব বেশি পিএইচপি

4

সি ++

আমি যখন নতুন টাইপ করি তখন অবশ্যই আমাকে মুছে ফেলতে হবে। বিশেষত অ্যারেগুলির জন্য।

সি শার্প

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


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

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

4

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

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

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