স্ট্যাটিক বিশ্লেষণ সরঞ্জামের জন্য আমি প্রায়ই সিপিডির ব্যবহার PMD , FindBugs এবং Checkstyle ।
সিপিডি হ'ল পিএমডি "কপি / পেস্ট ডিটেক্টর" সরঞ্জাম। আমি একটু জন্য PMD ব্যবহার করছিলেন যখন সামনে আমি লক্ষ্য করেছি "ফাইন্ডিং অনুরূপ করা কোড" লিঙ্কটি উপর PMD ওয়েবপৃষ্ঠাটি ।
আমি উল্লেখ করতে চাই যে এই সরঞ্জামগুলি মাঝে মাঝে তাদের "অফ-অফ-বক্স" বিধিগুলির সেট ছাড়িয়েও বাড়ানো যেতে পারে। এবং কেবল এগুলি নয় যে তারা ওপেন সোর্স যাতে আপনি সেগুলি আবার লিখতে পারেন। এর মধ্যে কয়েকটি সরঞ্জাম অ্যাপ্লিকেশন বা "হুক" নিয়ে আসে যা এগুলি প্রসারিত করতে দেয়। উদাহরণস্বরূপ, পিএমডি "ডিজাইনার" সরঞ্জাম নিয়ে আসে যা আপনাকে নতুন নিয়ম তৈরি করতে দেয়। এছাড়াও, Checkstyle হয়েছে DescendantToken চেক বৈশিষ্ট্য যে সারগর্ভ কাস্টোমাইজেশনের জন্য অনুমতি দেয় রয়েছে।
আমি এই সরঞ্জামগুলিকে একটি পিঁপড়া ভিত্তিক বিল্ডের সাথে একীভূত করি । আমার মন্তব্যযুক্ত কনফিগারেশনটি দেখতে আপনি লিঙ্কটি অনুসরণ করতে পারেন।
বিল্ডটিতে সাধারণ একীকরণের পাশাপাশি, কয়েকটি অন্যান্য উপায়ে কিছুটা "সংহত" হওয়ার সরঞ্জামগুলি কনফিগার করতেও আমি সহায়ক বলে মনে করি। যথা, প্রতিবেদন তৈরি এবং সতর্কতা দমন অভিন্নতা। আমি এই আলোচনায় এই দিকগুলি যুক্ত করতে চাই (যার সম্ভবত "স্ট্যাটিক-বিশ্লেষণ" ট্যাগটিও থাকতে হবে): লোকেরা কীভাবে "ইউনিফাইড" সমাধান তৈরি করতে এই সরঞ্জামগুলি কনফিগার করছে? (আমি এই প্রশ্নটি এখানে আলাদাভাবে জিজ্ঞাসা করেছি )
প্রথমত, সতর্কবার্তার প্রতিবেদনের জন্য, আমি আউটপুটটি রূপান্তর করি যাতে প্রতিটি সতর্কতার সহজ বিন্যাস থাকে:
/absolute-path/filename:line-number:column-number: warning(tool-name): message
এটিকে প্রায়শই "ইমাসাক্স ফর্ম্যাট" বলা হয়, তবে আপনি যদি ইমাস ব্যবহার না করে থাকেন তবে এটি হোমোজেঞ্জাইজিং প্রতিবেদনের জন্য যুক্তিসঙ্গত বিন্যাস। উদাহরণ স্বরূপ:
/project/src/com/example/Foo.java:425:9: warning(Checkstyle):Missing a Javadoc comment.
আমার সতর্কতা বিন্যাসের রূপান্তরগুলি আমার পিপীলিকার স্ক্রিপ্ট দ্বারা পিঁপড়ের ফিল্টারচেইনগুলির সাথে সম্পন্ন হয় ।
দ্বিতীয় "সংহতকরণ" যা আমি করি তা হুঁশিয়ারি দেওয়ার জন্য। ডিফল্টরূপে, প্রতিটি সরঞ্জাম মন্তব্যগুলি বা একটি টীকা (বা উভয়) সমর্থন করে যা আপনি আপনার কোডটিতে রাখতে পারেন এমন একটি সতর্কতা যা আপনি উপেক্ষা করতে চান তা নীরব করতে। তবে এই বিভিন্ন সতর্কতা দমন অনুরোধগুলির একটি সামঞ্জস্য চেহারা নেই যা কিছুটা নির্বোধ বলে মনে হয়। যখন আপনি একটি সতর্কতা দমন করছেন, আপনি একটি সতর্কতা দমন করছেন, তবে কেন সর্বদা "লিখবেন না SuppressWarning
?"
উদাহরণস্বরূপ, পিএমডি-র ডিফল্ট কনফিগারেশন NOPMD
একটি মন্তব্যে স্ট্রিং সহ কোডের লাইনে সতর্কতা জেনারেশনকে দমন করে । এছাড়াও, পিএমডি জাভার @SuppressWarnings
টীকাটি সমর্থন করে । আমি পিএমডিটিকে " SuppressWarning(PMD.
" এর পরিবর্তে " " মন্তব্যগুলি ব্যবহার করার জন্য কনফিগার করেছিলাম NOPMD
যাতে পিএমডি দমনগুলি একই রকম দেখায়। আমি মন্তব্য শৈলীর দমন ব্যবহার করার সময় লঙ্ঘিত হওয়া বিশেষ নিয়মটি পূরণ করি:
// SuppressWarnings(PMD.PreserveStackTrace) justification: (false positive) exceptions are chained
SuppressWarnings(PMD.
একটি মন্তব্যের জন্য কেবল " " অংশটি উল্লেখযোগ্য, তবে এটি টীকাতে পিএমডি এর সমর্থনের সাথে সামঞ্জস্যপূর্ণ @SuppressWarning
যা নাম অনুসারে পৃথক বিধি লঙ্ঘনকে স্বীকৃতি দেয়:
@SuppressWarnings("PMD.CompareObjectsWithEquals") // justification: identity comparision intended
একইভাবে, চেকস্টাইল মন্তব্যগুলির জোড়াগুলির মধ্যে সতর্কতা জেনারেশনকে দমন করে (কোনও টিকাশ সরবরাহ সরবরাহ করা হয় না)। ডিফল্টরূপে, চেকস্টাইলটি বন্ধ করার জন্য মন্তব্যগুলিতে যথাক্রমে স্ট্রিংগুলি CHECKSTYLE:OFF
এবং থাকে CHECKSTYLE:ON
। " BEGIN SuppressWarnings(CheckStyle.
" এবং " END SuppressWarnings(CheckStyle.
" স্ট্রিংগুলি ব্যবহার করতে এই কনফিগারেশনটি (চেকস্টাইলের "সাপ্রেশনকমেন্ট ফিল্টার" সহ) পরিবর্তন করা নিয়ন্ত্রণগুলি পিএমডি-র মতো দেখতে আরও বেশি করে তোলে:
// BEGIN SuppressWarnings(Checkstyle.HiddenField) justification: "Effective Java," 2nd ed., Bloch, Item 2
// END SuppressWarnings(Checkstyle.HiddenField)
Checkstyle মন্তব্যগুলির মাধ্যমে, বিশেষ চেক লঙ্ঘনের ( HiddenField
) হল উল্লেখযোগ্য কারণ প্রতিটি চেক তার নিজস্ব "হয়েছে BEGIN/END
" মন্তব্য জোড়া।
ফাইন্ডব্যাগগুলি একটি @SuppressWarnings
টীকা সহ সতর্কতা জেনারেশন দমনকে সমর্থন করে , তাই অন্যান্য সরঞ্জামগুলির সাথে কিছু স্তরের সাম্যতা অর্জনের জন্য আর কোনও কনফিগারেশন প্রয়োজন হয় না। দুর্ভাগ্যক্রমে, ফাইন্ডব্যাগসকে একটি কাস্টম @SuppressWarnings
টীকা সমর্থন করতে হবে কারণ অন্তর্নির্মিত জাভা @SuppressWarnings
টীকাটি একটি SOURCE
ধারণার নীতি আছে যা ক্লাস ফাইলে যেখানে ফাইন্ডব্যাগগুলির এটির প্রয়োজন আছে টীকাটি ধরে রাখতে যথেষ্ট শক্তিশালী নয়। জাভা-র এনোটোটেশনের সাথে সংঘাত না এড়াতে আমি ফাইন্ডবাগস সতর্কতা দমনগুলিকে পুরোপুরি যোগ্য করে তুলেছি @SuppressWarnings
:
@edu.umd.cs.findbugs.annotations.SuppressWarnings("UWF_FIELD_NOT_INITIALIZED_IN_CONSTRUCTOR")
এই কৌশলগুলি সরঞ্জামগুলিতে জিনিসগুলিকে যথাযথভাবে সামঞ্জস্যপূর্ণ করে তোলে। মনে রাখবেন যে প্রতিটি সতর্কতা দমন স্ট্রিং থাকা " SuppressWarnings
" সম্পূর্ণ কোড বেসে সমস্ত সরঞ্জামের জন্য সমস্ত দৃষ্টান্ত খুঁজে পাওয়ার জন্য একটি সাধারণ অনুসন্ধান চালানো সহজ করে তোলে।