واسطههای توسعه کاربری (API -ها) روشی برای عرضه خدمات به مشتریان هستند و عموما توسط interface -ها عرضه میشوند؛ معمولا در طول زمان این API -ها نیازمند تغییر و اضافهکردن سرویسهای جدید هستند؛ این تغییرات (versioning) اگر به دقت اعمال نشوند، ممکن است باعث شکست برنامه شوند. در این مقاله به نحو آپگرید اینترفیسها در جاوا میپردازیم.
فرض کنید در حال توسعه اینترفیسی (interface) به نام `DoIt` هستید:
public interface DoIt { void doSomething(int i, double x); int doSomethingElse(String s); }
مشتریها اینترفیس شما را پیادهسازی میکنند و شما داخل برنامهتون با فراخوانی متدهای اینترفیس ازشون سرویس میگیرید (یا بهشون سرویس میدین). بعد از مدتی ممکنه شما نیاز داشته باشید یه متد سومی هم به اینترفیستون اضافه کنید:
public interface DoIt { void doSomething(int i, double x); int doSomethingElse(String s); boolean didItWork(int i, double x, String s); }
اگه شما چنین تغییری رو انجام بدید، همه کلاسهایی که اینترفیس قدیمی DoIt رو پیادهسازی کردهاند، شکست میخورن چون متد سوم رو پیادهسازی نکردهاند. اینجاست که صدای مخالفتها بلند میشه.
سعی کنید از ابتدا تمام کاربریهای اینترفیس خودتون رو پیشبینی کنید یا مثل شطرنجبازها اقلا یکی دو گام بعدی رو. حالا اگه بخواهید متدهای جدیدی به اینترفیستون اضافه کنید چندتا آپشن دارید:
شما میتونید یه اینترفیس جدید به اسم DoItPlus ایجادکنید که از DoIt ارث میبره و متدهای جدید رو به این اینترفیس اضافهکنید:
public interface DoItPlus extends DoIt { boolean didItWork(int i, double x, String s); }
حالا کاربران کدتون (اینترفیس) میتونن تصمیمبگسرن که با اینترفیس قدیمی ادامهبدن یا سرویسهاشون رو آپگرید کنند به اینترفیس جدید.
راه دیگه اینکه شما متدهای جدیدتون رو به عنوان default method تعریف کنید. در مثال زیر یک دیفالت متد به نام didItWork تعریفشده:
public interface DoIt { void doSomething(int i, double x); int doSomethingElse(String s); default boolean didItWork(int i, double x, String s) { // Method body } }
نکتهای که وجود دارد اینکه شما باید متدهای دیفالت را پیادهسازی کنید.
روش دیگری که وجود دارد، تعریف متدهای استاتیک در اینترفیس موجود است. نکته حائز اهمیت اینکه، وقتی متدهای دیفالت یا استاتیک به اینترفیس اضافه میشوند، کاربرانی که قبلا این اینترفیس را در کلاسهایشان پیادهسازی کردهاند مجبور نیستند کلاسهای خود را تغییر داده یا مجدداً کامپایل کنند تا متدهای اضافهشده را در خود جای دهند.