কোডটির জন্য সুরক্ষামূলক প্রোগ্রামিং অনুশীলনগুলি অনুসরণ করা কতটা প্রয়োজনীয় যেগুলি কখনই প্রকাশ্যে উপলব্ধ করা হবে না?


45

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

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

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


4
= ~ s / প্রয়োজনীয় / প্রস্তাবিত / জিআই
গ্র্যান্ডমাস্টারবি

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

1
কখনও না বল না. আপনার কোডটি কখনই ব্যবহার না করা অবধি আপনার কোডটি কোথায় শেষ হবে তা আপনি কখনই জানতে পারবেন না। ;)
ইজকাটা

1
@ কোডব্রেকার গ্র্যান্ডমাস্টার বি এর মন্তব্য এটি একটি প্রতিস্থাপনের অভিব্যক্তি। এর অর্থ: "প্রস্তাবিত" দিয়ে "প্রয়োজনীয়" প্রতিস্থাপন করুন।
রিকার্ডো সুজা

1
কোডলেস কোড # 116 বিশ্বাস কেউই এখানে বিশেষত উপযুক্ত নয়।

উত্তর:


72

আমি ডিজাইনের সমস্যাটি সমাধান করতে যাচ্ছি না - একটি অ-সর্বজনীন এপিআইতে জিনিসগুলি "সঠিকভাবে" করা উচিত কিনা তা কেবল প্রশ্ন।

এটি কেবল আমার জন্য, সুতরাং এটির মতো এটি আমি নিজের কোডটি নিজের থেকে সুরক্ষিত করি

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

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


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

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

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

25

আমি সাধারণত কিছু সাধারণ নিয়ম অনুসরণ করি:

  • সর্বদা চুক্তি দ্বারা প্রোগ্রাম করার চেষ্টা করুন ।
  • যদি কোনও পদ্ধতি সর্বজনীনভাবে উপলভ্য থাকে বা বাইরের বিশ্ব থেকে ইনপুট গ্রহণ করে তবে কিছু প্রতিরক্ষামূলক ব্যবস্থা প্রয়োগ করুন (উদাঃ IllegalArgumentException)।
  • কেবলমাত্র অভ্যন্তরীণভাবে অ্যাক্সেসযোগ্য অন্য সমস্ত কিছুর জন্য দৃser়তা (যেমন assert input != null) ব্যবহার করুন ।

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

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


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

@ ইউজার949300 অবশ্যই আমি বিশ্বাস করতে চাই যে এই জাতীয় ব্যতিক্রমগুলি একটি অর্থবহ উদ্দেশ্য সহ প্রবর্তিত হয়েছিল। চুক্তি সম্মান করা এই জাতীয় ভূমিকার সাথে খাপ খায়।
আফসান্টোস

16

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


আরও কিছুটা বাস্তবিকভাবে কথা বলছি ...

মনে হচ্ছে আপনি খুব দূরে জিনিস নেওয়ার প্রান্তে এসেছেন। চ্যালেঞ্জটি (এবং আপনার প্রশ্নের উত্তর) প্রোগ্রামটির ব্যবসায়ের বিধি বা প্রয়োজনীয়তাগুলি বোঝার মধ্যে রয়েছে।

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

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


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

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


2
"কোড লেখার পথে এটি শুরু হওয়া অবধি" +1 এর জন্য। বিশেষত স্বল্প-পরিচালিত ব্যক্তিগত প্রকল্পগুলির জন্য, ডিফেন্সিয়ালি কোডিং এর পক্ষে তার চেয়ে অনেক বেশি সময় নিতে পারে।
কোরি

2
সম্মত হন, যদিও আমি যুক্ত করতে চাই যে ডিফেন্সিভভাবে প্রোগ্রাম করা / সক্ষম / করা ভাল জিনিস তবে এটি প্রোটোটাইপিং ফ্যাশনে প্রোগ্রাম করতে সক্ষম হওয়াও অত্যন্ত গুরুত্বপূর্ণ ial উভয় করার ক্ষমতা আপনাকে সবচেয়ে উপযুক্ত ক্রিয়া বাছাই করতে সক্ষম করবে যা আমি জানি যে অনেক প্রোগ্রামার আমি জানি যারা কেবলমাত্র ডিফেন্সিয়ালি প্রোগ্রাম (সাজানোর) পক্ষে সক্ষম।
ডেভিড মুলদার 5'13

13

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

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

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


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

3
@ কোডব্রেকার এমন একটি জিনিস যা এই ক্ষেত্রে সাহায্য করতে পারে তা হ'ল কার্ডটি অন্য কোনও বস্তুতে এনপ্যাপুলেট করছে। একটি টেকস অফ স্পেডস যা তা। অবস্থানটি তার পরিচয় সংজ্ঞায়িত করে না এবং একটি কার্ড সম্ভবত অপরিবর্তনীয়। হতে পারে একটি জোন কার্ড রয়েছে: CardDescriptorএটিতে একটি কার্ড থাকতে পারে , এর অবস্থান, মুখের উপরে / ডাউন স্থিতি, বা এমন গেমগুলির জন্য ঘোরানোও যা যত্নশীল। এগুলি হ'ল সমস্ত পরিবর্তনীয় বৈশিষ্ট্য যা কোনও কার্ডের পরিচয়কে পরিবর্তন করে না।

1

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

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

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


2
আপনার উত্তরটি সাধারণভাবে ডিফেন্সিভ প্রোগ্রামিংয়ের বিষয়ে ওপি যে বিস্তৃত প্রশ্ন জিজ্ঞাসা করছে তার পরিবর্তে সমস্যাটির দিকে কিছুটা আলোকপাত করে।

সংগ্রহগুলি গ্রহণের পদ্ধতিগুলিতে আমি প্রকৃতপক্ষে জোনগুলি পাস করি, সুতরাং বাস্তবায়নটি প্রয়োজনীয়। গেমের মধ্যে জোনের এক ধরণের রেজিস্ট্রি করা একটি আকর্ষণীয় ধারণা।
কোডব্রেকার

@ গ্লেনএইচ 7: আমি সুনির্দিষ্ট উদাহরণগুলির সাথে কাজ করা প্রায়শই বিমূর্ত তত্ত্বের চেয়ে বেশি সহায়তা করি find ওপি একটি বরং আকর্ষণীয় সরবরাহ করেছে, তাই আমি এটি নিয়ে গেলাম।
রাল্ফচাপিন

1

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

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

আপনি এটি "অঞ্চল" দিয়ে ডিজাইন করেছেন এটি একটি স্বেচ্ছাসেবী পছন্দ। বাস্তবায়নের উপর নির্ভর করে (একটি জোন কেবলমাত্র একটি হাত, একটি ডেক বা উপরের উদাহরণে একটি টেবিল হতে পারে) এটি খুব ভাল একটি ডিজাইন হতে পারে।

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

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

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