# অঞ্চলগুলি কি অ্যান্টিপ্যাটার্ন বা কোড গন্ধ?


264

সি # কোডের ক্ষেত্রগুলিকে সম্পাদককে সংযোগযোগ্য করে তুলতে #region/ #endregionকীওয়ার্ডগুলির ব্যবহারের অনুমতি দেয় । আমি যখনই এটি করি তবুও আমি কোডের বৃহত অংশগুলি লুকানোর জন্য এটি করি তবে সম্ভবত অন্য শ্রেণি বা পদ্ধতিতে পুনরুদ্ধার করা যেতে পারে। উদাহরণস্বরূপ আমি এমন পদ্ধতিগুলি দেখেছি যেগুলিতে কেবল এটি পরিচালনীয় করে তুলতে 3 বা 4 টি অঞ্চলের সাথে 500 লাইন কোড রয়েছে।

তাহলে অঞ্চলগুলির ন্যায়বিচার ব্যবহার কি সমস্যার লক্ষণ? এটা আমার কাছে মনে হয়।


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

7
কেউ কি এটিকে উইকি বানাতে পারবেন? এই প্রশ্নের সঠিক বা ভুল উত্তর নেই (ভাল, কারণের মধ্যে), এটি প্রায় সম্পূর্ণ বিষয়গত।
এড এস

6
যার মূল্য এটি জেফ আতউড তাদের ঘৃণা করে । তিনি যুক্তি দিয়েছিলেন যে তারা খারাপ কোড লুকায়।
ব্রায়ান

3
কোড গন্ধ এমন বিকাশকারী যারা ঝরনা এবং ডিওডোরেন্ট ব্যবহার করবেন না!
মার্কো

5
দুর্গন্ধ কোডে সাবধানতার সাথে রচিত অঞ্চলগুলি হ'ল ফ্রিগ্রিজের কয়েকটি গ্রাঙ্ক ক্রাস্টি পালঙ্কে যা করে। আপনি এটি প্রতিস্থাপনের জন্য (সময়) অর্থ না পাওয়া পর্যন্ত এটি এটিকে সহনীয় করে তোলে।
নিউটোপিয়ান

উত্তর:


284

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

থেকে:

একটি অ্যান্টি-প্যাটার্ন (বা অ্যান্টিপ্যাটার্ন) হ'ল এমন একটি প্যাটার্ন যা সামাজিক বা ব্যবসায়িক ক্রিয়াকলাপ বা সফ্টওয়্যার ইঞ্জিনিয়ারিংয়ে ব্যবহৃত হয় যা সাধারণত ব্যবহৃত হতে পারে তবে অকার্যকর এবং / অথবা অনুশীলনে অনুশীলনমূলক

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

পদ্ধতির অভ্যন্তরে অঞ্চলগুলি ব্যবহার করবেন না; পরিবর্তে রিফ্যাক্টর

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

এছাড়াও, প্রতিটি পদ্ধতিতে অবশ্যই একটি এবং একটি জিনিস করা উচিত । অন্যদিকে অঞ্চলগুলি বিভিন্ন জিনিস আলাদা করার উদ্দেশ্যে । যদি আপনার পদ্ধতিটি এ, বি বি করে দেয় তবে দুটি অঞ্চল তৈরি করা যৌক্তিক তবে এটি একটি ভুল পদ্ধতির; পরিবর্তে, আপনার দুটি পৃথক পদ্ধতিতে পদ্ধতিটি রিফ্যাক্টর করা উচিত।

এক্ষেত্রে অঞ্চলগুলি ব্যবহার করা রিফ্যাক্টরিংকে আরও কঠিন করে তুলতে পারে। আপনার কল্পনা করুন:

private void DoSomething()
{
    var data = LoadData();
    #region Work with database
    var verification = VerifySomething();
    if (!verification)
    {
        throw new DataCorruptedException();
    }

    Do(data);
    DoSomethingElse(data);
    #endregion

    #region Audit
    var auditEngine = InitializeAuditEngine();
    auditEngine.Submit(data);
    #endregion
}

দ্বিতীয় অঞ্চলে মনোনিবেশ করার জন্য প্রথম অঞ্চলটি ভেঙে যাওয়া কেবল ঝুঁকিপূর্ণ নয়: আমরা সহজেই ব্যতিক্রমটি প্রবাহ বন্ধ করে দেওয়া সম্পর্কে ভুলে যেতে পারি (এর returnপরিবর্তে কোনও প্রহরী ধারা থাকতে পারে , যা স্পট করা আরও কঠিন), তবে সমস্যাও হবে কোডটি যদি এভাবে রিফ্যাক্ট করা উচিত:

private void DoSomething()
{
    var data = LoadData();
    #region Work with database
    var verification = VerifySomething();
    var info = DoSomethingElse(data);

    if (verification)
    {
        Do(data);
    }

    #endregion

    #region Audit
    var auditEngine = InitializeAuditEngine(info);
    auditEngine.Submit(
        verification ? new AcceptedDataAudit(data) : new CorruptedDataAudit(data));
    #endregion
}

এখন অঞ্চলগুলি কোনও ধারণা রাখে না, এবং আপনি প্রথম অঞ্চলে কোডটি না দেখিয়ে সম্ভবত দ্বিতীয় অঞ্চলে কোডটি পড়তে এবং বুঝতে পারবেন না।

আমি মাঝে মাঝে দেখতে পাই এমন একটি ঘটনা:

public void DoSomething(string a, int b)
{
    #region Validation of arguments
    if (a == null)
    {
        throw new ArgumentNullException("a");
    }

    if (b <= 0)
    {
        throw new ArgumentOutOfScopeException("b", ...);
    }
    #endregion

    #region Do real work
    ...
    #endregion
}

দশক এলওসি বিস্তৃত হওয়া যখন আর্গুমেন্টের বৈধতা শুরু হয় তখন এটি অঞ্চলগুলিকে ব্যবহার করতে প্ররোচিত হয় তবে এই সমস্যা সমাধানের আরও ভাল উপায় আছে: নেট ফ্রেমওয়ার্ক উত্স কোড দ্বারা ব্যবহৃত একটি:

public void DoSomething(string a, int b)
{
    if (a == null)
    {
        throw new ArgumentNullException("a");
    }

    if (b <= 0)
    {
        throw new ArgumentOutOfScopeException("b", ...);
    }

    InternalDoSomething(a, b);
}

private void InternalDoSomething(string a, int b)
{
    ...
}

গোষ্ঠীগুলির জন্য পদ্ধতির বাইরে অঞ্চলগুলি ব্যবহার করবেন না

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

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

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

অঞ্চলগুলির জন্য কি ভাল ব্যবহার আছে?

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

সম্পর্কে এটি সম্পর্কে চিন্তা করুন goto। যে ভাষা বা আইডিই কোনও বৈশিষ্ট্য সমর্থন করে তার অর্থ এই নয় যে এটি প্রতিদিন ব্যবহার করা উচিত। স্টাইলকপ SA1124 নিয়মটি পরিষ্কার: আপনার অঞ্চলগুলি ব্যবহার করা উচিত নয়। কখনও।

উদাহরণ

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

4000 এলওসি দানব:

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

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

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

অঞ্চল "একটি কর", অঞ্চল "কর বি":

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

এর একটি সুবিধা ছিল:

  • অঞ্চলটির নামগুলি দেখে পদ্ধতিটি বোঝা বেশ স্পষ্ট ছিল। এটি বলা হচ্ছে, একবার রিফ্যাক্ট করা একই পদ্ধতিটি আসল হিসাবে পরিষ্কার হবে।

অন্যদিকে, বিষয়গুলি একাধিক ছিল:

  • অঞ্চলগুলির মধ্যে নির্ভরতা থাকলে এটি স্পষ্ট ছিল না। আশা করি, ভেরিয়েবলগুলির পুনরায় ব্যবহার হয়নি; অন্যথায়, রক্ষণাবেক্ষণ আরও দুঃস্বপ্ন হতে পারে।

  • পদ্ধতিটি পরীক্ষা করা প্রায় অসম্ভব ছিল। আপনি কীভাবে সহজেই জানবেন যে পদ্ধতিটি একবারে বিশটি কাজ করে তা সঠিকভাবে সম্পাদন করে?

ক্ষেত্র অঞ্চল, বৈশিষ্ট্য অঞ্চল, নির্মাতা অঞ্চল:

পর্যালোচনা কোডটিতে অনেকগুলি অঞ্চল একত্রে সমস্ত ক্ষেত্রকে একত্রিত করা, সমস্ত সম্পত্তি একসাথে করা ইত্যাদি ছিল contained এটির একটি সুস্পষ্ট সমস্যা ছিল: উত্স কোড বৃদ্ধি growth

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

আর একটি সমস্যা হ'ল আপনি যদি এটি সর্বত্র করেন তবে আপনি নিজেকে একটি-ব্লক অঞ্চল তৈরি করতে দেখবেন, যার কোনও অর্থ নেই। এটি আসলে আমি কোডটি পর্যালোচনা করেছিলাম যেখানে সেখানে #region Constructorএকজন কনস্ট্রাক্টর প্রচুর ছিল ।

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


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

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

37
@radarbob: সংক্ষেপে, অঞ্চলগুলি ক্রপী কোডে সহায়তা করে যা প্রথম স্থানে থাকা উচিত নয়।
আর্সেনি মরজেনকো

40
-1 (যদি আমার সুনাম থাকে)। এমনকি যদি আপনার ধরণের সদস্যরা সুসংহত এবং পৃথক পৃথক হয় তবে তাদের প্রচুর পরিমাণ থাকতে পারে। অঞ্চলগুলি আপনাকে 10 বা 12 টি বৈশিষ্ট্য এবং সম্পর্কিত গিটারগুলি এবং সেটটারগুলি কেবল যে কোনও পদ্ধতিতে আপনি কাজ করতে চান তা পেতে স্ক্রোল করে সংরক্ষণ করে। একমাত্র বিকল্প হ'ল স্বতন্ত্রভাবে আপনার সমস্ত সম্পত্তি ধবংস করা, যা এমন কিছু নয় যা আমি ভক্ত। কার্যকরী অঞ্চলগুলি সরবরাহ করে বৃহত আকারের প্রদর্শন / লুকান অত্যন্ত কার্যকর। যদিও আমি আন্তঃ-পদ্ধতি অঞ্চলগুলি সম্পর্কে একমত।
আসাদ সাইদুদ্দীন

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

112

আমার পক্ষে এটি অবিশ্বাস্য যে কত লোক এত আবেগপ্রবণ অঞ্চলগুলিকে ঘৃণা করে !

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

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

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

#regionsমুল বক্তব্যটি হ'ল আপনার কোডটি পৃথক এবং যৌক্তিকভাবে বিভক্ত করার জন্য ব্যবহার করা কোনও মূল্যে এড়ানো কোনও খারাপ জিনিস নয়। যেমনটি এড উল্লেখ করেছেন, এটি কোনও "কোড গন্ধ" নয়। যদি আপনার কোডটির গন্ধ পাওয়া যায়, আপনি নিশ্চিত হয়ে উঠতে পারেন যে এটি অঞ্চলগুলি থেকে আসছে না, তবে আপনি যে অঞ্চলে কবর দেওয়ার চেষ্টা করেছেন তার কোডের পরিবর্তে। যদি কোনও বৈশিষ্ট্য আপনাকে আরও সংগঠিত হতে বা আরও ভাল কোড লিখতে সহায়তা করে তবে আমি বলি এটি ব্যবহার করুন । যদি এটি বাধা হয়ে দাঁড়ায়, বা আপনি নিজেকে ভুলভাবে এটি ব্যবহার করে দেখতে পান তবে এটি ব্যবহার বন্ধ করুন । যদি খারাপটি সবচেয়ে খারাপ হয় এবং আপনি এটি ব্যবহার করে এমন লোকদের সাথে একটি দলে কাজ করতে বাধ্য হন তবে কোডের রূপরেখা বন্ধ করতে কীবোর্ড শর্টকাটটি মুখস্থ করুন: Ctrl+ M, Ctrl+P। আর অভিযোগ করা বন্ধ করুন। কখনও কখনও আমি অনুভূতিটি পাই যে এটি অন্য উপায় যাঁরা "সত্য", "হার্ডকোর" প্রোগ্রামার হিসাবে দেখাতে চান তারা চেষ্টা করে নিজেরাই প্রমাণ করতে পছন্দ করেন prove আপনি সিনট্যাক্স রঙ এড়ানোর চেয়ে অঞ্চলগুলিকে এড়ানো এড়ানো ভাল no এটি আপনাকে আরও মচো বিকাশকারী করে না।

এই সমস্ত বলা হচ্ছে, একটি পদ্ধতির মধ্যে অঞ্চলগুলি কেবল নিছক বাজে কথা। যে কোনও সময় আপনি নিজেকে এটি করতে চাইছেন, আপনার পৃথক পদ্ধতিতে পুনঃনির্ধারণ করা উচিত। কোন অজুহাত নেই.


9
ভাল বলেছ. সংস্থার জন্য অঞ্চলগুলির ব্যবহার আইডিইর "ভিউ হোয়াইটস্পেস" বিকল্পটি টগল করা ছাড়া আর কোনও ক্ষতিকারক নয়। এটি ব্যক্তিগত পছন্দ
জোশ

24
ভিউমোডেলগুলির সাথে ডাব্লুপিএফ নিয়ে কাজ করা যা 10 বা 20 টি বৈশিষ্ট্য যা কেবলমাত্র আমার মডেলটিতে বৈশিষ্ট্যগুলি আবৃত করে, আমি অঞ্চলগুলিকে পছন্দ করি - আমি কেবল সেই অঞ্চলগুলিতে কোনও অঞ্চলগুলিকে টেক করতে পারি (তাদের কখনও স্পর্শ করার দরকার নেই) এবং প্রাসঙ্গিক কোডটিতে আমার চোখ রাখতে পারি ।
ব্রডহર્স্ট

4
সম্পূর্ণ একমত. .NET 2.0 এ, বৈশিষ্ট্যগুলি প্রায় 8-10 লাইন দীর্ঘ। যখন আপনার একটি ক্লাসে 20 টিরও বেশি সম্পত্তি থাকে, তখন তারা প্রচুর জায়গা নেয়। অঞ্চলগুলি সেগুলি সঙ্কুচিত করার জন্য উপযুক্ত।
ক্রিস্টফ ক্লেস

6
@ ক্রিস্টোফ: নেট নেট in.০ তে বৈশিষ্ট্যগুলি যা সাধারণ ইনপুট বৈধতা দেয়। স্বয়ংক্রিয় বৈশিষ্ট্যগুলি কেবলমাত্র আমার উদ্দেশ্যগুলির জন্য সমস্ত জাদুকরী ছিল না।
কোডি গ্রে

8
আমি আমার বাম বলটি বাজি রাখতে ইচ্ছুক যে অঞ্চলগুলি ঘৃণা করে এমন লোকেরা কখনও ডাব্লুপিএফ অ্যাপ্লিকেশন বিকাশ করেনি বা ডেটা বাঁধাই এবং কমান্ড বাইন্ডিংয়ের মতো ডাব্লুপিএফের সংজ্ঞায়িত কার্যকারিতা কখনই ব্যবহার করেনি। এই কাজগুলি করার জন্য কেবল আপনার কোড সেট আপ করতে প্রচুর জায়গা লাগে এবং আপনাকে সাধারণত এগুলি আবার দেখতে হবে না।
l46kok

69

প্রথমত, আমি "কোড গন্ধ" শব্দটি আর দাঁড়াতে পারি না। এটি খুব ঘন ঘন ব্যবহৃত হয় এবং এটি তাদের বিট করে যদি ভাল কোড চিনতে পারে না এমন লোকদের দ্বারা প্রায় সময় নিক্ষেপ করা হয়। যাইহোক ...

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

আমি আরও যুক্ত করব যে অঞ্চলগুলির ব্যবহার সত্যিই একটি "অ্যান্টি-প্যাটার্ন" হতে পারে না কারণ এই শব্দটি সাধারণত কোনও পাঠ্য সম্পাদকের বিন্যাস নয়, প্রোগ্রাম যুক্তি / নকশার ধরণগুলি বর্ণনা করতে ব্যবহৃত হয়। এটি বিষয়গত; আপনার জন্য কি কাজ করে তা ব্যবহার করুন. আপনার অঞ্চলগুলির অতিরিক্ত ব্যবহারের কারণে আপনি কখনই অনিচ্ছাকৃত প্রোগ্রামটি শেষ করতে যাবেন না, যা অ্যান্টি-প্যাটার্নগুলি সম্পর্কে all :)


2
সাধারণত আমি কোড গন্ধ মন্তব্যের জন্য আপনাকে হ্রাস করতে চাই তবে এই ক্ষেত্রে এটি ঠিক সঠিক accurate নন-কোড একটি গন্ধযুক্ত হতে পারে না। +2!

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

13
কোড গন্ধ সম্পর্কে আপনার মন্তব্য আমি বুঝতে পেরেছি তা নিশ্চিত নয়। কোড গন্ধে সমস্যা আছে তা বোঝায় না, কেবল একটি সমস্যা হতে পারে।
ক্রেগ

7
শব্দ গন্ধে দাঁড়ানোর জন্য +1। আমি বিরক্ত হয়েছি যখন আমি একটি পোস্ট দেখলাম যে দাবি করেছে যে ব্যক্তিগত পদ্ধতিগুলি একটি গন্ধযুক্ত গন্ধ। তবে সামগ্রিকভাবে আমি অঞ্চলগুলির জন্য আপনার বিরক্তির সাথে একমত নই। আমি সহজেই বিক্ষিপ্ত। আসলে আমি এটি পছন্দ করতাম যদি ভিএস-এর কোনও ভিবি 4 মোড থাকে যেখানে আপনি একবারে কেবলমাত্র একটি পদ্ধতি প্রদর্শন করতে পারেন।
জোশ

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

23

হ্যাঁ অঞ্চলগুলি একটি কোড গন্ধ!

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

আপনি কি এমন একটি উদাহরণের কথা ভাবতে পারেন যেখানে আপনি "গিজ, যদিও আমার সহকর্মী এখানে কিছু অঞ্চল ব্যবহার করেছেন!"!

যদিও আমি আমার আইডিই সমস্ত অঞ্চল স্বয়ংক্রিয়ভাবে প্রসারিত করতে কনফিগার করতে পারি সেগুলি এখনও চক্ষু ব্যথা এবং আসল কোডটি পড়া থেকে বিরত থাকে।

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

মূল্যহীন গ্রুমিং!

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


# বিভাগগুলি কি সংকলকের অংশ? আমি ভেবেছিলাম এগুলি কেবল আইডিইর দিকনির্দেশক যা উপেক্ষা করা যেতে পারে।
স্টিভ রুকুটস

2
আপনার সি # কোডটি বিশ্লেষণ করার সময় সংকলকটির এগুলি উপেক্ষা করা দরকার। যদি এটি তাদের অগ্রাহ্য করে না তবে এটি তাদের উপরে ফেলে দেবে। আমি এটাকে বোঝাই।
জোপপে

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

আপনি অবশ্যই আউটসোর্স কোডটি কখনও দেখেন নি। বেশ কয়েকবার অঞ্চলগুলি আউটসোর্স কোডে দেখতে দুর্দান্ত হত। যদিও কোডটি সফল হয় না, কিছুটা যৌক্তিক অর্থে যদি এটি একত্রে হয় তবে অন্তত এটি বোঝা অনেক সহজ হত। যদিও, যদি তাদের কোডটি যৌক্তিক সম্ভাবনা না হয় তবে অঞ্চলগুলিও না হয়, তাই সম্ভবত এটি আরও খারাপ করে দিত। অঞ্চলগুলি সঠিকভাবে ব্যবহৃত হলেও দুর্দান্ত when
নিককমকম্ব

15

আমি ব্যক্তিগতভাবে অঞ্চলগুলিকে বিভিন্ন ধরণের পদ্ধতি বা কোডের অংশগুলিকে একসাথে গ্রুপ করার উপায় হিসাবে ব্যবহার করি।

সুতরাং কোনও কোড ফাইল এটি খোলার সময় এর মতো দেখতে পাওয়া যেতে পারে:

  • জনসাধারণের সম্পত্তি
  • কন্সট্রাকটর
  • পদ্ধতিগুলি সংরক্ষণ করুন
  • পদ্ধতিগুলি সম্পাদনা করুন
  • বেসরকারী সহায়ক পদ্ধতি

আমি পদ্ধতির ভিতরে অঞ্চলগুলি রাখি না। আইএমএইচও এটি কোড গন্ধের লক্ষণ। আমি একবার এমন একটি পদ্ধতি পেলাম যা 1200 লাইনের দীর্ঘ এবং এর মধ্যে 5 টি আলাদা অঞ্চল ছিল। এক ভীতিজনক দৃশ্য!

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


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

3
@ এড এস - এ কারণেই আমি বলেছিলাম "সম্ভবত দেখতে" হতে পারে। এটা খুব বিষয়গত। আমি বলছি না যে প্রতিটি ফাইলের মতো দেখতে হবে। তারা যদি হত তবে আমি অবাক হব। একটি জটিল বিষয় সম্পর্কে একটি উদাহরণ। :)
তায়না

ওহ আমি জানি, যেমন আমি বলেছি; এটা বিষয়গত। আপনার / আপনার দলের জন্য যা কিছু কাজ করে। আমি এই প্রকল্পটির জন্য কেবল এটি আউট করেছি কারণ এটি (আমার জন্য) কাজ করে না, তবে আমাকে একটি প্রকল্প বজায় রাখতে হয়েছিল যা কেবল এটি করেছিল। এটা আমাকে পাগল করে দিয়েছে
এড এস

3
@EdS। সুতরাং বনামে আপনার বিকল্পগুলিতে যান এবং অঞ্চলগুলি বন্ধ করে দিন। সমস্যা সমাধান.
অ্যান্ডি

আপনার জিনিসগুলির কেন সংরক্ষণের পদ্ধতি রয়েছে? :(
থিটিকিহিস্পেরার

10

#regionখুব বড় শ্রেণীর পাঠযোগ্য হিসাবে ব্লক ব্যবহার করা সাধারণত একক দায়িত্বের নীতি লঙ্ঘনের লক্ষণ। যদি তারা গোষ্ঠী আচরণে অভ্যস্ত হয়ে থাকে তবে ক্লাসটি খুব বেশি কাজ করে যাবার সম্ভাবনাও রয়েছে (আবারও এসআরপি লঙ্ঘন করছে)।

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


5

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

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

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

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

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


4

আমি সাধারণত CRUD সার্ভার ক্লাসের জন্য বিভিন্ন ধরণের ক্রিয়াকলাপকে সংগঠিত করতে অঞ্চলগুলি ব্যবহার করি। তারপরেও আমি তাদের সাথে আনন্দের সাথে যেতে পারি।

যদি ব্যাপকভাবে ব্যবহৃত হয় তবে এটি একটি লাল পতাকা উত্থাপন করবে। আমি এমন ক্লাসগুলির দিকে নজর রাখব যেগুলির খুব বেশি দায়বদ্ধতা রয়েছে।

আমার অভিজ্ঞতায় কয়েকশ লাইনের কোড সহ একটি পদ্ধতি অবশ্যই গন্ধ।


4

আমার থাম্বের নিয়মটি হ'ল: আপনার যদি একটি ফাইলে 5 টিরও বেশি অঞ্চল থাকে তবে এটি কোডের গন্ধ

উদাহরণস্বরূপ, ক্ষেত্র, পদ্ধতি, বৈশিষ্ট্য এবং নির্মাতাদের চিত্রিত করা ভাল হতে পারে তবে আপনি যদি তার নিজের অঞ্চলে প্রতিটি অন্যান্য পদ্ধতি মোড়ানো শুরু করেন তবে মারাত্মক ভুল is

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


4

অঞ্চলগুলি তাদের ব্যবহার রয়েছে

আমি এগুলি উইন্ডোজ ফর্ম অ্যাপ্লিকেশনগুলির আগে "হ্যান্ড কোডিং" ইন্টারফেস ইভেন্টগুলির জন্য ব্যক্তিগতভাবে ব্যবহার করেছি।

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

সুতরাং আমি যখন এগুলি প্রায়শই ব্যবহার করি না, তারা কোডের বৃহত অংশগুলি সরিয়ে ফেলার জন্য পুরোপুরি ঠিক।


1
আমি অনুরূপ কোড জেনারেটর ব্যবহার করেছি এবং উত্পন্ন কোড সরানোর জন্য আংশিক ক্লাস ব্যবহার করতে পছন্দ করি।
ক্রেগ

আমরা করি, অঞ্চলগুলি পড়ার বা ডিবাগ করা সহজ করার জন্য উত্পন্ন কোডের অভ্যন্তরে থাকে (যদি প্রয়োজন হয়)।
কেন

4

কোডগুলিতে আপনার অঞ্চলগুলি থাকলে আপনার অবশ্যই একটি সমস্যা রয়েছে (উত্পন্ন কোডের ক্ষেত্রে ব্যতীত regions) কোডগুলিতে অঞ্চলগুলি স্থাপন করা মূলত "রিফ্যাক্টর এটি" বলে।

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


1
এটি একটি পৃথক ফাইলে সঞ্চিত আংশিক শ্রেণীর জন্য আরও ভাল ব্যবহারের কেস, অথবা একটি হার্ডকডেডডাটা সোর্স বাস্তবায়ন সহ একটি ইনজেকশনের আইএমআইডাটাসোর্স।
ব্রায়ান বোয়েচার

3

সাম্প্রতিক প্রকল্পে একটি 1700 লাইন পদ্ধতি ছিল এতে বেশ কয়েকটি অঞ্চল এমবেড করা ছিল। মজার বিষয় হ'ল অঞ্চলগুলি পৃথক ক্রিয়াকলাপকে নির্দিষ্ট করে যা পদ্ধতিতে করা হচ্ছিল। আমি কোডটির কার্যকারিতা প্রভাবিত না করেই প্রতিটি অঞ্চলে একটি চুল্লী -> এক্সট্রাক্ট পদ্ধতি করতে সক্ষম হয়েছি।

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


3

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

আমি তারিখটি দেখেছি এমন অঞ্চল-ব্যবহার কোডটি মোটামুটি তিনটি বিভাগে ভাগ করতে পারি:

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

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

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


3

আমি এটি "কোড গন্ধ" বলতে চাই।

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


@ অ্যান্ড্রু গ্রিম: হ্যাঁ
হোয়াইটসাম

3

আমি অঞ্চলগুলিকে কেবল একটি জিনিসের জন্য ব্যবহার করি (কমপক্ষে আমি সেগুলি ব্যবহার করি এমন অন্য জায়গাগুলি সম্পর্কে আমি ভাবতে পারি না): কোনও পদ্ধতির জন্য ইউনিট পরীক্ষাগুলির জন্য।

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

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


1
আপনার কি কখনও টেস্ট রয়েছে যা একাধিক পদ্ধতির পরীক্ষা করে?
মার্কি

প্রশ্নটি বা আপনি এটি কী লক্ষ্য করছেন তা আমি সত্যিই বুঝতে পারি না। উত্তরটি হ'ল: না, ইউনিট পরীক্ষা সর্বদা কেবল একটি পদ্ধতিতে বা বরং একটি পদ্ধতির একটি নির্দিষ্ট দিককে লক্ষ্য করা হয়।
অ্যান শিউসেলার 9

2

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

এই প্লাগইনটি অঞ্চলগুলির ফন্টের আকারটিকে খুব ছোট করবে। সেগুলিও প্রসারিত হবে যাতে আপনাকে সমস্ত অঞ্চল খোলার জন্য সিটিআর + এম + এল চাপতে হবে না। এটি কোড ক্যান্সারের এই ফর্মটি ঠিক করে না তবে এটি তা বহনযোগ্য করে তোলে।


0

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

আমি এটি করার কারণটি তাই নয় যাতে আমি কোডটি ভাঁজ করতে পারি। এটি কারণ যে আমার সম্পাদক স্ক্রিপ্ট করা আছে তাই আমি প্রক্সিটির উল্লেখ উল্লেখ করতে পারি, বলতে পারি:

#region "private_static_members"
 /// <summary>
 /// cache for LauncherProxy
 /// </summary>
private static LauncherProxy _launcherProxy;
#endregion

#region "protected_const_properties"
protected LauncherProxy LauncherProxy{
  get{
    if(_launcherProxy==null) {
      if (!God.Iam.HasProxy(LauncherProxy.NAME)) {
        God.Iam.RegisterProxy(new LauncherProxy());
      }
      _launcherProxy=God.Iam.Proxy(LauncherProxy.NAME) as LauncherProxy;
    }
    return _launcherProxy;
  }
}
#endregion

কোডে প্রবেশ করুন এবং প্রতিটি অংশ সুন্দরভাবে সঠিক অঞ্চলে টুকরো টুকরো করুন।

এক্ষেত্রে ম্যাক্রো আমার প্রকল্পটি বিশ্লেষণ করবে, আমাকে প্রক্সিগুলির একটি তালিকা বাক্স দেবে এবং আমি যেটি চাই তার জন্য কোডটি ইনজেক্ট করবে। আমার কার্সার এমনকি সরান না।

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

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

এটি আমাকে গ্রানুলারিটি দেয় তবে এটি নির্ভরযোগ্য, স্বতঃস্ফূর্ত গ্রানুলারিটি যার উপর আমি নির্ভর করতে পারি।


-1 যত তাড়াতাড়ি আমি ডাউনটিতে 125 পয়েন্ট পেয়ে যাব। আপনি কোডের অপ্রয়োজনীয় লাইন যুক্ত করছেন। কেন আপনি কেন কোনও সম্পত্তির আশেপাশে একটি অঞ্চল রাখবেন ... যদি (God.Iam.AbusingRegions () == সত্য) আমার নাম = "চিহ্ন"
ডেডলিচাম্বারস

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

1
আপনি সম্ভবত এটিতে রিফ্যাক্টর করতে পারেন: সুরক্ষিত লঞ্চারপ্রক্সি লঞ্চারপ্রক্সি => গড I আইএম et গেটঅর্ড অ্যাডপ্রক্সি <ল্যাঞ্চারপ্রক্সি> (রেফ _লাঞ্চারপ্রক্সি); এবং এইভাবে আপনার এখন অঞ্চলটির দরকার নেই। এছাড়াও _লাঞ্চারপ্রক্সিকে _লাঞ্চারপ্রক্সি ক্যাশে পুনরায় নামকরণ করা যেতে পারে যাতে আপনার অঞ্চলের প্রয়োজন হয় না বা সেখানে কোনও মন্তব্য করা যায় না।
অ্যারোসন

0

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


0

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

অঞ্চলগুলি অবজেক্ট-ওরিয়েন্টেড কোড, আইএমওর চেয়ে ফাংশনাল কোডে আরও বেশি উদ্দেশ্য করে, যেখানে আপনার ক্রমবর্ধমান তথ্যগুলির দীর্ঘ ফাংশন রয়েছে যা এটি ভেঙে ফেলা বোঝা তোলে, কিন্তু অনেক সময় আমি ব্যক্তিগতভাবে সেগুলিতে সি # তে ব্যবহার করেছি এবং তারা প্রায় সর্বদা আপনার প্রয়োজন / কোডটি দেখতে চাই না এমন কোডে ফোকাস করুন। আমার জন্য, এগুলি সাধারণত এনপোকো বা এর ভেরিয়েন্টগুলির জন্য ব্যবহৃত কোড বেসে কাঁচা এসকিউএল স্ট্রিং ধ্রুবক ছিল। আপনার ওআরএম এর মাধ্যমে পোকো অবজেক্টটি কীভাবে পূর্ণ করতে ডেটা আসে তা যদি আপনি অবহিত না করেন তবে এগুলি দেখার পক্ষে সম্পূর্ণরূপে অর্থহীন ছিল ... এবং যদি আপনি যত্ন নেন, আরে, কেবল অঞ্চল এবং বিএএম প্রসারিত করুন ! আপনার দেখার আনন্দের জন্য কিছু জটিল এসকিউএল কোয়েরির 150+ লাইন।

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