আমরা যদি পারি তবে স্থানীয় ভেরিয়েবলগুলি বাদ দিতে হবে?


95

উদাহরণস্বরূপ, অ্যান্ড্রয়েডে সিপিইউ চালিয়ে যেতে, আমি এই জাতীয় কোড ব্যবহার করতে পারি:

PowerManager powerManager = (PowerManager)getSystemService(POWER_SERVICE);
WakeLock wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "abc");
wakeLock.acquire();

তবে আমি মনে করি স্থানীয় পরিবর্তনগুলি powerManagerএবং wakeLockএটিকে নির্মূল করা যেতে পারে:

((PowerManager)getSystemService(POWER_SERVICE))
    .newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "MyWakelockTag")
    .acquire();

অনুরূপ দৃশ্য আইওএস সতর্কতা দর্শনে উপস্থিত হয়, যেমন: থেকে

UIAlertView *alert = [[UIAlertView alloc]
    initWithTitle:@"my title"
    message:@"my message"
    delegate:nil
    cancelButtonTitle:@"ok"
    otherButtonTitles:nil];
[alert show];

-(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{
    [alertView release];
}

প্রতি:

[[[UIAlertView alloc]
    initWithTitle:@"my title"
    message:@"my message"
    delegate:nil
    cancelButtonTitle:@"ok"
    otherButtonTitles:nil] show];

-(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{
    [alertView release];
}

লোকাল ভেরিয়েবলটি যদি সুযোগের মধ্যে একবার ব্যবহার করা হয় তবে তা দূর করা কি ভাল অনুশীলন?


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

75
এটি কোড ডাব্লু / একটি ডিবাগারকে আরও কঠিন করে তোলে। এবং আপনাকে এও নিশ্চিত হতে হবে (ভাষার উপর নির্ভর করে) প্রথম এক্সপ্রেশনটি কোনও নাল বা ত্রুটি নয়।
গ্র্যান্ডমাস্টারবি

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

48
চেষ্টা কর. এখন ডিবাগারটি প্লাগ করুন এবং পাওয়ার ম্যানেজার বা ওয়েকলক উভয়েরই অবস্থা দেখার চেষ্টা করুন। নিজের ভুল অনুধাবন করুন। আমার নিজের বেশিরভাগ সময় কোড অনুসন্ধানের জন্য ব্যয় না করা পর্যন্ত আমি একই ("এই সমস্ত স্থানীয়দের সাথে কী?") ভাবতাম।
ফেরিনডেল

42
এমনকি আপনার উদাহরণেও আপনার "মুছে ফেলা" সংস্করণটিতে একটি স্ক্রোল বার রয়েছে এবং এটি আমার স্ক্রিনে পুরোপুরি ফিট করে না, যা এটি পড়তে অনেক কঠিন করে তোলে।
এরিক

উত্তর:


235

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

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

1 আপনার যদি ঘোষণাপত্র এবং স্থানীয় ভেরিয়েবলের ব্যবহারের মধ্যে প্রচুর ইন্টারভিং কোড থাকে তবে এটি স্ট্যাকের মধ্যে যেতে পারে তবে এটি একটি সামান্য বিবরণ।


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

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

15
@ ওয়ালফ্র্যাট লোকাল ভেরিয়েবল একাধিকবার ইনিশিয়াল করা হচ্ছে? সেকি। কেউ স্থানীয়দের পুনঃব্যবহার করার পরামর্শ
দেয়নি

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

4
প্রশ্ন: আমরা যদি পারি তবে স্থানীয় ভেরিয়েবলগুলি বাদ দিতে হবে? উত্তর: না
সিমোন

93

কিছু উচ্চ উত্সাহিত মন্তব্য এটি জানিয়েছে, তবে আমি যে উত্তর দেখেছি তার কোনওটিই করেনি, তাই আমি এটিকে উত্তর হিসাবে যুক্ত করব। এই সমস্যাটি সিদ্ধান্ত নেওয়ার ক্ষেত্রে আপনার মূল কারণটি হ'ল:

Debuggability

প্রায়শই, বিকাশকারীরা কোড লেখার চেয়ে বেশি সময় এবং প্রচেষ্টা ডিবাগ করতে ব্যয় করে।

সঙ্গে স্থানীয় ভেরিয়েবল, আপনি পারবেন:

  • লাইনটি যেখানে নির্ধারিত হয়েছে তার ব্রেকপয়েন্ট (অন্যান্য সমস্ত ব্রেকপয়েন্ট সজ্জা সহ, যেমন শর্তাধীন ব্রেকপয়েন্টিং ইত্যাদি ...)

  • স্থানীয় ভেরিয়েবলের মান / পরিদর্শন / মুদ্রণ / পরিবর্তন-এর মানটি পরীক্ষা করুন

  • ক্যাশগুলির কারণে উত্থাপিত সমস্যাগুলি ধরা।

  • সুস্পষ্ট স্ট্যাকের ট্রেস রাখুন (এক্সওয়াইজেড লাইনের 10 এর পরিবর্তে একটি অপারেশন রয়েছে)

স্থানীয় ভেরিয়েবলগুলি ব্যতীত উপরের সমস্ত কাজগুলি আপনার ডিবাগের উপর নির্ভর করে অনেক বেশি শক্ত, অত্যন্ত কঠোর বা নিখুঁত অসম্ভব।

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


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

3
কোডের মাধ্যমে পদক্ষেপ নেওয়া আরও শক্ত। যদি কল () -> কল () -> কল () -> কল () থাকে তবে তৃতীয় পদ্ধতি কলটিতে প্রবেশ করা কঠোর পরিশ্রম। চারটি স্থানীয় ভেরিয়েবলগুলি থাকলে আরও সহজ
gnasher729

3
@ ফ্র্যাঙ্কপুফার - আমাদের বাস্তব বিশ্বের সাথে ডিল করতে হবে। যেখানে ডিবাগাররা আপনার প্রস্তাব মতো তা করে না।
ডিভি কে

2
@ ডিভিকে: আসলে আমি যে ভাবি তার চেয়ে আরও বেশি ডিবাগার রয়েছে যে আপনাকে কোনও অভিব্যক্তি পরিদর্শন করতে বা দেখতে দেয়। এমএস ভিজ্যুয়াল স্টুডিওতে (সংস্করণ ২০১৩ সাল থেকে) সি ++ এবং সি # এর জন্য এই বৈশিষ্ট্যটি রয়েছে। গ্রহের কাছে এটি জাভার জন্য রয়েছে। অন্য মন্তব্যে, ফেরিন্ডেল জেএসের জন্য আইই ১১-র উল্লেখ করেছেন।
ফ্র্যাঙ্ক পাফার

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

47

কোডটি বুঝতে সহজতর হলে কেবল এটি। আপনার উদাহরণগুলিতে, আমি মনে করি এটি পড়া আরও কঠিন করে তোলে।

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


1
ভেরিয়েবল ব্যবহারের মতো স্টাইলিংয়ের সাথে এর অনেক কিছুই আছে। প্রশ্নটি এখন সম্পাদিত হয়েছে।
Jodrell

29

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

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

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


আমি মনে করি স্টাইলিংয়ের সাথে এর সাথে অনেক কিছুই আছে এবং হোয়াইটস্পেসকে যে কোনও কিছু হিসাবে ব্যবহার করা। প্রশ্ন সম্পাদনা করা হয়েছে।
Jodrell

15

হতে পারে.

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

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

আমার দৃষ্টিতে এটি আরও ভাল আপস:

PowerManager powerManager = (PowerManager)getSystemService(POWER_SERVICE);
powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "abc").acquire();

সুতরাং একটি স্থানীয় পরিবর্তনশীল রাখা এবং অন্য এক ditching। সি # তে আমি প্রথম লাইনে ভেরিওয়ার্ডটি ব্যবহার করব যেহেতু টাইপকাস্ট ইতিমধ্যে টাইপ তথ্য সরবরাহ করে।


13

আমি স্থানীয় ভেরিয়েবলের পক্ষে থাকা উত্তরের বৈধতা স্বীকার করলেও, আমি শয়তানের উকিল খেলতে যাচ্ছি এবং একটি বিপরীত দৃষ্টিভঙ্গি উপস্থাপন করতে যাচ্ছি।

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

আপনার ক্ষেত্রে, প্রধান সমস্যা হ'ল ইন্ডেন্টেশন এবং ভেরিয়েবলের অনুপস্থিতি। আপনি কোডটি নিম্নরূপ (এবং হওয়া উচিত) ফর্ম্যাট করতে পারেন:

((PowerManager)getSystemService(POWER_SERVICE))
        .newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,"MyWakelockTag")
        .acquire();

স্থানীয় ভেরিয়েবলের সাথে সংস্করণটির সাথে এর তুলনা করুন:

PowerManager powerManager=(PowerManager)getSystemService(POWER_SERVICE);
WakeLock wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,"abc");
wakeLock.acquire();

স্থানীয় ভেরিয়েবলের সাথে: নামগুলি পাঠকের সাথে কিছু তথ্য যুক্ত করে এবং প্রকারগুলি স্পষ্টভাবে নির্দিষ্ট করা হয়, তবে প্রকৃত পদ্ধতি কলগুলি কম দেখা যায় না এবং (আমার মতে) এটি পরিষ্কারভাবে পড়েন না।

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

আরও তিনটি মন্তব্য:

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

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

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


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

2
আপনার প্রথম কোড উদাহরণটি কেবল তখনই কাজ করে যদি আপনি সাবলীল ইন্টারফেস বা একটি "নির্মাতা" প্যাটার্ন ব্যবহার করে আপনার বস্তুগুলি তৈরি করেন তবে আমি আমার কোডে কোথাও ব্যবহার করব না, তবে কেবল বেছে বেছে।
রবার্ট হার্ভে

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

1
আমি আপনার বৈকল্পিক পাঠযোগ্যতার জন্য আরও খারাপ দেখতে পাই। আমি খুব বেশি ভিবিএন নেটওয়াসের কাছে প্রকাশ পেয়েছি, তবে আপনার নমুনাটি দেখার সময় আমার প্রথমটি "WITH বিবৃতিটি কোথায় গেল? আমি কি ঘটনাক্রমে মুছে ফেলেছিলাম?" যা চলছে তা আমার দুবার দেখতে হবে এবং যখন অনেক মাস পরে কোডটি পুনরায় দেখা দরকার তখন তা ভাল হয় না।
টনি

1
@ টনি আমার জন্য, এটি আরও পঠনযোগ্য: স্থানীয়রা প্রাসঙ্গিক থেকে স্পষ্ট নয় এমন কিছু যুক্ত করেন না। আমি আমার জাভা মাথা আছে, তাই কোন withবিবৃতি। এটি জাভাতে সাধারণ বিন্যাসের সম্মেলন হবে।
rghome

6

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

এই পরবর্তী প্রতিক্রিয়াগুলির জন্য অনুপ্রেরণাগুলি সম্পর্কে, ফোলার লিখেছেন :

"টেম্পসের সমস্যাটি হ'ল তারা অস্থায়ী এবং স্থানীয় Because টেম্পের পরিবর্তে একটি কোয়েরি পদ্ধতিতে ক্লাসের যে কোনও পদ্ধতিই তথ্য পেতে পারে That যা ক্লাসের জন্য ক্লিনার কোড নিয়ে আসতে অনেক সহায়তা করে। "

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

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


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

এই প্রশ্নের টেম্পগুলি ইতিমধ্যে ফাংশনগুলিকে বোঝায়, সুতরাং এই উত্তরটি ওপিএস প্রশ্নের অপ্রাসঙ্গিক।
user949300

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

1
ঠিক আছে, আমি বিক্রি করেছি, ** আমার ভোট পরিবর্তন করার জন্য ** চেষ্টা করেছিলেন। তবে প্রায়শই যখন আমি ওপি প্রশ্নের সীমাবদ্ধতার বাইরে চলে যাই তবে ডিনজেড হয়ে যাই। তাই চঞ্চল হতে পারে ... :-)। এর, আপনি সম্পাদনা না করা পর্যন্ত আমার ভোট পরিবর্তন করতে পারবেন না, যাই হোক না কেন ...
user949300

@ ব্যবহারকারী949300 পবিত্র গরু! যে ব্যক্তি বিষয়গুলির চিন্তাভাবনা বিবেচনা করে তাদের মন পরিবর্তন করেন! আপনি স্যার, আপনি খুব বিরল, এবং আমি আমার ক্যাপ আপনাকে দিতে।
জোনাথন হার্টলে

3

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

acquireWakeLock(POWER_SERVICE, PARTIAL, "abc");

তাহলে আমি বলব এটি সম্ভবত একটি ভাল ধারণা হবে। সম্ভবত আপনি এটি অনুরূপ কিছুতে সিদ্ধ করতে সহায়ক পদ্ধতি প্রবর্তন করতে পারেন; যদি এর মতো কোড একাধিকবার প্রদর্শিত হয় তবে এটি ভালভাবে সার্থক হতে পারে।


2

আসুন এখানে ডিমিটারের আইনটি বিবেচনা করুন। লোড সম্পর্কিত উইকিপিডিয়া নিবন্ধে নিম্নলিখিতটি বলা হয়েছে:

ফাংশনগুলির জন্য লিমিটার অফ ডিমিটারের জন্য আবশ্যক যে কোনও অবজেক্টের একটি মিটার মিটার কেবল নিম্নলিখিত ধরণের অবজেক্টের পদ্ধতিতে প্রার্থনা করতে পারে: [২]

  1. ও নিজেই
  2. মিটার প্যারামিটার
  3. এম এর মধ্যে যে কোনও বস্তু তৈরি / তাত্ক্ষণিক
  4. ও এর সরাসরি উপাদান উপাদান
  5. মিটার স্কোপটিতে ও দ্বারা অ্যাক্সেসযোগ্য একটি বৈশ্বিক পরিবর্তনশীল

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

((PowerManager)getSystemService(POWER_SERVICE)).newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,"MyWakelockTag").acquire();

এটি কী করছে তা নির্ধারণ করা সত্যই কঠিন। এটি বুঝতে আপনাকে প্রতিটি পদ্ধতি কী করে তা বুঝতে হবে এবং তারপরে কোন ফাংশনটি কোন বস্তুর উপরে ডাকা হবে তা নির্ধারণ করতে হবে first প্রথম কোড ব্লক

PowerManager powerManager=(PowerManager)getSystemService(POWER_SERVICE);
WakeLock wakeLock=powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,"abc");
wakeLock.acquire();

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

সম্ভবত আর একটি উপায় যা ভাবার তা হ'ল স্মরণ রাখা যে সফ্টওয়্যার তৈরি করার সময় আপনার স্পষ্টতার জন্য লিখতে হবে, ব্রেভিটি নয়। সমস্ত সফ্টওয়্যার বিকাশের 90% রক্ষণাবেক্ষণ হয়। কোনও কোডের টুকরো কখনও লিখবেন না আপনি বজায় রাখতে খুশি হবেন না।

শুভকামনা করছি.


3
তরল বাক্য গঠনটি এই উত্তরের সাথে কীভাবে খাপ খায় আমি আগ্রহী। সঠিক ফর্ম্যাটিংয়ের সাথে তরল বাক্য গঠনটি অত্যন্ত পঠনযোগ্য।
গুড্ডর

12
"ল অফ অফ ডিমিটার" এর অর্থ এটি নয়। লিমিটার অফ ডিমিটার কোনও ডট গণনা অনুশীলন নয়; এর মূল অর্থ "কেবলমাত্র আপনার নিকটবর্তী বন্ধুদের সাথে কথা বলুন।"
রবার্ট হার্ভে

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

2
"লিমিটার অফ ডিমিটার" এর ক্ষেত্রে উভয় সংস্করণ সমানভাবে "খারাপ"।
হাল্ক

@ গুডর একমত হয়েছেন, প্রশ্ন উদাহরণে স্টাইলিং সম্পর্কে এটি আরও একটি মন্তব্য। প্রশ্নটি এখন সম্পাদিত হয়েছে।
Jodrell

2

একটি বিষয় লক্ষণীয় হ'ল কোডটি প্রায়শই বিভিন্ন "গভীরতায়" পঠিত হয়। এই কোড:

PowerManager powerManager = (PowerManager)getSystemService(POWER_SERVICE);
WakeLock wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "abc");
wakeLock.acquire();

"স্কিম" করা সহজ। এটি 3 বিবৃতি। প্রথমে আমরা একটি সঙ্গে আসা PowerManager। তারপরে আমরা একটি নিয়ে আসি WakeLock। তারপর আমরা । আমি প্রতিটি লাইনের প্রারম্ভের দিকে তাকিয়ে সত্যই সহজে দেখতে পাচ্ছি; সরল ভেরিয়েবল অ্যাসাইনমেন্টগুলি আংশিকভাবে "টাইপটি বর্ণনাম = ..." হিসাবে স্বীকৃত এবং মানসিকভাবে "..." এর উপরে স্কিম করা সহজ। একইভাবে শেষ বিবৃতিটি অবশ্যই স্পষ্টভাবে অ্যাসাইনমেন্টের ফর্ম নয়, তবে এটিতে কেবল দুটি নাম জড়িত, সুতরাং "মূল বক্তব্য" অবিলম্বে দৃশ্যমান is আমি কেবল "এই কোডটি কী করে?" জবাব দেওয়ার চেষ্টা করছি কিনা এমনই প্রায়শই আমার জানা দরকার? উচ্চতর স্তরেacquirewakeLock

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

((PowerManager)getSystemService(POWER_SERVICE))
    .newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "MyWakelockTag")
    .acquire();

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

কখনও কখনও যদিও, এটি আপনি চান হতে পারে। আমি যদি আপনার রূপান্তরটি অর্ধ-উপায়ে প্রয়োগ করি এবং লিখেছি:

WakeLock wakeLock =
     ((PowerManeger)getSystemService(POWER_SERVICE))
    .newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "MyWakeLockTage");
wakeLock.acquire();

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

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


আমার কাছে, যদিও এপিআই সম্পর্কে আমার কোনও জ্ঞান নেই, ভেরিয়েবলগুলি ছাড়াই কোডটি কী করে তা খুব স্পষ্ট। getSystemService(POWER_SERVICE)পাওয়ার ম্যানেজার পায় .newWakeLockএকটি ওয়েক লক পায় .acquireএটি অর্জন। ঠিক আছে, আমি সমস্ত ধরণের জানি না, তবে আমার প্রয়োজন হলে আইডিইতে এটি খুঁজে পেতে পারি।
rghome

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

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

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

2

এটি এমনকি নিজের নামের একটি অ্যান্টিপ্যাটার্ন: ট্রেন রেক । প্রতিস্থাপন এড়ানোর বেশ কয়েকটি কারণ ইতিমধ্যে বলা হয়েছে:

  • পড়া শক্ত
  • ডিবাগ করা আরও শক্ত (ভেরিয়েবলগুলি দেখতে এবং ব্যতিক্রমগুলির অবস্থান সনাক্ত করতে উভয়)
  • লিমিটেডের আইন লঙ্ঘন (এলওডি)

এই পদ্ধতিটি অন্যান্য অবজেক্ট থেকে খুব বেশি জানে কিনা তা বিবেচনা করুন। পদ্ধতি শৃঙ্খলা একটি বিকল্প যা আপনাকে দম্পতি হ্রাস করতে সহায়তা করতে পারে।

এছাড়াও মনে রাখবেন যে বস্তুর উল্লেখগুলি খুব সস্তা।


এহম কি পদ্ধতিতে শৃঙ্খলাবদ্ধ সংশোধিত কোড নয়? লিখিত নিবন্ধটি সম্পাদনা করুন তাই আমি এখন পার্থক্যটি দেখতে পাচ্ছি। খুব ভাল নিবন্ধ ধন্যবাদ!
স্টিজন ডি উইট

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

আমার ধারণা "ট্রেন রেক" এর বিপরীতটি "লোকাল লাইন"। এটি বেশিরভাগ দিন কেউ না করলেও, এই ট্রেনটি দুটি বড় শহরগুলির মধ্যে যেটি প্রতিটি দেশের গ্রামে থামে someone
rghome

1

বর্ণিত প্রশ্নটি হ'ল "যদি আমরা পারি তবে স্থানীয় ভেরিয়েবলগুলি বাদ দিতে হবে"?

না, আপনি কেবল কারণ পারেন তা দূর করা উচিত নয়।

আপনার দোকানে কোডিং নির্দেশিকা অনুসরণ করা উচিত।

বেশিরভাগ অংশের জন্য স্থানীয় ভেরিয়েবল কোডটি পড়া এবং ডিবাগ করা সহজ করে।

আপনারা যা করেছেন তা আমি পছন্দ করি PowerManager powerManager। আমার কাছে ক্লাসের একটি নিম্ন কেস মানে এটি কেবলমাত্র এক সময়ের ব্যবহার।

যখন আপনার উচিত হবে না যদি ভেরিয়েবলটি ব্যয়বহুল সংস্থানগুলিতে ধরে রাখে। অনেক ভাষাতে স্থানীয় ভেরিয়েবলের বাক্য গঠন থাকে যা পরিষ্কার / প্রকাশ করা প্রয়োজন। সি # তে এটি ব্যবহার করছে।

using(SQLconnection conn = new SQLconnnection())
{
    using(SQLcommand cmd = SQLconnnection.CreateCommand())
    {
    }
}

এটি সত্যই স্থানীয় পরিবর্তনশীলগুলির সাথে নয় তবে রিসোর্স ক্লিনআপের সাথে সম্পর্কিত ... আমি সি # তে ভাল পারদর্শী নই তবে আমিও using(new SQLConnection()) { /* ... */ }আইনী না হলে আমি অবাক হব (এটি কার্যকর হবে কি না তা আলাদা বিষয় :))।
স্টিজন ডি উইট

1

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

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

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


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

@ জিমি জেমস: আমার উত্তরে কিছু ব্যাখ্যা যুক্ত করেছেন। তবে আপনার মন্তব্যের একটি অংশ রয়েছে যা আমি বুঝতে পারি নি: "স্থানীয় ভেরিয়েবলগুলির ব্যবহার পরিবর্তনশীল রাষ্ট্রের সাথে মোকাবিলা করতে সহায়তা করে"। আপনি এই ব্যাখ্যা করতে পারেন?
ফ্র্যাঙ্ক পাফার

1
উদাহরণস্বরূপ, আসুন আমি বলি যে আমার একটি মান পরীক্ষা করা দরকার এবং এটি যদি 10 এর বেশি হয়ে যায় তবে একটি সতর্কতা দেখা যায়। মনে করুন এই মানটি পদ্ধতি থেকে এসেছে getFoo()। যদি আমি কোনও স্থানীয় ঘোষণা এড়াতে পারি তবে আমি শেষ করব if(getFoo() > 10) alert(getFoo());তবে গেটফু () দুটি পৃথক কলগুলিতে বিভিন্ন মান ফিরে আসতে পারে। আমি 10 এর চেয়ে কম বা সমান মানের সাথে একটি সতর্কতা পাঠাতে পারতাম যা সর্বোপরি বিভ্রান্তিকর এবং আমার কাছে ত্রুটি হিসাবে ফিরে আসবে। এই ধরণের জিনিস সম্মতিতে আরও গুরুত্বপূর্ণ হয়ে ওঠে। স্থানীয় অ্যাসাইনমেন্টটি পারমাণবিক।
জিমি জেমস

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

সাম্প্রতিক একটি আলাপে স্পিকার যুক্তি দিয়েছিলেন যে ভেরিয়েবল চূড়ান্ত হয় তা দেখানোর সর্বোত্তম উপায় হ'ল সংক্ষিপ্ত পদ্ধতিগুলি লেখা যেখানে এটি স্পষ্ট যে স্পষ্ট হয় যে পরিবর্তনশীল পরিবর্তন হয় না । যদি finalকোনও পদ্ধতিতে স্থানীয় ভেরিয়েবলের প্রয়োজন হয় তবে আপনার পদ্ধতিটি দীর্ঘ।
user949300
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.