Ko'p dastur muhiti bilan ishlash

Bizning firma birinchi navbatda Java-da rivojlanadi va bir-biri bilan birgalikda mos yozuvlar ma'lumotlariga va raqamlarga bog'liq bo'lgan bir qator "jonli" tizimlarni (asosan, uzoq davom etadigan server jarayoni) qo'llab-quvvatlaydi. Vaqti-vaqti bilan enum ta'rifi yangi qiymatni o'z ichiga oladi va bu holatda, biz ushbu dasturda mavjud bo'lgan barcha ilovalarni qayta joylashtirishga harakat qilamiz, sababi bizning ilovalarimizdagi barcha kutubxona kavanozlarini (" shu jumladan "enum entity" kutubxonasi). Shubhasiz, bu juda yoqimsiz, shuning uchun men boshqa odamlarning tavsiyalarini yoki yondashuvlarini tinglashni xohlayman.

Fikrlarim:

  1. Eng yangi "enum shaxs" kutubxonasi versiyasini olish va jar faylini classpathga kiritish uchun har bir ilovaning dastlabki skriptini o'zgartirish.
  2. dinamik ravishda sinash uchun mexanizmning ba'zi turlari yangi enum ta'rifini ish vaqtida yuklaydi.

Ushbu yondashuvlar bilan bog'liq muammo odatda formatda kodlarga ega:

switch(enumVal) {
  case A:
   //Do something.
    break;
  case B:
   //Do something.
    break;
  default:
    throw new IllegalArgumentException("Invalid enum value: " + enumVal);
}

... va shuning uchun ular odatiy holatda urishganda muvaffaqiyatsiz boshlanadi. Ehtimol, bu narsa, bu narsalarning umuman enumsuz bo'lishi kerakligini ko'rsatadi; Bu bizning ishimizda chindan ham qulaylik. Yoki, ehtimol, bizning ilovalarimiz juda mo'rt va shubhali holatda yanada nozik ishlarni bajarishi kerakligini ko'rsatadi.

3
Sizning App dizayningizni qayta ko'rib chiqishingiz kerak deb o'ylayman. Yodingizda tuting: nimani o'zgartirsa, shu jumladan.
qo'shib qo'ydi muallif Mister Smith, manba
Qo'shimchalar vaqtni sobit kompilyatsiya qilish. Shuning uchun qayta boshlash etarli emas. Siz enumda biror narsani o'zgartirsangiz, ularni ishlatadigan barcha sinflarni qayta kompilyatsiya qilishingiz kerak.
qo'shib qo'ydi muallif ssedano, manba
@Udo Fholl: Juda to'g'ri emas, chunki Java (faqat kechikish) vaqtida va faqat ism-sharifda bajaradi. Agar faqat yangi elementlar har qanday sinf fayliga (ko'rinadigan interfeysga) qo'shilsa, mavjud kodni qayta kompilyatsiya qilish kerak emas.
qo'shib qo'ydi muallif JimmyB, manba
Enum ta'rifi kengaytirilganda, barcha ilovalar darhol yangi qiymatdan foydalanishni boshlaysizmi? Nima uchun bu anumslardan foydalanmoqdasiz? Agar siz enumga yangi qiymatni qo'shsangiz, lekin uni ilova kodidan biron-bir joyga yo'naltirmasangiz, u hali ham dastur tomonidan ishlatiladi (masalan, valueOf() yordamida)?
qo'shib qo'ydi muallif socha23, manba

2 javoblar

Ob'ektni yo'naltirish bu muammoni hal qilish uchun ixtiro qilingan: sizning indeksingiz, aniq bo'lmagan bir narsa juda yaxshi bo'lardi. So'rovnomalar o'rniga interfeyslarni/asosiy sinflarni ishlatish uchun arizangizni qayta ishlashni ko'rib chiqishingiz kerak.

Bu muammoni obyektni yaratish vaqtini o'zgartiradi, bu har bir enum uchun bitta o'zgarish nuqtasining darhol ustunlik beradi. Bundan tashqari, plagin asosida arxitekturani joriy qilish uchun yo'l ochadi, bu esa hech qanday recompilyatsiyani talab qilmasligi va uni qayta ishga tushirmasdan arizangizni kengaytirishga olib kelishi mumkin. Uzoq muddatli ishlaydigan server jarayonlari haqida gapirganingizni hisobga olsak, ishlamay qolish vaqtining qisqarishi jozibador bo'lishi mumkin.

Yangilashni oldini olishning eng oson usuli, ehtimol Dependency Injection ni qabul qilishdir. Bahor kabi bir ramka yordamida siz yaratishingiz kerak bo'lgan narsalarni ko'rsatadigan bir yoki bir nechta konfiguratsion faylga ega bo'lasiz va keyin ularni ism-sharifga o'rnatishingiz mumkin.

1
qo'shib qo'ydi
Javobni biroz qo'shimcha ma'lumot bilan yangilayman
qo'shib qo'ydi muallif Nicola Musatti, manba
Ha, sinf faylini papkaga yoki jarga qo'shishingiz mumkin, garchi ikkinchisiga "issiq" qo'shimchalar kiritilishi mumkin. Konfiguratsiyani avtomatik ravishda yangilashning tafsilotlarini men yaxshi bilmayman, chunki men buni o'zim qilishim kerak emas edi.
qo'shib qo'ydi muallif Nicola Musatti, manba
Bu qiziq. Tasavvur qilaylik, u to'g'ri OO dizayniga ega edi. Biror kun yangi talablar joriy etiladi va yangi sinf (kamida) qo'shilishi kerak. Qanday alternativlar tizimga qayta tiklanmasdan qo'yish kerak?
qo'shib qo'ydi muallif Mister Smith, manba
OK, shuning uchun endi kodlangan bir fabrika o'rniga bizda xml bor. Lekin, yana bir narsa, tizim yangi tizimni DI tuzilishi uchun uni initsiatsiya qilish kerak, shunday emasmi? Qanday qayta-qayta terish kerak? Faqat bitta faylga sinf faylini qo'shasizmi? Va yana bir savol: DI ramka xml o'zgarganligini aniqlayaptimi yoki qayta ishga tushirish kerakmi?
qo'shib qo'ydi muallif Mister Smith, manba

Janob Smit to'g'ri: Bu masalaga doir kengaytmalarni yoki eski maktabdagi "numaralandırma" ni mustahkamlash qiyin emas va odatda yaxshi yondashuv emas. Shuni nazarda tutgan holda, yangi ro'yxatga olish qiymatlari ularni ishlatadigan mijozlarning maxsus xatti-harakatlarini talab qiladi. Siz raqamlashtirishni o'zgartirgandan so'ng, siz ham kerak mijozlarni o'zgartirasiz. Bu, albatta, yomon va uni boshqa tarzda qayta tasarlamog'ingiz kerak.

1
qo'shib qo'ydi
Ha, lekin hatto enums usullari ham bo'lishi mumkin. Siz bir martalik meros huquqining ierarxiyasiga yopishtirilgansiz, ammo ular odatdagi sinfning deyarli bir xil xatti-harakatiga ega. Har bir enum doimiy usullari uchun har xil bekor qilishlarga ega bo'lishingiz mumkin. Shunday qilib, bu kalitni yoki if-elseni kodlash o'rniga, har bir enum/class usulida bajariladigan narsani harakatlantiring va uni mijoz kodidan chaqiring.
qo'shib qo'ydi muallif Mister Smith, manba
Sobitning asosiy turlari - "enum" klassining subklasslari. Ma'lum bir enum constant uchun enumda belgilangan usulni bekor qilish uchun siz doimiy ravishda ma'lum bir sinf tanasiga ega bo'lishingiz mumkin. Men toza dizayn deb nomlanadigan narsa emas, lekin u ishlaydi.
qo'shib qo'ydi muallif Mister Smith, manba
Qaytadan qo'shilaman va qo'sha olaman: agar all mijozlari uchun bir xil bo'lsa, i i i i i i i i i i i i i i i i i i bir joyda, , birinchi navbatda emas dasturida amalga oshirilishi kerak.
qo'shib qo'ydi muallif JimmyB, manba
Oh va shuni ta'kidlash kerakki, anumslar merosni qo'llab-quvvatlamaydi va shuning uchun polimorfizm yo'q.
qo'shib qo'ydi muallif JimmyB, manba
Bu to'g'ri, ammo mijozlar xatti-harakatlarini o'zgartirish uchun taqdim etilgan enum turidagi o'zlarining ilovalarini topa olmaydi.
qo'shib qo'ydi muallif JimmyB, manba