আমি নেট / সিএলআর, এবং বিশেষত এপিআই পরিবর্তন কীভাবে ক্লায়েন্ট অ্যাপ্লিকেশনগুলিকে ভেঙে দেয় না বা কীভাবে এপিআই পরিবর্তন করে তা সম্পর্কিত যতটা সম্ভব তথ্য সংগ্রহ করতে চাই। প্রথমে কিছু শর্ত সংজ্ঞায়িত করা যাক:
এপিআই পরিবর্তন - এর যে কোনও পাবলিক সদস্য সহ কোনও প্রকারের সর্বজনীনভাবে দৃশ্যমান সংজ্ঞায়িত পরিবর্তন। এর মধ্যে রয়েছে টাইপ এবং সদস্যের নাম পরিবর্তন করা, এক প্রকারের বেস টাইপ পরিবর্তন করা, কোনও প্রকারের প্রয়োগকৃত ইন্টারফেসের তালিকা থেকে ইন্টারফেস যুক্ত করা / অপসারণ, সদস্যদের যোগ করা / অপসারণ (ওভারলোড সহ), সদস্যের দৃশ্যমানতা পরিবর্তনকরণ, পদ্ধতি পরিবর্তনের পদ্ধতি এবং পরামিতি টাইপ করা, ডিফল্ট মান যুক্ত করা পদ্ধতির পরামিতিগুলির জন্য, প্রকার এবং সদস্যগুলিতে বৈশিষ্ট্যগুলি যুক্ত / অপসারণ এবং প্রকার এবং সদস্যগুলিতে জেনেরিক ধরণের পরামিতি যুক্ত / সরানো (আমি কি কিছু মিস করেছি?)। এটিতে সদস্য সংস্থাগুলিতে কোনও পরিবর্তন বা ব্যক্তিগত সদস্যদের কোনও পরিবর্তন অন্তর্ভুক্ত নয় (যেমন আমরা প্রতিচ্ছবিটিকে বিবেচনায় নিই না)।
বাইনারি-স্তরের বিরতি - এমন একটি এপিআই পরিবর্তন যা ক্লায়েন্ট অ্যাসেমব্লিতে ফলাফল দেয় যা এপিআই এর পুরানো সংস্করণের সাথে সংমিতিগতভাবে নতুন সংস্করণে লোড হচ্ছে না। উদাহরণ: পরিবর্তিত পদ্ধতি স্বাক্ষর, এমনকি যদি এটি পূর্বের মতো একইভাবে কল করতে দেয় (যেমন: টাইপ / প্যারামিটারের ডিফল্ট মানগুলি ওভারলোডকে বাতিল করতে হবে)।
উত্স-স্তরের বিরতি - একটি এপিআই পরিবর্তন যা এপিআই - র পুরানো সংস্করণের সাথে সংকলন করার জন্য বিদ্যমান কোডের ফলস্বরূপ নতুন সংস্করণটি সংকলন করে না results ইতিমধ্যে সংকলিত ক্লায়েন্ট অ্যাসেমব্লিগুলি আগের মতোই কাজ করে। উদাহরণ: একটি নতুন ওভারলোড যুক্ত করা যা পদ্ধতি কলগুলিতে দ্ব্যর্থহীনতার ফলস্বরূপ হতে পারে যা পূর্ববর্তীগুলিতে দ্ব্যর্থহীন ছিল।
উত্স-স্তরের শান্ত শব্দার্থবিজ্ঞানের পরিবর্তন - একটি এপিআই পরিবর্তন যা এপিআই-র পুরানো সংস্করণের বিরুদ্ধে সংকলন করার জন্য বিদ্যমান কোডের ফলাফল হিসাবে নিঃশব্দে এর শব্দার্থবিজ্ঞান পরিবর্তন করে, যেমন একটি ভিন্ন পদ্ধতি কল করে। কোডটি তবে কোনও সতর্কতা / ত্রুটি সহ সংকলন চালিয়ে যাওয়া উচিত এবং পূর্বে সংকলিত সমাবেশগুলি আগের মতো কাজ করা উচিত। উদাহরণ: বিদ্যমান শ্রেণিতে একটি নতুন ইন্টারফেস বাস্তবায়ন করা হচ্ছে যার ফলে ওভারলোড রেজোলিউশনের সময় আলাদা ওভারলোড চয়ন করা হয়।
চূড়ান্ত লক্ষ্যটি হ'ল যথাসম্ভব ব্রেকিং এবং সিমেন্টিক্স এপিআই পরিবর্তনগুলি ক্যাটালগাইজ করা, এবং ভাঙ্গনের সঠিক প্রভাব বর্ণনা করা, এবং কোন ভাষাগুলি এটির দ্বারা প্রভাবিত হয় না। পরবর্তীকালে প্রসারিত করার জন্য: কিছু পরিবর্তন সর্বজনীনভাবে সমস্ত ভাষাকে প্রভাবিত করে (উদাহরণস্বরূপ কোনও ইন্টারফেসে নতুন সদস্য যুক্ত করা কোনও ভাষার ক্ষেত্রে সেই ইন্টারফেসের বাস্তবায়নকে ভেঙে ফেলবে), কিছুটা বিরতি পেতে খেলায় প্রবেশের জন্য খুব নির্দিষ্ট ভাষার শব্দার্থবিজ্ঞানের প্রয়োজন হয়। এটিতে সাধারণত পদ্ধতি ওভারলোডিং এবং সাধারণভাবে অন্তর্নিহিত ধরণের রূপান্তরগুলির সাথে সম্পর্কিত কিছু অন্তর্ভুক্ত। এখানে "সর্বনিম্ন সাধারণ ডিনোমিনেটর" সংজ্ঞায়নের কোনও উপায় নেই বলে মনে হচ্ছে এমনকি সিএলএস-কনফর্মেন্ট ভাষাগুলির জন্য (যেমন সিএলআই স্পেসে বর্ণিত কমপক্ষে "সিএলএস গ্রাহক" এর নিয়ম মেনে চলা) - যদিও আমি ' এখানে কেউ যদি আমাকে ভুল হিসাবে সংশোধন করে তবে আমি প্রশংসা করব - সুতরাং এটি ভাষাতে ভাষাতে যেতে হবে। সর্বাধিক আগ্রহের বিষয়গুলি হ'ল স্বাভাবিকভাবেই। নেট থেকে বাক্সটি আসে: সি #, ভিবি এবং এফ #; তবে অন্যান্য, যেমন আয়রন পাইথন, আয়রণরবি, ডেল্ফি প্রিজম ইত্যাদি প্রাসঙ্গিক। এটি কর্নারের ক্ষেত্রে যত বেশি হবে তত বেশি আকর্ষণীয় হবে - সদস্যদের অপসারণ করার মতো জিনিসগুলি বেশ স্ব-স্পষ্ট, তবে পদ্ধতি ওভারলোডিং, alচ্ছিক / ডিফল্ট প্যারামিটারগুলি, ল্যাম্বডা টাইপের অনুক্রম এবং রূপান্তর অপারেটরগুলির মধ্যে সূক্ষ্ম মিথস্ক্রিয়াগুলি খুব আশ্চর্যজনক হতে পারে সময়ে
এটিকে কিক স্টার্ট করার কয়েকটি উদাহরণ:
নতুন পদ্ধতির ওভারলোডগুলি যুক্ত করা হচ্ছে
দয়া করে: উত্স-স্তরের বিরতি
ভাষাগুলি প্রভাবিত: সি #, ভিবি, এফ #
পরিবর্তনের আগে এপিআই:
public class Foo
{
public void Bar(IEnumerable x);
}
পরিবর্তনের পরে এপিআই:
public class Foo
{
public void Bar(IEnumerable x);
public void Bar(ICloneable x);
}
পরিবর্তনের আগে কাজ করার নমুনা ক্লায়েন্ট কোড এবং এর পরে ভেঙে গেছে:
new Foo().Bar(new int[0]);
নতুন অন্তর্ভুক্ত রূপান্তর অপারেটর ওভারলোডগুলি যুক্ত করা হচ্ছে
দয়া করে: উত্স-স্তরের বিরতি।
ভাষাগুলি প্রভাবিত: সি #, ভিবি
ভাষা প্রভাবিত হয় না: F #
পরিবর্তনের আগে এপিআই:
public class Foo
{
public static implicit operator int ();
}
পরিবর্তনের পরে এপিআই:
public class Foo
{
public static implicit operator int ();
public static implicit operator float ();
}
পরিবর্তনের আগে কাজ করার নমুনা ক্লায়েন্ট কোড এবং এর পরে ভেঙে গেছে:
void Bar(int x);
void Bar(float x);
Bar(new Foo());
নোটস: এফ # টি ভাঙ্গা হয়নি, কারণ এতে ওভারলোডেড অপারেটরগুলির জন্য কোনও ভাষা স্তরের সমর্থন নেই, সুস্পষ্ট বা অন্তর্নিহিতও নয় - উভয়ই সরাসরি op_Explicit
এবং op_Implicit
পদ্ধতি হিসাবে কল করতে হবে ।
নতুন উদাহরণ পদ্ধতি যুক্ত করা হচ্ছে
দয়া করে: উত্স-স্তরের শান্ত শব্দার্থবিজ্ঞানের পরিবর্তন।
ভাষাগুলি প্রভাবিত: সি #, ভিবি
ভাষা প্রভাবিত হয় না: F #
পরিবর্তনের আগে এপিআই:
public class Foo
{
}
পরিবর্তনের পরে এপিআই:
public class Foo
{
public void Bar();
}
নমুনা ক্লায়েন্ট কোড যা একটি শান্ত শব্দার্থবিজ্ঞানের পরিবর্তনে ভোগ করে:
public static class FooExtensions
{
public void Bar(this Foo foo);
}
new Foo().Bar();
নোটস: এফ # টি ভাঙ্গা হয়নি, কারণ এটির জন্য ভাষা স্তর সমর্থন নেই ExtensionMethodAttribute
, এবং সিএলএস এক্সটেনশন পদ্ধতিগুলি স্ট্যাটিক পদ্ধতি হিসাবে ডাকা প্রয়োজন।