একটি গুরুত্বপূর্ণ বাগ ঠিক করার সময় অর্থপূর্ণ সংস্করণ


18

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

আমি যে পরিবর্তনটি করতে চাই তা পুনরায় আবর্তকগুলি কীভাবে ব্যবহৃত হয় তা ঘুরিয়ে দেয়। বর্তমানে ব্যবহারকারীদের এটি করতে হবে:

while ($element = $iterator->next()) {
   // ...
}

যা ভুল, কমপক্ষে পিএইচপি এর নেটিভ ইটারেটর ইন্টারফেসে । আমি এটি দিয়ে প্রতিস্থাপন করতে চাই:

while ($iterator->valid()) {
   $element = $iterator->current();
   // ...
   $iterator->next();
}

যা অনুরূপ:

foreach ($iterator as $element) {
    // ...
}

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

আমার শেষ পর্যন্ত ২.০.০ প্রকাশ করার পরিকল্পনা আছে তবে আমি ভেবেছিলাম এটি তখন ছিল যখন আপনি গ্রন্থাগারটি পুরোপুরি নতুন করে লিখেছেন এবং অসংখ্য পাবলিক এপিআই পরিবর্তনগুলি প্রয়োগ করেছেন । এই রিফ্যাক্টরিংয়ের ভূমিকাটি কি কোনও বড় সংস্করণ প্রকাশের ওয়ারেন্ট দেয়? আমি এটি সত্যিই দেখতে পারি না - আমি এটি 1.8.0 বা 1.7.4 হিসাবে প্রকাশ করতে আরও স্বাচ্ছন্দ্য বোধ করি। কারও কি কিছু পরামর্শ আছে?


পিছনে সামঞ্জস্য রাখতে আপনাকে কী বাধা দেয়?
mouviciel

এই মুহুর্তে, next()পদ্ধতিটি বর্তমান উপাদানটি পুনরুদ্ধার করতে এবং অভ্যন্তরীণ পয়েন্টারটিকে এগিয়ে নিয়ে যেতে ব্যবহৃত হয়। যা ভুল। next()পয়েন্টারটি সরানো উচিত এবং current()এটি পুনরুদ্ধার করতে ব্যবহৃত হয় ...
hhner

6
সুতরাং নতুন সংস্করণে লোকেরা next()কেবলমাত্র পয়েন্টারটি সরিয়ে দেয় তার মূল্যের মূল্য সম্পর্কে চিন্তা করা উচিত নয় , এটি সত্যিই সামঞ্জস্যতা ভঙ্গ করে না
রাচেট ফ্রিক

উত্তর:


29

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

  • শব্দার্থক সংস্করণে আটকে থাকুন এবং আপনাকে সংস্করণ নম্বরটি 2.0.0 এ পরিবর্তন করতে হবে এই সত্যের সাথে বাঁচুন
  • আপনার সংস্করণ স্কিমটি 4 সংখ্যায় পরিবর্তন করুন। "১.১..7.৩" এখন আপনার সংস্করণ, এপিআই পরিবর্তন করার পরের "1.2.0.0" এবং "সম্পূর্ণ নতুন 2.x পণ্য পরিবারের" প্রথম "2.0.০.০"
  • আপনার ফিক্সটি পিছনের দিকে সামঞ্জস্যপূর্ণ করুন (সুতরাং এর কার্যকারিতা পরিবর্তন করবেন না next, কেবলমাত্র validএবং currentকার্যগুলি যুক্ত করুন)। তারপরে আপনি পরবর্তী সংস্করণ নম্বর হিসাবে "1.8.0" ব্যবহার করতে পারেন। আপনি যদি মনে করেন যে আচরণের পরিবর্তনটি nextসত্যিই গুরুত্বপূর্ণ, এটি 2.0.০.০ এ করুন।

শেষ বিকল্পটি যতটা নিখুঁত সমাধান হবে: আপনি next()যা করছেন এটি করা চালিয়ে যেতে বলতে পারবেন না । কার্যকারিতাটি সঠিকভাবে প্রয়োগ করতে, এটি আলাদাভাবে কিছু করতে হবে। সুতরাং যদি আমি এটিকে পিছনের দিকে সামঞ্জস্যপূর্ণ করি - নতুন কার্যকারিতা / ফিক্সটিও ভুল হবে এবং পরিবর্তনের পুরো পয়েন্টটি হ্রাস করবে।
হোমনার

2
আপনার তৃতীয় বুলেটটিতে আপনি যে বিস্তৃত পরামর্শটি দিয়েছেন (এটি পিছনের দিকে সামঞ্জস্যপূর্ণ করা) এটি বিবেচনা করার জন্য ভাল। এই বিশেষ ক্ষেত্রে এটি কাজ নাও করতে পারে, তবে সামগ্রিক কৌশলটি বিবেচনার জন্য। ফাংশনটি আরও জটিল হয়ে ওঠে তবে এটি একটি কার্যক্ষম রাস্তা হতে পারে।

সকলকে ধন্যবাদ: আমি যদি দু'জনকে গ্রহণ করতে পারি তবে আমি তা করতাম। next()সমস্ত নতুন কার্যকারিতা করার জন্য আমি নতুন পদ্ধতি হ্যাক করে শেষ করেছি , এর সাথে পিছনের দিকে সামঞ্জস্যপূর্ণ করার জন্য যা প্রয়োজন ছিল। এটির মতো নতুন কার্যকারিতা নষ্ট করে দেওয়া এক ধরণের ভয়ঙ্কর বোধ করে তবে ওহে হো।
হোমনার

10
@ হোহনার: তারপরে এখন পুরানো আচরণকে অবহিত হিসাবে নথিভুক্ত করারও সময় এসেছে, সুতরাং আপনি এটি ২.০.০ এ মুছে ফেলতে পারেন।
জান ফ্যাব্রি

7

শব্দার্থক সংস্করণে টমের গাইডের সাথে লেগে থাকুন।

পাবলিক এপিআই-তে যে কোনও উল্লেখযোগ্য পরিবর্তন অবশ্যই দুটি পয়েন্টের যে কোনও ক্ষেত্রে করা উচিত :

  1. না
  2. একটি বড় রিলিজ আপডেটে

আমার ভোট, যাইহোক, প্রথম জন্য। তবে আমি স্বীকার করি এটি কেবল ছোট ছোট জিনিসগুলির জন্য উপযুক্ত।

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

সংক্ষেপে, আপনি আপনার ব্যবহারকারীদের যারা এই পরিবর্তন সম্পর্কে জানেন না তাদের জন্য একটি সূচক ত্রুটি তৈরি করছেন। এই জাতীয় পরিবর্তনের জন্য আপনার সমস্ত ব্যবহারকারীকে নিম্নলিখিতটি করতে বাধ্য করা:

  1. নতুন পদ্ধতির ব্যবহারের জন্য কোডটি ঠিক করুন
  2. ফিক্সটি বৈধ করুন এবং নিশ্চিত করুন যে এটি কোনও কিছু না ভেঙেছে
  3. তাদের শেষ ব্যবহারকারীদের কাছে তাদের পণ্যের নতুন প্রকাশনা প্রেরণ করুন

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

এই ছোট্ট কিছুটির জন্য, আমি এটি যেতে দেব এবং এটির সাথে বিরক্ত করবেন না।
যদি এটি সত্যিই আপনাকে বিরক্ত করে (যা দৃশ্যত তা করে বা আপনি জিজ্ঞাসা করেননি) তবে আমি নিম্নলিখিতটি করবো।

  1. আপনার কোড ট্রিতে v2.0.0 শাখা তৈরি করুন
  2. V2.0.0 শাখায় প্রথম অবদান রাখুন, যা এই পরিবর্তন
  3. Release Notesসময়টি সম্প্রচারের আগে পূর্বরূপ পাঠান যে পরিবর্তন আসছে is

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


বিকল্প সমাধান হ'ল একটি নতুন ফাংশন যুক্ত করা যা আপনি যেভাবে চান সেভাবে কাজ করে।

আপনার যদি তা থাকে foo()তবে আপনি সমাধানটি সরবরাহ করতে তৈরি করবেন fooCorrect()তবে পুরোপুরি সামঞ্জস্যতা সম্পূর্ণরূপে সংরক্ষণ করবেন। এবং কোনও সময়ে আপনি foo()অন্যকে এটি ব্যবহার না করার জন্য অবহিত করতে পারেন।

চ্যালেঞ্জ যে আপনি পাবেন আছে অন্য কিছু মধ্যে fooCorrect()যা প্রয়োজনীয়তা এটা আপডেট করে আপনাকে দিয়ে শেষ fooCorrectedCorrect()অথবা অন্য কোনো নিরীহ আজেবাজে কথা।

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

তবে এটি ছোট কিছু বিবেচনা করার জন্য "সর্বনিম্ন খারাপ" পদ্ধতির হতে পারে।


আমি আপনার সাথে একমত. আমার যে সমস্যার মুখোমুখি হচ্ছে তা হ'ল আমি v2.0.0 এর জন্য লাইব্রেরিটি পুরোপুরি আবার লিখতে চাই (কারণ এই সমস্যাগুলির অনেকগুলি সমাধান করা দরকার); সুতরাং আমি চাই না যে এই বড় পরিবর্তনের ভিত্তিটি পুনরাবৃত্তকারীগুলির মতো ছোট্ট একটি পরিবর্তন করুন। সুতরাং আমার বিকল্পগুলি হ'ল: এই বাগটি উপেক্ষা করুন, বা বাগটি ঠিক করুন এবং এটিকে একটি নতুন বড় সংস্করণে রেখেছেন?
হোমনার

@ হোহনার - নতুন ফাংশন তৈরির সাথে বিকল্প পদ্ধতির সরবরাহ করার জন্য আপডেট হওয়া উত্তর। কর যে নতুন, একই নামের ফাংশন প্রচুর প্রায় এপিআই নিজেই পরিবর্তন হিসাবে খারাপ হিসাবে।

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

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

1
@ ফোশি আপনি স্পট করেছেন - আমি এখন সম্পূর্ণ সম্মত agree এখন এটি চেষ্টা করার এবং অসম্ভবকে কোড করার সময় হয়েছে: ডি
হোনার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.