আপনি কীভাবে একটি ইন্টারফেস রূপান্তর ও সংস্করণ বিকাশ করতে পারেন?


22

বলুন আপনার একটি ইন্টারফেস রয়েছে IFoo:

public interface IFoo {
    void Bar(string s);
    int Quux(object o);
}

আপনার API এর 2 সংস্করণে, আপনাকে Glargএই ইন্টারফেসে একটি পদ্ধতি যুক্ত করতে হবে। আপনার বিদ্যমান এপিআই ব্যবহারকারীদের ভঙ্গ না করে এবং পিছনের সামঞ্জস্যতা বজায় না রেখে কীভাবে আপনি এটি করবেন? এটি মূলত। নেটকে লক্ষ্য করে তৈরি করা হয় তবে এটি অন্যান্য ফ্রেমওয়ার্ক এবং ভাষাতেও প্রয়োগ করতে পারে।


আপনি সমস্যা ছাড়াই যুক্ত করতে পারেন। সমস্যাগুলি তখনই আসে যখন আপনি ইতিমধ্যে উপস্থিত কিছু পরিবর্তন / মুছে ফেলবেন।
রিগ

1
@ রিগ: সি # কমপক্ষে, আপনি একটি সংকলন ত্রুটি পাবেন যদি আপনি কোনও ইন্টারফেসে কোনও পদ্ধতি যোগ করেন এবং সেই ইন্টারফেসটি কার্যকর করে এমন শ্রেণীর সাথে যুক্ত না করেন।
ম্যালিস

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

উত্তর:


9

আপনার API এর 2 সংস্করণে, আপনাকে Glargএই ইন্টারফেসে একটি পদ্ধতি যুক্ত করতে হবে।

কেন?

কোনও API এর সাথে ব্যবহারের জন্য সংজ্ঞায়িত ইন্টারফেসগুলির দুটি সম্পূর্ণ ভিন্ন ভূমিকা রয়েছে:

  1. নির্ভরতা বিপর্যয় - যেমন ইন্টারফেসগুলি আপনার এপিআই দ্বারা গ্রাস করা হয়। তারা ক্লায়েন্ট কোড প্লাগইন ইত্যাদি তৈরি করতে দেয়
  2. বিমূর্ততা - এই জাতীয় ইন্টারফেসগুলি আপনার এপিআই দ্বারা ফিরিয়ে দেওয়া হয় এবং প্রত্যাবর্তিত অবজেক্টগুলির বাস্তবায়ন বিবরণ গোপন করে।

এখন কোনও এপিআই-র দেওয়া সংস্করণের জন্য একই ইন্টারফেসটি উভয় হিসাবেই কাজ করতে পারে। তবুও, ভবিষ্যতের সংস্করণগুলিতে, এটি ডিকোপল করা যেতে পারে।

  1. আপনি যে ইন্টারফেসটি ব্যবহার করেন সেগুলি থেকে আপনি আরও তথ্য বের করতে চান। কর্মক্ষমতা বাড়াতে, বা নমনীয়তা বা যা কিছু যোগ করুন। একটি নতুন ইন্টারফেস সংজ্ঞায়িত করুন, সম্ভবত পুরানোটি থেকে উদ্ভূত হয়েছে এবং এটি গ্রহণের জন্য একটি পৃথক পদ্ধতি তৈরি করুন। বেশিরভাগ আফ্রিক। নেট ভাষাগুলি পদ্ধতির ওভারলোডিংকে মঞ্জুরি দেয়, তাই বেশি বিশৃঙ্খলা যুক্ত না করে এটি ঘটতে পারে।
  2. আপনি "আরও ফিরতে" চান, অর্থাত্ আপনার এপিআই থেকে "ধনী" অবজেক্টের বিমূর্ততা। এখানে আপনার দুটি পছন্দ রয়েছে:

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

      interface MyNewInterface extends MyOldInterface { 
           FancyNewInterface getFancyShit();
      }
      

15

ডাইরেক্টএক্স এর ইন্টারফেসগুলিতে সংস্করণ সংখ্যা যুক্ত করেছে। আপনার ক্ষেত্রে সমাধানটি এরকম কিছু হবে

public interface IFoo2 : IFoo
{
    void Glarg();
}

এআইপিআই এখনও আইএফও এবং আইএফওয়ুতে কেবলমাত্র পদ্ধতি ইত্যাদিতে উল্লেখ করবে যেখানে IFoo2 কার্যকারিতা প্রয়োজন।

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


3

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

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

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

যেহেতু আপনি। নেট সম্পর্কে জিজ্ঞাসা করেছেন আপনি বিশেষত আপনি । নেট এ অবচয় সম্পর্কে এই নিবন্ধটি পড়তে চাইতে পারেন , যা লিঙ্ক করে ObsoleteAttribute(নীচের উদাহরণে ব্যবহৃত):

using System;

public sealed class App {
   static void Main() {      
      // The line below causes the compiler to issue a warning:
      // 'App.SomeDeprecatedMethod()' is obsolete: 'Do not call this method.'
      SomeDeprecatedMethod();
   }

   // The method below is marked with the ObsoleteAttribute. 
   // Any code that attempts to call this method will get a warning.
   [Obsolete("Do not call this method.")]
   private static void SomeDeprecatedMethod() { }
}

2

পাবলিক ইন্টারফেস পরিবর্তনগুলি ভাঙ্গা জড়িত। সাধারণ কৌশলটি হ'ল এটি কেবল প্রধান সংস্করণগুলিতে এবং হিমায়িত সময়ের পরে (যাতে এটি ঝকঝকে হয় না)। আপনি যদি কোনও নতুন ইন্টারফেসে সংযোজন যুক্ত করে থাকেন (এবং আপনার বাস্তবায়ন একই শ্রেণিতে উভয়ই সরবরাহ করতে পারে) তবে আপনি আপনার ক্লায়েন্টদের ভঙ্গ না করে পালিয়ে যেতে পারেন। এটি আদর্শ নয়, এবং আপনি যদি এটি চালিয়ে যান তবে আপনার গোলযোগ হবে।

যদিও অন্যান্য ধরণের সংশোধন (পদ্ধতিগুলি সরিয়ে, স্বাক্ষর পরিবর্তন করা) সহ, আপনার আটকে আছে।


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

1

একটি ইন্টারফেস একটি চুক্তি, সুতরাং এটির সংস্করণ থাকা উচিত নয়। কোনও ফুটবল খেলোয়াড় নতুন চুক্তি পেলে কি হয়? পুরাতনটি কি এখনও বৈধ? যদি কেউ ইন্টারফেস পরিবর্তন করে তবে চুক্তি পরিবর্তন হয় এবং পূর্ববর্তী চুক্তি (ইন্টারফেস) আর বৈধ থাকে না।

যদিও আপনি IFoo2 কৌশল ব্যবহার করতে পারেন, শেষ পর্যন্ত তা অগোছালো হয়ে উঠবে যখন আপনি:

  • IFoo2
  • IFoo3
  • IFoo4
  • প্রভৃতি

ইশ।

একটি এপিআই আলাদা। আমি কোড লাইব্রেরি ব্যবহার করতে। পরের মাসে আমি আপনাকে একটি আপডেট লাইব্রেরি দেব। অন্য পোস্টার যেমন বলেছে, আমি ইতিমধ্যে যা ব্যবহার করছি তা ভঙ্গ করবেন না, কেবল নতুন কার্যকারিতা / পদ্ধতি যুক্ত করুন।

আপনি যদি কিছু সংস্করণ করতে চান তবে একটি ইন্টারফেসের পরিবর্তে একটি বিমূর্ত শ্রেণি ব্যবহার করুন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.