Clojure-da kalit so'zlarni loyihalash

Kichkina veb-ilovani ishlab chiqish orqali Clojureni o'rganyapman Java dunyosidan keladigan bo'lsak, men kalit so'zlarni ishlatib, ma'lumotlarni qanday qilib ishlab chiqishni tushunishga harakat qilaman.

Ma'lumotlar strukturasiga (modelga) qanday kirishim kerak?
Misol uchun, body maydoniga ega sharh bor Model qiymatiga kirish uchun : body kalit so'zini ishlataman,
lekin kelajakda body ismini boshqa bir narsaga (masalan, content ) o'zgartirishni xohlasam juda qiyin ko'rinadi.

Java'ga kelsak, uni get funktsiyasi bilan qamrab olaman uni Cogressda qanday ishlatishim kerak? Dizayn namunalari yoki eng yaxshi amaliyotlar qanday?

1

5 javoblar

Siz shunga o'xshash get funktsiyasini yaratishingiz mumkin:

; Using bloated names here since 
;  get and comment are built-ins
(defn get-stuff [comment-node]
  (:body comment-node))
  ; ^ Update here! 

Keyinchalik, bu funktsiyadagi kalit so'zni o'zgartiring.

Albatta, aqlli IDE ham uni o'zgartirishga qaror qilsangiz, mos refactor qilish imkoniyatiga ega bo'lishi mumkin. IntelliJ + Cursive-dan foydalansam ham, afsuski, bunday refactoringni tortib olish uchun etarli aqlli emas. Men bu kalit so'zlarni ishlatishdan meni xafa qiladigan narsa ekanini e'tirof etishim kerak. Ular IDElar uchun yordam berish uchun juda ko'p "havoda".

Va bu kabi nozik ro'molcha vazifasini xohlaysizmi, xohlamasligingiz mumkin. Agar oddiy POD xarita bo'lsa, faqat (: x point) dan foydalanish mantiqiy bo'lishi mumkin. Agar bu murakkabroq bo'lsa, uning o'rniga umumiy API "usullari" ni ishlatish mumkin.

2
qo'shib qo'ydi
Men buni ham qilishni o'yladim, bu faqat jozibali yo'l emas. Sizning loyihalaringizda buni qanday amalga oshirasiz? Va g'oyalar bilan ham jirkanman
qo'shib qo'ydi muallif Kickapoo, manba

Muammoni takrorlayapsiz deb ayta olaman. Ko'pincha men xaritada bitta maydon nomini tanlayman va unga sodiq qolaman. Keyinchalik, sizning maydoningizdagi barcha voqealarni topish va uni oddiy qidiruv orqali qayta nomlash juda qiyin bo'lmaydi. Men uchun Clojure falsafasi kodni sodda va tushunarli qilib yaratishga va juda ko'p moslashuvchanlikni oldindan o'ylamaslikka harakat qilishdir, chunki Clojure o'zi oddiy, moslashuvchan va dinamik, shuning uchun sistemangizning qismlarini keyinroq o'zgartirishingiz mumkin minimal harakatlar.

0
qo'shib qo'ydi

Java dunyosida, agar siz ba'zi bir sinfda maydonni yoki usulni o'zgartirganingizda ham, har bir IDE avtomatik ravishda loyihani avtomatik ravishda qayta tiklashi mumkin emas. Siz albatta kodni qo'llar bilan tozalashingiz kerak.

Savolingizga javob berayotib, dalalar uchun tegishli nomlarni tanlab ko'ring va kelajakda ularni o'zgartirmang.

Agar siz hali ham nomini o'zgartirishdan qo'rqsangiz, xuddi shu nomdagi sezgir maydonga kiradigan vazifalarni birga saqlang.

Ba'zi bir maslahat, ba'zi bir kalit so'zni ishlatish uchun, uni quyida ko'rsatilgandek lokal o'zgaruvchiga qo'ying:

(let [field :comment
      value (get data field)
      value2 (get data2 field)]
  ...)

Kalit so'zlar, xuddi shu nomdagi parametrlarga xaritalashni buzganda, Clojurening juda kuchli xususiyati, masalan:

(let [{:keys [comment body title]} node-data]
  ... now operate on those variables)

Lekin siz har qanday maydon nomini o'zgartirgan bo'lsangiz ham, uni buzish sintaksisi bilan ham foydalanishingiz mumkin. Ma'lumotlaringizni endi : body o'rniga : description maydoniga ega bo'lganligini tasavvur qiling:

(let [{:keys [comment title] body :description} node-data]
  ... the body now points on the right field)
0
qo'shib qo'ydi

SOLID tamoyillari Clojure dasturlariga ham taalluqlidir. Ma'lumotlaringiz o'zgartirilsa, kodni interfeysdan o'chirib qo'ying. Get usulini yaratish orqali siz faqat shu usulni o'zgartirishingiz kerak bo'ladi.

Bu "The Clojure Way" ning buzilishi kabi ko'rinishi mumkin, ammo mening kamtarin fikrimcha, bu emas. Shaffof ma'lumotlarga ega bo'lish, o'z manfaatlariga ega. Hech bo'lmasa ularni REPL-da chop etishingiz mumkin. Ammo sizning ma'lumotlaringiz to'g'ridan-to'g'ri bog'liq bo'lmagan modullardan kelib chiqqan bo'lsa, uning ichki holatiga tasodifiy qaramlik yaratish kerak bo'lmasligi mumkin.

Idea + Cursive yo'q, chunki ishimizda biz Eclipse RCP ilovalarini ishlab chiqamiz. Shuning uchun Eclipse + Emacs + Cider ishlataman va Cursive haqida gapira olmayman. Clj-refactor ushbu holatda ishonchli tarzda kalit so'zlarni qayta tiklab bo'lmaydi. Siz faqat nomini o'zgartirib, o'zgartirishga qulay ism-sharafli kalit so'zlardan foydalanishingiz mumkin. Vaqti-vaqti bilan o'zgarishi mumkin bo'lgan ma'lumotlarga ega bo'lganimda, bu o'zgarishlardan foydalanishim mumkin, lekin o'zgarishning mumkin emasligi va dasturning boshqa qismlari bevosita unga kira olishlari mumkin. Albatta, birlik sinovlari va spec. Agar men tashqi APIdan o'zgartirilishi mumkin bo'lgan ma'lumotlarga ega bo'lsam yoki boshqa modullar chuqur ichki joylashgan xaritalarni almashtirish orqali kirishga to'g'ri kelganida, tegishli modulda interfeys yaratmoqchiman.

0
qo'shib qo'ydi

TL;DR: use something like clojure.set/rename or clojure.set/rename-keys.

Yomon Tavsiya

Bu mening taassurotim (asosan https://www.youtube.com/watch?v=oyLBGkS5ICk ) "jodugarlik yo'li" sizning dizayni haqida etarlicha oldindan o'ylab ko'rishdir, deb o'ylayman. ("xom-gudjetni rivojlantirish").

Bunday o'zgarishlarni amalga oshirish uchun kerak bo'ladigan shamolni qo'ysangiz, yangi kalit so'z nomlarini ishlatadigan boshqa funktsiyalar to'plamini (boshqa nslarda bir xil nomlardan foydalaning) yarating. Keling, asl nusxangizni asl nusxasini oling, yoki asl nusxangiz yangilarini chaqiring (qaysi biri ko'proq ma'noga ega). Odamlar yangi versiyani ishlatishni tavsiya qilish uchun hujjatlarni yangilang.

Xakda ko'proq vaqt sarflang.

More generally (and hopefully helpfully):

Funktsiyalaringizni ozgina miqdorda saqlashga harakat qiling va baribir siz bir nechta qadriyatlar atrofida aylanasiz. Agar siz kerakli narsalarni: tana oldiga kirsangiz, u xaritadagi aloqador qadriyatlarning qolgan qismi qanchalik zarur?

Ularni qisman qisqartirish uchun ushbu qismlarni o'z funksiyalariga qaytarib bera olasizmi? Sizning kontentingiz bilan ishlashingiz kerak bo'lgan o'xshash funksiyalarni ajratish uchun yuqori darajadagi vazifalarni qaytarish/qaytarish mumkinmi? ("Qisman" funksiya sizning do'stingizdir).

Full-blown explanation (complete with personal whining):

Bu kunlarda bularning katta qismi xaritalarni nomlar bilan belgilangan kalit so'zlar bilan birga spec bilan birga ishlatishni o'z ichiga oladi. Sizning ism-shariflaringizni takrorlashingiz mumkin bo'lganligi sababli, bu sizning muammoingizni hal qiladigan muayyan muammolarni yuzaga keltirishi mumkin: hatto siz ishonchli ravishda oddiy qidiruvni amalga oshirolmaysiz/loyihangizga almashasiz.

Men hozir bu borada juda ko'p og'riqlarga duch kelmoqdaman, buni men aniqlayotganimda yozgan ba'zi kodlarni qayta ko'rib chiqdim. Ismlar noto'g'ri yozilganligini angladim.

Agar kimdir mening kutubxonamdan foydalansalar, haqiqiy javob mening boshlagan ishim yomon, buzilgan va yomon rejalashtirilgan deb qabul qilishdir. Hozirda mavjud bo'lgan narsalardan ko'ra ko'proq ifodalangan yangi funktsiyalarni yozishim mumkin edi (shuning uchun, sizning namunangizda o'z ichiga quyidagilarni o'z ichiga olgan xarita mavjud: foo/body) mavjud. Ehtimol, sobiq funktsiyalarni eslatib qo'ygan bo'lar edim, lekin ularni hech qachon yo'q qila olmayman, deb qabul qilaman.

Yoki, ehtimol, men kutubxonani bekor qilib, mavjud/potentsial foydalanuvchilarni aslida istagan narsaga yanada yaqinroq mos keladigan yangi ma'lumotlarga qaratishim kerak.

Aslida, bu ikkinchi variantni jozibador, bir tartibsizlik. Men yagona foydalanuvchi bo'lsam ham. Bu kabi kalitlarni qayta nomlash deyarli og'riqli ko'rinadi.

Tilning qolgan qismi bilan bog'liq bo'lgan tajribamga asoslanib, bu sizning shubhangizdir, chunki sizning API-ni buzish - bu dahshatli narsa.

On the other hand, there's at least one more piece to this.

Qora-quti, hujjatsiz ma'lumotlar shlyapa tomidagi tomoqqa o'zgarishni xohlaysizmi? (Agar siz xuddi tutqich kabi muomala qiladigan qiymatga ega deb aytsangiz, bu xarita sifatida qo'llaniladi). Barcha OOP shaxsiy hujjatlar hujjatlashtirilgan narsalar haqida ma'lumot.

API-ingizning ushbu qismida "database-connection-database" kabi nomlar mavjud. va "run-database-command!". Qolganlari, aslida, aslida dunyoni o'zgartirgan kishilarga o'tadigan kutilayotgan yon ta'sirlarni ketma-ketligini o'rnatadigan sof vazifalar bo'lishi kerak.

Pedestal kutubxonasi bu yondashuvning ajoyib namunasidir. Uning kontekst xaritalari yuqorida tavsiya etilgan yondashuvga deyarli qarama-qarshidir, chunki bu faqat ma'lum bir funktsiya chaqiruvi uchun imkon qadar bir-biridan farqlangan qiymatlarni ishlatish haqida ... bu fikrlar albatta va faqat o'zimdir.

Sizning oxirgi foydalanuvchingiz sizning vazifangizni chaqirib, orqaga qaytishingiz kerak ... uni kulrang quti deb atash kerak. Ular sizning (boshqa hech qanday o'zgarishsiz) unga ishonadigan boshqa funktsiyalarga javob berishga mas'uldirlar (bu halol, juda kamdan-kam hollarda bo'lishi kerak: bular, albatta, yon ta'sirga olib keladigan tizim chegarasi kodi uchun). Agar ular ichkariga qarashsa, bu ularning ishi, lekin men bu ma'lumotni o'zgartirish uchun adolatli deb o'ylayman.

Qopqoq ostida bu ma'lumotni o'zgartirish bizni asl muammoingizga qaytaradi: bu hali ham og'riqli.

Bu kabi narsaga muhtoj bo'lgan kodni yozish borasida juda jirkanch bo'lishning yana bir sababi.

Umid qilamanki bu yordam!

0
qo'shib qo'ydi