সংস্করণ API গুলি


9

মনে করুন যে আপনার কাছে একটি এপিআই বেস দ্বারা সমর্থিত একটি বড় প্রকল্প রয়েছে। প্রকল্পটি এমন একটি সর্বজনীন এপিআইও প্রেরণ করে যা শেষ (ইশ) ব্যবহারকারীরা ব্যবহার করতে পারেন।

কখনও কখনও আপনার প্রকল্পটি সমর্থন করে এমন API বেসে আপনাকে পরিবর্তন করতে হবে। উদাহরণস্বরূপ, আপনাকে এমন একটি বৈশিষ্ট্য যুক্ত করতে হবে যা এপিআই পরিবর্তন প্রয়োজন, একটি নতুন পদ্ধতি প্রয়োজন, বা যে কোনও একটিতে পরিবর্তিত হওয়া দরকার, বা objects অবজেক্টগুলির মধ্যে একটির ফর্ম্যাট, যা এপিআইতে বা পাস করেছে।

ধরে নিই যে আপনি এই জিনিসগুলি আপনার সার্বজনীন এপিআইতেও ব্যবহার করছেন, পাবলিক অবজেক্টগুলি আপনি যে কোনও সময় এটি পরিবর্তন করবেন, এটি অনাকাঙ্ক্ষিত কারণ আপনার ক্লায়েন্টরা তাদের পার্সিং কোডটি কাজ করার জন্য একইরকম এআইপিআই বস্তুর উপর নির্ভর করতে পারে। (কাশি সি ++ ডাব্লুএসডিএল ক্লায়েন্ট ...)

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

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

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


1
I don't see a good way to do that without duplicating code- আপনার নতুন এপিআই সর্বদা আপনার পুরানো এপিআইতে পদ্ধতিগুলি কল করতে পারে বা এর বিপরীতে।
রবার্ট হার্ভে

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

এর জন্য কি কোনও নির্দিষ্ট প্ল্যাটফর্ম / প্রসঙ্গ আছে? (যেমন, ডিএলএল এর, একটি রেস্ট এপিআই, ইত্যাদি)
গ্র্যান্ডমাস্টারবি

। নেট, এমভিসি এবং ওয়েবফর্মগুলি ইউআই, dll ক্লাস সহ। আমাদের একটি বিশ্রাম এবং সাবান API উভয়ই রয়েছে।
কেস

উত্তর:


6

তৃতীয় পক্ষের দ্বারা ব্যবহৃত একটি এপিআই বজায় রাখার সময় আপনার পরিবর্তন করা দরকার এটি অনিবার্য। জটিলতার স্তরটি ঘটে যাওয়া পরিবর্তনের ধরণের উপর নির্ভর করবে। এগুলিই মূল পরিস্থিতিতে আসে:

  1. বিদ্যমান কার্যত API এ নতুন কার্যকারিতা যুক্ত হয়েছে Added
  2. পুরানো কার্যকারিতা API থেকে বঞ্চিত
  3. কোনওভাবেই এপিআই-তে পরিবর্তনশীল বিদ্যমান কার্যকারিতা

বিদ্যমান কার্যত API এ নতুন কার্যকারিতা যুক্ত করা ing

এটি সমর্থন করা সহজতম দৃশ্য। একটি এপিআইতে নতুন পদ্ধতি যুক্ত করার জন্য বিদ্যমান ক্লায়েন্টগুলিতে কোনও পরিবর্তন প্রয়োজন হবে না। এটি বিদ্যমান ক্লায়েন্টের জন্য কোনও আপডেট নেই বলে নতুন কার্যকারিতা প্রয়োজন এমন ক্লায়েন্টদের জন্য মোতায়েন করা এটি নিরাপদ client

পুরানো কার্যকারিতা API থেকে বঞ্চিত

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

কোনওভাবেই এপিআই-তে পরিবর্তনশীল বিদ্যমান কার্যকারিতা

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

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

অন্যান্য চিন্তা

Rather, the API is likely to extend the private objects we are using for our base API, but then we run into the same problem because added properties would also be available in the public API when they are not supposed to be.

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

The problem is more that it seems like many or most changes require breaking the public API if the objects aren't more separated, but I don't see a good way to do that without duplicating code.

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

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

উদাহরণ

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


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

1
আমি "আমার মাথার উপরে বন্ধ কোনো ভালো উদাহরণ সচেতন নয় মি যদি আমি কিছু সময় এই সপ্তাহান্তে আছে আমি দেখানোর জন্য এই জিনিস কিছু কিভাবে বাস্তবায়িত করা যায়নি GitHub থেকে নিক্ষেপ করা একটি পরীক্ষা অ্যাপ্লিকেশন তৈরি করতে
ফিল প্যাটারসন

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

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