প্রতিবিম্বের মাধ্যমে ডাকা একটি পদ্ধতি চিহ্নিত করার জন্য সেরা অনুশীলন?


11

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

প্রতিস্থাপনের মাধ্যমে ডাকা আমাদের উদ্দেশ্যে কীভাবে আমাদের নথি / দস্তাবেজ পদ্ধতিগুলি চিহ্নিত করতে হবে?

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

আমি দুটি বিকল্প জানি যা আমরা ব্যবহার করতে পারি তবে উভয়ই সন্তুষ্ট নয়। যেহেতু ভিজ্যুয়াল স্টুডিও রেফারেন্সগুলি খুঁজে পাচ্ছে না:

  • একটি কাস্টম অ্যাট্রিবিউট ব্যবহার করুন এবং এই অ্যাট্রিবিউট দিয়ে কনস্ট্রাক্টরকে চিহ্নিত করুন।
    • একটি সমস্যা হ'ল অ্যাট্রিবিউট বৈশিষ্ট্যগুলি কোনও পদ্ধতি রেফারেন্স হতে পারে না, সুতরাং নির্মাতা এখনও 0 টি রেফারেন্স হিসাবে দেখায়।
    • কাস্টম বৈশিষ্ট্যের সাথে পরিচিত নয় এমন কলেজগুলি সম্ভবত এটিকে উপেক্ষা করবে।
    • আমার বর্তমান পদ্ধতির একটি সুবিধা হ'ল প্রতিচ্ছবি অংশটি যে কন্ট্রাক্টরকে কল করতে হবে তা সন্ধান করতে বৈশিষ্ট্যটি ব্যবহার করতে পারে।
  • দলিল করার জন্য মন্তব্যগুলি ব্যবহার করুন যে কোনও পদ্ধতি / কনস্ট্রাক্টর প্রতিবিম্বের মাধ্যমে ডাকা উচিত।
    • স্বয়ংক্রিয় সরঞ্জামগুলি মন্তব্যগুলিকে উপেক্ষা করে (এবং সহকর্মীরাও এটি করতে পারে)।
    • Xml ডকুমেন্টেশন মন্তব্য ভিসুয়াল স্টুডিও পদ্ধতি / কন্সট্রাকটর একটি অতিরিক্ত রেফারেন্স গণনা আছে ব্যবহৃত করা যেতে পারে:
      দিন MyPluginবর্গ যার কন্সট্রাকটর প্রতিফলন মাধ্যমে ডাকা হবে। ধরুন যে intপরামিতি গ্রহণকারী কনস্ট্রাক্টরদের জন্য আমন্ত্রণমূলক প্রতিচ্ছবি কোড অনুসন্ধানগুলি । নিম্নলিখিত ডকুমেন্টেশনগুলি কোড লেন্সটি কনস্ট্রাক্টরকে 1 রেফারেন্সযুক্ত দেখায়:
      /// <see cref="MyPlugin.MyPlugin(int)"/> is invoked via reflection

কোন ভাল বিকল্প বিদ্যমান?
কোন পদ্ধতি / নির্মাণকারীকে চিহ্নিত করার জন্য সেরা-অনুশীলন কী যা প্রতিবিম্বের মাধ্যমে ডাকে?


শুধু পরিষ্কার করার জন্য, এটি কোনও ধরণের প্লাগইন সিস্টেমের জন্য, তাই না?
হোসাইজ করুন

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

1
রিশার্পারের [UsedImplictly] বৈশিষ্ট্য রয়েছে।
কোডসইনচাউস

4
আমার ধারণা XML ডক কমেন্ট বিকল্পটি সম্ভবত আপনার সেরা বিকল্প probably এটি সংক্ষিপ্ত, স্ব-ডকুমেন্টিং, এবং কোনও "হ্যাক" বা অতিরিক্ত সংজ্ঞা প্রয়োজন হয় না।
ডক ব্রাউন

2
এক্সএমএল ডকুমেন্টেশন মন্তব্যের জন্য আরেকটি ভোট। যদি আপনি যাইহোক ডকুমেন্টেশন তৈরি করেন তবে এটি উত্পন্ন ডকুমেন্টেশনের মধ্যে দাঁড়ানো উচিত।
ফ্র্যাঙ্ক হিলিমান

উত্তর:


12

প্রস্তাবিত সমাধানগুলির সংমিশ্রণ:

  • কনস্ট্রাক্টর / পদ্ধতির প্রতিবিম্বের মাধ্যমে ডাকা হয়েছে এমন নথিতে ডকুমেন্ট করতে এক্সএমএল ডকুমেন্টেশন ট্যাগ ব্যবহার করুন।
    এটি সহকর্মীদের (এবং আমার ভবিষ্যত স্ব) এর উদ্দেশ্যে ব্যবহারটি স্পষ্ট করতে হবে।
  • <see>কনস্ট্রাক্টর / পদ্ধতির রেফারেন্স গণনা বাড়ানোর জন্য -ট্যাগের মাধ্যমে 'ট্রিক' ব্যবহার করুন ।
    এটি সেই কোড লেন্সটিকে তৈরি করে এবং রেফারেন্সগুলি সন্ধান করে যে কনস্ট্রাক্টর / পদ্ধতিটি রেফারেন্সযুক্ত।
  • রিশার্পারের সাথে টীকা দিন UsedImplicitlyAttribute
    • রিশার্পার একটি ডি-ফ্যাক্টো স্ট্যান্ডার্ড এবং [UsedImplicitly]যথাযথভাবে উদ্দিষ্ট শব্দার্থক শব্দ রয়েছে।
    • যাঁরা রিশার্পার ব্যবহার করছেন না তারা ন্যুগেট :
      প্রধানমন্ত্রী> এর মাধ্যমে জেটব্রেইনস রেশার্পার টিকাগুলি ইনস্টল করতে পারেন Install-Package JetBrains.Annotations
  • যদি এটি একটি ব্যক্তিগত পদ্ধতি হয় এবং আপনি ভিজ্যুয়াল স্টুডিওর কোড বিশ্লেষণ ব্যবহার করে SupressMessageAttributeথাকেন তবে বার্তাটির জন্য ব্যবহার করুন CA1811: Avoid uncalled private code

উদাহরণ স্বরূপ:

class MyPlugin
{
    /// <remarks>
    /// <see cref="MyPlugin.MyPlugin(int)"/> is called via reflection.
    /// </remarks>
    [JetBrains.Annotations.UsedImplicitly]
    public MyPlugin(int arg)
    {
        throw new NotImplementedException();
    }

    /// <remarks>
    /// <see cref="MyPlugin.MyPlugin(string)"/> is called via reflection.
    /// </remarks>
    [JetBrains.Annotations.UsedImplicitly]
    [System.Diagnostics.CodeAnalysis.SuppressMessage(
        "Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode",
        Justification = "Constructor is called via reflection")]
    private MyPlugin(string arg)
    {
        throw new NotImplementedException();
    }
}

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


মনে রাখবেন যে এটি রয়েছে এমন একটি MeansImplicitUseAttributeনিজস্ব বৈশিষ্ট্য তৈরি করতে ব্যবহার করা যেতে পারে UsedImplicitly। এটি সঠিক পরিস্থিতিতে অনেকগুলি অ্যাট্রিবিউট শোনাকে হ্রাস করতে পারে।
ডেভ কাজিনো

জেটব্রেইনসের লিঙ্কটি নষ্ট হয়ে গেছে।
জন জাবরোস্কি

5

নেট প্রকল্পে আমি কখনই এই সমস্যাটি পাইনি, তবে জাভা প্রকল্পগুলিতে আমার নিয়মিত একই সমস্যা রয়েছে। আমার স্বাভাবিক পদ্ধতির ব্যবহার করা হয়@SuppressWarnings("unused") টীকাটি একটি মন্তব্য যুক্ত করে কেন তা ব্যাখ্যা করা হয়েছে (কেননা কোনও সতর্কতা নিষ্ক্রিয় করার কারণ ডকুমেন্ট করা আমার স্ট্যান্ডার্ড কোড শৈলীর অংশ - যে কোনও সময় সংকলকটি কিছু বের করতে পারে না, আমি ধরেই নিয়েছি সম্ভবত কোনও মানুষ লড়াই করতে পারে খুব)। স্থিতিশীল বিশ্লেষণ সরঞ্জামগুলি স্বয়ংক্রিয়ভাবে নিশ্চিত হওয়ার সুবিধা রয়েছে যে কোডটির প্রত্যক্ষ রেফারেন্স থাকার কথা নয় এবং মানব পাঠকদের জন্য একটি বিশদ কারণ প্রদান করে aware

জাভা এর সি # সমতুল্য @SuppressWarningsহয় SuppressMessageAttribute। জন্য ব্যক্তিগত পদ্ধতি আপনি বার্তা ব্যবহার করতে পারেন CA1811: অযৌক্তিক ব্যক্তিগত কোড এড়িয়ে চলুন ; উদাহরণ:

class MyPlugin
{
    [System.Diagnostics.CodeAnalysis.SuppressMessage(
        "Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode",
        Justification = "Constructor is called via reflection")]
    private MyPlugin(int arg)
    {
        throw new NotImplementedException();
    }
}

(আমি জানি না, তবে অনুমান করি যে সিআইএল এমন একটি বৈশিষ্ট্যকে সমর্থন করে যা আমি উল্লেখ করেছি জাভাটির মতো; যদি কেউ জানে যে এটি কী, দয়া করে আমার উত্তরটি এর উল্লেখ হিসাবে সম্পাদনা করুন ...)
জুলস

stackoverflow.com/q/10926385/5934037 দেখে মনে হচ্ছে এটি।
লাইভ

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

এখানে SuppressMessageAttribute( এমএসডিএন.মাইক্রোসফটকম / en-us / library/… ) উপস্থিত রয়েছে । যে বার্তাটি নিকটে আসে তা হ'ল CA1811: Avoid uncalled private code( এমএসডিএন.মাইক্রোসফটকম /en-us/library/ms182264.aspx ); আমি এখনও সর্বজনীন কোডের জন্য কোনও বার্তা পাইনি।
ক্যাস্পার ভ্যান ডেন বার্গ

2

ডকুমেন্টিংয়ের বিকল্প হ'ল ইউনিট টেস্ট (গুলি) করা নিশ্চিত করা যে প্রতিফলন কলগুলি সফলভাবে চলছে run

এইভাবে যদি কেউ আপনার বিল্ড / পরীক্ষার প্রক্রিয়াগুলি পরিবর্তন করে বা মুছে ফেলে তবে আপনাকে কিছু ভঙ্গ হয়েছে বলে সতর্ক করা উচিত।


0

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


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