স্ট্যাটিক বিশ্লেষণ

স্ট্যাটিক অ্যানালাইসিস হল এমন এক ধরনের পরীক্ষা যা আপনার কোডটি আসলে এটি চালানো ছাড়াই বা একটি স্বয়ংক্রিয় পরীক্ষা না লিখে স্বয়ংক্রিয় পরীক্ষা প্রদান করে। আপনি সম্ভবত ইতিমধ্যেই এই ধরনের পরীক্ষা দেখেছেন যদি আপনি VSCode-এর মতো একটি IDE ব্যবহার করেন—TypeScript দ্বারা সম্পাদিত টাইপ চেকিং এক ধরনের স্ট্যাটিক বিশ্লেষণ, এবং এটি ত্রুটি বা সতর্কতার অধীনে স্কুইগ্লি লাইন হিসাবে দেখাতে পারে।

ইএসলিন্ট

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

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

  try {
    const result = await complexFetchFromNetwork();
    if (!result.ok) {
      throw new Error("failed to fetch");
    }
  } finally {
    // warning - this will 'overrule' the previous exception!
    return false;
  }

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

ESLint আপনাকে একটি নিয়ম ভঙ্গ করতে এবং "অনুমতিপ্রাপ্ত" হিসাবে কোড টীকা করতে দেয়। উদাহরণস্বরূপ, আপনি পূর্ববর্তী যুক্তিটিকে নিম্নরূপ টীকা দিয়ে অনুমতি দিতে পারেন:

  finally {
    // eslint-disable-next-line no-unsafe-finally
    return false;
  }

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

অবশেষে, একটি বৃহৎ কোডবেসে স্ট্যাটিক অ্যানালাইসিস টুলস সক্রিয় করা কোডের উপর অনেক অসহায় শব্দ (এবং রিফ্যাক্টরের কাজে ব্যস্ত) তৈরি করতে পারে যা অন্যথায় ভাল কাজ করে। সুতরাং একটি প্রকল্পের জীবনচক্রের প্রথম দিকে সক্ষম করা সহজ।

ব্রাউজার সমর্থনের জন্য ESLint প্লাগইন

আপনি ESLint-এ একটি প্লাগইন যোগ করতে পারেন যা API-এর ব্যবহারকে ফ্ল্যাগ করে যা ব্যাপকভাবে সমর্থিত নয়, বা আপনার টার্গেট ব্রাউজার তালিকা দ্বারা সমর্থিত নয়। eslint-plugin-compat প্যাকেজ আপনাকে সতর্ক করতে পারে যখন একটি API আপনার ব্যবহারকারীদের জন্য উপলব্ধ নাও হতে পারে, তাই আপনাকে ক্রমাগত নিজের জন্য ট্র্যাক রাখতে হবে না।

স্ট্যাটিক বিশ্লেষণের জন্য টাইপ চেকিং

জাভাস্ক্রিপ্ট শেখার সময়, নতুন বিকাশকারীরা সাধারণত এই ধারণার সাথে পরিচিত হয় যে এটি একটি দুর্বলভাবে টাইপ করা ভাষা। অর্থাৎ, একটি ভেরিয়েবলকে এক প্রকার হিসাবে ঘোষণা করা সম্ভব, তারপর সম্পূর্ণ ভিন্ন কিছুর জন্য একই অবস্থান ব্যবহার করুন। এটি পাইথন এবং অন্যান্য স্ক্রিপ্টিং ভাষার মতো, কিন্তু কম্পাইল করা ভাষা যেমন C/C++ এবং রাস্টের মতো নয়।

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

টাইপস্ক্রিপ্ট

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

একটি দ্রুত উদাহরণের জন্য, এই কোডটি, যা একটি string নাম এবং number বয়স গ্রহণ করে একটি কলব্যাক দেওয়া আশা করে:

const callback = (name: string, age: string): void => {
  console.info(name, 'is now', age, 'years old!');
};
onBirthday(callback);

TypeScript এর মাধ্যমে চালানোর সময়, অথবা এমনকি যখন একটি IDE-তে হোভার করা হয় তখন নিম্নলিখিত ত্রুটি তৈরি করে:

bad.ts:4:12 - error TS2345: Argument of type '(name: string, age: string) => void' is not assignable to parameter of type '(name: string, age: number) => void'.
  Types of parameters 'age' and 'age' are incompatible.
    Type 'number' is not assignable to type 'string'.

4 onBirthday(callback);
             ~~~~~~~~

Found 1 error in bad.ts:4
পূর্ববর্তী উদাহরণ থেকে কোড, একটি পপ-আপে প্রদর্শিত ত্রুটি বার্তা সহ একটি IDE-তে প্রদর্শিত হয়৷
VSCode নির্দেশ করে যে আপনি একটি ভুল টাইপ পাস করেছেন।

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

টাইপস্ক্রিপ্ট ব্যবহার করার সবচেয়ে চ্যালেঞ্জিং অংশ হল এটি সঠিকভাবে সেট আপ করা। প্রতিটি প্রজেক্টের জন্য একটি tsconfig.json ফাইলের প্রয়োজন হয়, যেটি প্রাথমিকভাবে tsc কমান্ড-লাইন টুল নিজেই ব্যবহার করে, ভিটেস্ট সহ অন্যান্য অনেক বিল্ড টুল এবং টুলিংয়ের সাথে VSCode-এর মতো IDE- দ্বারাও পড়া হয়। এই ফাইলটিতে শত শত বিকল্প এবং ফ্ল্যাগ রয়েছে এবং আপনি এখানে এটি সেট আপ করার জন্য কিছু ভাল সংস্থান খুঁজে পেতে পারেন:

সাধারণ টাইপস্ক্রিপ্ট টিপস

একটি tsconfig.json ফাইলের মাধ্যমে TypeScript সেট আপ এবং ব্যবহার করার সময়, নিম্নলিখিতগুলি মনে রাখবেন:

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

TypeScript যে কোন অন্তর্নিহিত

TypeScript এর সবচেয়ে শক্তিশালী এবং পুরস্কৃত কনফিগারেশন বিকল্পগুলির মধ্যে একটি হল noImplicitAny পতাকা। যাইহোক, এটি সক্রিয় করা সবচেয়ে কঠিন, বিশেষ করে যদি আপনার ইতিমধ্যেই একটি বড় কোডবেস থাকে। (আপনি যদি strict মোডে থাকেন তবে noImplicitAny পতাকাটি ডিফল্টরূপে সক্রিয় থাকে, তবে অন্যথায় নয়।)

এই পতাকাটি এই ফাংশনটিকে একটি ত্রুটি ফিরিয়ে দেবে:

export function fibonacci(n) {
  if (n <= 1) {
    return 0;
  } else if (n === 2) {
    return 1;
  }
  return fibonacci(n - 1) + fibonacci(n - 2);
}

যদিও, একজন পাঠক হিসাবে, এটা মোটামুটি পরিষ্কার যে n একটি সংখ্যা হওয়া উচিত, TypeScript আত্মবিশ্বাসের সাথে এটি নিশ্চিত করতে পারে না। আপনি যদি VSCode ব্যবহার করেন, ফাংশনের উপর ঘোরাফেরা করলে তা নিম্নরূপ বর্ণনা করবে:

function fibonacci(n: any): any

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

এখানে সহজ সমাধান হল n আর্গুমেন্ট এবং fibonacci রিটার্ন টাইপ উভয়কেই number হিসাবে চিহ্নিত করা।

noImplicitAny পতাকা আপনাকে আপনার কোডবেসে স্পষ্টভাবে any বাধা দেয় না। আপনি এখনও একটি ফাংশন লিখতে পারেন যা any ধরনের গ্রহণ করে বা ফেরত দেয়। এটা নিশ্চিত করে যে আপনি প্রতিটি ভেরিয়েবলকে একটি টাইপ দেন।