Strategy Pattern yordamida fayl shifrlash/deshifrlash logikasini refaktoring qilish
Kirish
Yaqinda bir loyihada biz mavjud DRM asosidagi fayl shifrlash tizimini MIP asosidagi yangi tizimga almashtirdik. Agar barcha fayllar faqat MIP orqali qayta ishlanganida, bu juda oddiy vazifa bo‘lardi. Biroq muhim talab shundan iborat ediki, avval yuklab olingan eski DRM fayllari bilan moslik saqlanishi kerak edi.
Ya’ni, fayl yuklash jarayonida DRM va MIP shifrlash/deshifrlash mexanizmlari birgalikda ishlashi va vaziyatga qarab dinamik ravishda qo‘llanilishi kerak edi. Ushbu talabni mavjud tizimga moslashtirish jarayonida bir qator cheklovlar yuzaga chiqdi. Shu sababli biz tizimni Strategy Pattern yordamida qayta loyihalab, ushbu tajribani ulashmoqchimiz.
Mavjud kod muammolari: statik util metodlar cheklovlari
Dastlab fayl shifrlash/deshifrlash logikasi umumiy util klass ichida statik metodlar sifatida yozilgan edi. Yangi talablarni qo‘shish uchun oddiy shart operatorlarini qo‘shish mumkin edi, ammo bu yondashuv quyidagi muammolarga olib kelishini angladik:
1. Shotgun surgery va yuqori bog‘liqlik
Shifrlash/deshifrlash logikasi biznes logikaning 12 dan ortiq joyida ishlatilgan. Agar mavjud yondashuv davom ettirilsa, har qanday o‘zgarish yoki yangi algoritm qo‘shilishi barcha 12 joyni o‘zgartirishni talab qiladi. Bu esa tizimni qattiq bog‘langan holatga keltiradi.
2. Parametrlar nomuvofiqligi va kengaytirish qiyinligi
DRM va MIP turli parametrlarni talab qiladi. Ularni bitta metodda alohida parametr sifatida boshqarish yangi tizim qo‘shilganda metod imzosini o‘zgartirishga olib keladi va mavjud kodni buzadi. Shu sababli parametrlarni yagona DTO ga birlashtirish zarur edi.
3. Unit test yozishdagi qiyinchiliklar
Statik metodlar holatni saqlamaydi va mock qilish qiyin, bu esa izolyatsiyalangan unit test yozishni murakkablashtiradi.
Yechim: Strategy Pattern orqali o‘zgaruvchan va o‘zgarmas qismlarni ajratish
Biznes logika talabga qarab o‘zgarishi kerak, ammo statik tuzilma bunga to‘sqinlik qilardi. Muammoni tubdan hal qilish uchun biz arxitekturani qayta ishlab chiqib, quyidagi prinsipni qo‘lladik:
o‘zgaradigan va o‘zgarmaydigan qismlarni ajratish
Buni amalga oshirish uchun Strategy Pattern dan foydalandik:
- O‘zgaradigan qism: DRM, MIP kabi shifrlash algoritmlari
- O‘zgarmaydigan qism: faylni shifrlash/deshifrlash jarayoni va yagona parametr modeli
Natijada biz konkret implementatsiyalarga bog‘liqlikni yo‘qotib, interfeys orqali abstraksiyani joriy qildik. Bu esa 12 ta klient komponentni konkret shifrlash algoritmlaridan mustaqil ishlashiga imkon berdi.
Amalda shifrlash, deshifrlash va turini aniqlash metodlariga ega interfeys yaratildi. DRM va MIP implementatsiyalari ushbu interfeysni amalga oshiradi.
Ular Spring Bean sifatida ro‘yxatdan o‘tkazilib, modullar orasida qulay foydalanish imkonini beradi.
Xulosa va kutilayotgan natijalar
Refaktoringdan so‘ng barcha 12 klient komponent faqat FileEncryptor abstraksiyasi bilan ishlaydi va konkret implementatsiyani bilmaydi. Bu Open-Closed Principle ni amalga oshirish imkonini berdi.
Statik metodlardan voz kechish unit test yozishni ancha osonlashtirdi. Kelajakda yangi shifrlash mexanizmi qo‘shilsa ham, mavjud biznes logikani o‘zgartirish talab qilinmaydi.
Ushbu tajriba nafaqat joriy muammoni hal qilish, balki tizimning kengaytiriluvchanligi va uzoq muddatli qo‘llab-quvvatlanishini chuqurroq tushunish imkonini berdi.
Rahmat.
pong