আমার মতামত বিতর্কিত হতে পারে, তবে হ্যাঁ, আমি মনে করি যে অবশ্যই এমন পরিস্থিতি রয়েছে যেখানে আমি এই ধরণের শৈলীটি ব্যবহার করব। তবে, "কেবলমাত্র ভেরিয়েবলের স্কোপ হ্রাস করার জন্য" কোনও বৈধ যুক্তি নয়, কারণ এটি আপনি ইতিমধ্যে করছেন। এবং এটি করার জন্য কিছু করা কোনও বৈধ কারণ নয়। এছাড়াও নোট করুন যে এই ধরণের সিনট্যাক্স প্রচলিত কিনা তা আপনার দল ইতিমধ্যে সমাধান করে ফেলেছে তবে এই ব্যাখ্যার কোনও অর্থ নেই।
আমি মূলত একজন সি # প্রোগ্রামার, তবে শুনেছি জাভাতে, পাসওয়ার্ডটি ফেরত char[]
দেওয়া আপনাকে পাসওয়ার্ডের স্মৃতিতে থাকার সময়কে হ্রাস করার অনুমতি দেয়। এই উদাহরণে এটি সাহায্য করবে না, কারণ আবর্জনা সংগ্রহকারীকে ব্যবহৃত না হওয়া মুহুর্ত থেকে অ্যারে সংগ্রহ করার অনুমতি দেওয়া হয়েছে, তাই পাসওয়ার্ডটি সুযোগ ছাড়লে তা বিবেচ্য নয়। আপনি এটি সম্পন্ন করার পরে অ্যারেটি সাফ করা কার্যকর হবে কিনা তা নিয়ে আমি তর্ক করছি না, তবে এই ক্ষেত্রে আপনি যদি এটিটি করতে চান তবে ভেরিয়েবলটি স্কোপ করা অর্থবোধ করে:
{
char[] password = getPassword();
try{
keyStore.load(new FileInputStream(keyStoreLocation), password);
keyManager.init(keyStore, password);
}finally{
Arrays.fill(password, '\0');
}
}
এটি প্রকৃত অর্থে -সংস্থাগুলির বিবৃতিতে অনুরূপ , কারণ এটি সংস্থানটি সরিয়ে দেয় এবং আপনার কাজ শেষ হওয়ার পরে এটিতে একটি চূড়ান্তকরণ সম্পাদন করে। আবার দয়া করে নোট করুন যে আমি পাসওয়ার্ডগুলি এই পদ্ধতিতে পরিচালনা করার জন্য তর্ক করছি না, কেবল যদি আপনি এটি করার সিদ্ধান্ত নেন তবে এই শৈলীটি যুক্তিসঙ্গত।
এর কারণ হ'ল ভেরিয়েবলটি আর বৈধ নয়। আপনি এটি তৈরি করেছেন, ব্যবহার করেছেন এবং কোনও অর্থবহ তথ্য না থাকার জন্য তার অবস্থাটিকে অকার্যকর করেছেন। এই ব্লকের পরে পরিবর্তনশীলটি ব্যবহার করার কোনও অর্থ নেই, সুতরাং এটির সুযোগটি যুক্তিযুক্ত reasonable
আমি অন্য একটি উদাহরণের কথা ভাবতে পারি যখন আপনার দুটি ভেরিয়েবল থাকে যার একই নাম এবং অর্থ থাকে তবে আপনি একটির সাথে কাজ করেন এবং তার পরে অন্যটির সাথে কাজ করেন এবং আপনি সেগুলি আলাদা রাখতে চান। আমি এই কোডটি সি # তে লিখেছি:
{
MethodBuilder m_ToString = tb.DefineMethod("ToString", MethodAttributes.Public | MethodAttributes.Virtual | MethodAttributes.Final, typeofString, Type.EmptyTypes);
var il = m_ToString.GetILGenerator();
il.Emit(OpCodes.Ldstr, templateType.ToString()+":"+staticType.ToString());
il.Emit(OpCodes.Ret);
tb.DefineMethodOverride(m_ToString, m_Object_ToString);
}
{
PropertyBuilder p_Class = tb.DefineProperty("Class", PropertyAttributes.None, typeofType, Type.EmptyTypes);
MethodBuilder m_get_Class = tb.DefineMethod("get_Class", MethodAttributes.Public | MethodAttributes.Virtual | MethodAttributes.Final, typeofType, Type.EmptyTypes);
var il = m_get_Class.GetILGenerator();
il.Emit(OpCodes.Ldtoken, staticType);
il.Emit(OpCodes.Call, m_Type_GetTypeFromHandle);
il.Emit(OpCodes.Ret);
p_Class.SetGetMethod(m_get_Class);
tb.DefineMethodOverride(m_get_Class, m_IPattern_get_Class);
}
আপনি তর্ক করতে পারেন যে আমি কেবল ILGenerator il;
পদ্ধতির শীর্ষে ঘোষণা করতে পারি, তবে আমি বিভিন্ন অবজেক্টের জন্য ভেরিয়েবলটি পুনরায় ব্যবহার করতে চাই না (কিন্ডা ফাংশনাল অ্যাপ্রোচ)। এই ক্ষেত্রে, ব্লকগুলি সিন্ট্যাক্টিক্যালি এবং ভিজ্যুয়াল উভয়ভাবে সম্পাদিত কাজগুলি পৃথক করা সহজ করে তোলে। এটি আরও জানায় যে ব্লকের পরে, আমি কাজটি করেছি il
এবং কোনও কিছুই এটিকে অ্যাক্সেস করা উচিত নয়।
এই উদাহরণের বিরুদ্ধে একটি যুক্তি হল পদ্ধতিগুলি ব্যবহার করা। হতে পারে হ্যাঁ, তবে এই ক্ষেত্রে কোডটি এত দীর্ঘ নয় এবং এটিকে বিভিন্ন পদ্ধতিতে পৃথক করার ক্ষেত্রেও কোডটিতে ব্যবহৃত সমস্ত ভেরিয়েবলগুলি অতিক্রম করতে হবে।