নির্দিষ্ট শর্তে প্রোগ্রামারদের মনোযোগ কীভাবে আঁকবেন?


13

একটি উদাহরণ দিয়ে শুরু করা যাক।

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

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

আমার দুটি ধারণা আছে তবে দুজনেরই ত্রুটি রয়েছে।

স্মার্ট "সমস্ত পড়ুন" র‍্যাপার

আমি স্মার্ট মোড়ক তৈরি করতে পারি যা নিশ্চিত করে যে সমস্ত ডেটা স্পষ্টভাবে পড়ছে।

এটার মতো কিছু:

def export():
    checker = AllReadChecker.new(table_row)

    name    = checker.get('name')
    surname = checker.get('surname')
              checker.ignore('age') # explicitly ignore the "age" field

    result = [name, surname] # or whatever

    checker.check_now() # check all is read

    return result

সুতরাং, checkerজোর করে বলা হয়েছে table_rowযে অন্য ক্ষেত্রগুলি পড়েনি। তবে এই সমস্ত জিনিস একরকম ভারী দেখায় এবং (সম্ভবত) পারফমেন্সকে প্রভাবিত করে।

" সেই পদ্ধতিটি পরীক্ষা করুন " ইউনিটেস্ট

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

আমার কয়েকটি অন্যান্য ধারণা আছে তবে সেগুলি বাস্তবায়ন করতে খুব অসুবিধাগ্রস্ত বা বোঝা খুব কঠিন (এবং আমি চাই না যে প্রকল্পটি ধাঁধা হয়ে উঠুক)।


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


আপনি কি exportস্কিমার ভিত্তিতে তৈরি করতে পারেন ?
coredump

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

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

আপনি কি একটি পরীক্ষা স্বয়ংক্রিয়ভাবে তৈরি করতে পারেন যদিও এটি যাচাই করে যে exportআপনার বাস্তবসম্মতভাবে প্রয়োজনীয় সমস্ত কিছু আছে কিনা ?
বিজিক্লপ

1
সোর্স কোডে একটি মন্তব্য খুব সরল একটি সমাধান? কোনও বিষয় অনুস্মারক না থাকায় সাধারণত জিনিসগুলি মিস হয়ে যায়, একটি মন্তব্য এটি ঠিক করে দেবে।
gbjbaanb

উত্তর:


11

আপনি নিজের ইউনিট পরীক্ষা ধারণাটি নিয়ে সঠিক পথে রয়েছেন, তবে আপনার প্রয়োগটি ভুল।

যদি exportস্কিমার সাথে সম্পর্কিত হয় এবং স্কিমা পরিবর্তিত হয়, তবে দুটি সম্ভাব্য কেস রয়েছে:

  • হয় exportএখনও পুরোপুরি ভাল কাজ করে, কারণ এটি স্কিমায় সামান্য পরিবর্তন দ্বারা প্রভাবিত হয়েছিল,

  • অথবা এটি ভেঙে যায়।

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

আপনার বাস্তবায়ন কেন ভুল? ভাল, বিভিন্ন কারণে।

  1. ইউনিট পরীক্ষার সাথে এর কোনও যোগসূত্র নেই ...

  2. ... এবং, আসলে, এটি একটি পরীক্ষাও নয়।

  3. সবচেয়ে খারাপ দিকটি হ'ল "পরীক্ষা" ঠিক করার দরকার, ভাল, আসলে "পরীক্ষা" পরিবর্তন করা, এটি একটি অপারেশন করছে যা সম্পূর্ণরূপে সম্পর্কিত নয় export

পরিবর্তে, exportপদ্ধতির প্রকৃত পরীক্ষা করে , আপনি নিশ্চিত হন যে বিকাশকারী এটি ঠিক করে দেবে export


আরও সাধারণভাবে, আপনি যখন এমন পরিস্থিতির মুখোমুখি হন যেখানে সর্বদা এক শ্রেণিতে পরিবর্তন বা সাধারণত সম্পূর্ণ ভিন্ন শ্রেণীর পরিবর্তনের প্রয়োজন হয়, এটি একটি ভাল লক্ষণ যে আপনি নিজের নকশাটি ভুল করেছেন এবং একক দায়িত্বের নীতি লঙ্ঘন করছেন।

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

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

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

সব ক্ষেত্রে, কেবল মন্তব্যে এ জাতীয় ক্ষেত্রে নির্ভর করা এড়াতে হবে। কিছুটা এইরকম:

// If you change the following line, make sure you also change the corresponding
// `measure` value in `Scaffolding.Builder`.

কখনও কাজ করে না। কেবল বিকাশকারীরা এটি বেশিরভাগ ক্ষেত্রেই পড়বেন না, তবে এটি প্রায়শই সরানো বা সম্পর্কিত লাইন থেকে অনেক দূরে সরে যাবে এবং এটি বোঝা অসম্ভব হয়ে উঠবে।


হ্যাঁ, এই "পরীক্ষা" আসলেই কোনও পরীক্ষা নয়, এটি কোনও ধরণের ফাঁদ, এক ধরণের If you change the following line...যা স্বয়ংক্রিয়ভাবে কাজ করে এবং সরল উপেক্ষা করা যায় না। সন্দেহের কারণ আমি কখনও কখনও কখনও এই ধরণের ফাঁদ ব্যবহার করতে দেখিনি।
ভাদিম পুষতায়েভ

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

@ ভাদিমপুষতায়েভ: যখন পরীক্ষার বিষয়টি আসে তখন "সম্ভবত ভুলভাবে কাজ শুরু করা" এবং "কাজ করা থামিয়ে দেওয়া" ঠিক একই জিনিস। আপনি ভবিষ্যতের ভবিষ্যদ্বাণী করতে পারবেন না, তবে আপনার প্রয়োজনীয়তাগুলি সঠিকভাবে জানতে সক্ষম হওয়া উচিত এবং এটি পরীক্ষা করা উচিত যে আপনার প্রয়োজনীয় পণ্যগুলি আপনার প্রয়োজনীয় পণ্যগুলি পূরণ করেছে।
আর্সেনী মোরজেঙ্কো

হ্যাঁ, এটি একটি জিনিস। আমি আসলে বিকাশকারীকে নতুন প্রয়োজনীয়তা সম্পর্কে ভাবার জন্য মনে করিয়ে দিতে চাই । আমি কেবল একটি হাত waveেউ করতে চাই: "হ্যালো, আপনি কি নিশ্চিত যে আপনি রফতানির কথা ভুলে যাবেন না? ম্যানেজারকে জিজ্ঞাসা করুন বা কিছু, এটি একটি সাধারণ সমস্যা ”।
ভাদিম পুষতায়েভ

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

3

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

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

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

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

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


2

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


এটি যাচাই করতে পারে যে প্রতিটি বস্তু সংরক্ষণ করা হয় এবং ডিবি থেকে পুনরায় লোড করা হয়। এটি বিদ্যমান ডিবি-ফিল্ডের কোনও সম্পর্কিত অবজেক্ট ক্ষেত্রের ক্ষেত্রে কেসটি কভার করে না।
বি

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