আমার কোডে গভীর ইনডেন্টেশন রোধ করতে আমি কী পদক্ষেপ এবং ব্যবস্থা নিতে পারি?
আমার কোডে গভীর ইনডেন্টেশন রোধ করতে আমি কী পদক্ষেপ এবং ব্যবস্থা নিতে পারি?
উত্তর:
আপনার প্রোগ্রামের প্রতিটি ফাংশন / পদ্ধতি যদি একটি এবং কেবল একটি কাজ করে তবে ডিপ ইন্ডেন্টেশন সাধারণত কোনও সমস্যা হয় না। মাঝে মাঝে কন্ডিশনালগুলি কয়েক স্তরের গভীর করে নেওয়া প্রয়োজন হতে পারে তবে আমি সত্যই বলতে পারি যে আমি 12+ বছরের কোডিংয়ের জন্য কেবল গভীরভাবে ইন্টেন্টেড কোড লিখেছি hand
উত্তম পদ্ধতিগুলি আপনি যা করতে পারেন তা হ'ল:
int Step1(int state)
{
if (state == 100)
{
return Step2(state);
}
else
{
return Step3(state);
}
}
int Step2(int state)
{
if (state != 100)
{
throw new InvalidStateException(2, state);
}
// ....
}
if
শর্তগুলির জন্যও কাজ করে । চূড়ান্তভাবে নেওয়া, আপনি এক্সিকিউটেবল সিউডোকোড দিয়ে শেষ করবেন।
else
ব্লকগুলি ফেলে দেওয়া ।
আপনি গার্ড ক্লজ বিবেচনা করতে পারে ?
পরিবর্তে
public void DoSomething(int value){
if (someCondition){
if(someOtherCondition){
if(yetAnotherCondition){
//Finally execute some code
}
}
}
}
ডু
public void DoSomething(int value){
if(!(someCondition && someOtherCondition && yetAnotherCondition)){
return;
//Maybe throw exception if all preconditions must be true
}
//All preconditions are safe execute code
}
আপনি যদি কোনও সুযোগ পান তবে আমি স্টিভ ম্যাককনেলের কোড কমপ্লিট পড়ার পরামর্শ দিয়েছি। এই বিষয়গুলিতে তিনি প্রচুর পরামর্শ দিয়েছেন।
http://www.amazon.com/Code-Complete-Practical-Handbook-Construction/dp/0735619670/ref=pd_sim_b_6
"গার্ড ক্লজ" সম্পর্কে আরও জানতে দেখুন: https://sourcemaking.com/refactoring/replace-nested-conditional-with-guard-clauses
আপনার if
এস।
পরিবর্তে:
if (foo != null)
{
something;
something;
if (x)
{
something;
}
something;
}
else
{
boohoo;
}
আমি লিখব:
if (foo == null)
{
boohoo;
return;
}
something;
something;
if (x)
{
something;
}
something;
ব্লকগুলি if
- একই ক্ষেত্রে প্রযোজ্য else
। যদি else
খাটো / কম বাসা বেধে থাকে তবে সেগুলি আবার ফিরিয়ে দিন।
প্যারামিটারের মানগুলি এক জায়গায় পরীক্ষা করুন
আপনার পদ্ধতিটি প্রবেশ করার সাথে সাথে অবৈধ মানগুলির জন্য সমস্ত পরামিতি পরীক্ষা করে দেখুন, তারপরে আপনি নিরাপদ তা জেনে এগিয়ে যান। এটি আরও পঠনযোগ্য কোডের জন্য তৈরি করে তবে এটি পরে শর্তসাপূর্ণ ব্লকগুলি পাইল করা এবং এই চেকগুলি সমস্ত সাব্রোটিন জুড়ে ছড়িয়ে দেয়।
If
কোডের শুরুতে যা কিছু শর্ত পূরণ না হওয়ার কারণে মৃত্যুদন্ড কার্যকর করা বন্ধ করে দেয় সেগুলিকে সুরক্ষা রক্ষা ধারা হিসাবেও পরিচিত , যেমন @ জেসনটুরান উল্লেখ করেছিলেন। এবং এটি একটি পৃথক নাম রাখার হিসাবে কাছাকাছি বলে মনে হচ্ছে।
সাধারণত, আমি দেখেছি যে গভীরভাবে ইনডেন্টড কোডটি সাধারণত সমস্যাযুক্ত কোড। যদি আপনি এই সমস্যার মুখোমুখি হন, তবে পিছনে ফিরে যান এবং আপনার ফাংশনটি খুব বেশি কিছু করছে কিনা তা মূল্যায়ন করুন।
একই সাথে, আপনার প্রশ্নের উত্তর দেওয়ার জন্য, যদি গভীর গভীরতার প্রয়োজন হয় তবে আমি আপনাকে পরামর্শ দিই যে আপনি এটি সেখানে রেখে দিন। সরল কারণে যে এই জাতীয় কোডে, ইন্ডেন্টেশনটি সহায়তা করবে যেহেতু এটি কোডের একটি দীর্ঘ অংশ হতে পারে।
নেস্টেড উপাদানগুলি (বিশেষত পুনরাবৃত্তি হওয়া) পৃথক ফাংশনে বিভক্ত করুন (এটি যদি আপনার ভাষা বন্ধের পক্ষে সমর্থন করে তবে এটি সহজ) বা পুনরাবৃত্তির সাহায্যে নেস্টেড লুপগুলির একটি সিরিজ প্রতিস্থাপন করুন।
এছাড়াও, চারটির পরিবর্তে দুটি স্পেস ইনডেন্ট করুন।
আমি মুছে ফেলার মতো শ্রেণীবদ্ধ সমস্যা হিসাবে গভীর সূচকগুলি দেখতে পাচ্ছি না (বা রিফ্যাক্টরিংকে সব কিছুর সত্য উত্তর হিসাবে দেখছি না)।
সাধারণত নেস্টেড আইএফ এর পরিবর্তে, আমি যৌক্তিক বিবৃতি লিখতে চাই:
if (foo && bar && baz)
বরং
if foo
if bar
if baz
আমি নিজে এটি বিশ্বাস করি না, তবে কোড কমপ্লিট অনুসারে এটি ব্যবহারের উপযুক্ত স্থান break
(যদি আপনার দলটি বোর্ডে থাকে)। আমি কল্পনা করেছিলাম এটি সি ++ প্রোগ্রামারদের কাছে আরও গ্রহণযোগ্য, যদিও এটি বিবরণীতে ডেলফি প্রোগ্রামারদের তুলনায় break
ব্যবহার করা হয় switch
যেখানে break
কেবল যখন আপনি while
লুপ লেখার মতো মনে করেন না তখনই ব্যবহৃত হয় ।
প্রকৃতপক্ষে প্রকৃতপক্ষে লড়াই করার চিন্তাভাবনা। আমি যা শিখেছি তা হ'ল পদ্ধতিটি প্রথমে টুকরো টুকরো করে বিভক্ত করা, তারপরে একটি টুকরা ব্যর্থ হলে নিম্নলিখিত প্রতিটি টুকরোটি এড়িয়ে যাওয়ার জন্য একটি অদ্ভুত কৌশল ব্যবহার করুন। এখানে একটি উদাহরণ:
পরিবর্তে :
{if (networkCardIsOn() == true)
{if (PingToServer() == true)
{if (AccesLogin(login,pass) == true)
{if (nextCondition == true)
...
}
}
}
আমি বর্তমানে লিখছি:
{vbContinue = true;
if (vbContinue) {
vbContinue = networkCardIsOn();
if (vbContinue == false) {
code to Handle This Error();
}
}
if (vbContinue) {
vbContinue = PingToServer();
if (vbContinue == false) {
code to HandleThisError2();
}
}
if (vbContinue) {
vbContinue = AccesLogin(login,pass);
if (vbContinue == false) {
HandleThisErrorToo();
}
}
...
এটি প্রথমে আমার কাছে অদ্ভুত বলে মনে হয়েছে, তবে যেহেতু আমি এটি ব্যবহার করি, রক্ষণাবেক্ষণ ব্যয়টি অর্ধেক ভাগ হয়ে গেছে এবং আমার মস্তিষ্ক দিনের শেষে শীতল হয়ে যায়।
আসলে, এই "কৌশল" দ্বারা প্রবর্তিত লাভটি কোডটি কম ঘন হওয়ার কারণে কোড জটিলতাটি সত্যই বিভক্ত।
কোডটি পড়ার সময় আপনাকে অতীতের পরিস্থিতি সম্পর্কে কিছু মনে রাখতে হবে না: কোডটিতে যদি আপনার সেই বিন্দুতে X থাকে তবে পূর্বের পদক্ষেপগুলি পাস হয়ে গেছে এবং সফল হয়েছে।
আর একটি লাভ হ'ল "যদি অন্যথায়" নেস্ট করা সমস্ত "escape