Neurochirurgie minim invazivă
"Primum non nocere" este ideea ce a deschis drumul medicinei spre minim invaziv. Avansul tehnologic extraordinar din ultimele decenii a permis dezvoltarea tuturor domeniilor medicinei. Microscopul operator, neuronavigația, tehnicile anestezice avansate permit intervenții chirurgicale tot mai precise, tot mai sigure. Neurochirurgia minim invazivă, sau prin "gaura cheii", oferă pacienților posibilitatea de a se opera cu riscuri minime, fie ele neurologice, infecțioase, medicale sau estetice. www.neurohope.ro |
Getteri si Setteri
#1
Posted 06 May 2019 - 09:28
Parerile sunt impartie in legatura cu aceste enitati, avem urmatoarele cazuri:
1.Setteri sunt evil, dar getteri nu-s 2.Setteri si getteri sunt evil (https://www.javaworl...s-are-evil.html) 3.Setteri si getter nu sunt evil, ci doar folositi necorespunzator in diferite contexte. Voi care din optiunile de mai sus ati alege ? |
#2
Posted 06 May 2019 - 09:45
Setter = metoda de o linie care poate fi apelata din afara clasei, si care face un singur lucru: schimba valoarea unei proprietati a obiectului. Numele unui setter nu exprima o operatie cu sens, ci are o forma artificiala, de obicei setX, unde X e numele proprietatii.
Cum construiesc eu clasele in proiectele in care am putere de decizie: 1.Setteri sunt evil, dar getteri nu-s A nu avea setteri nu inseamna NICIDECUM a nu schimba valori. Valorile sunt initializate (schimbate) in constructor, si apoi in metodele publice care fac si alte lucrurile utile pentru business, pe langa faptul ca seteaza o valoare. Uneori nu exista "alte lucruri" de business care trebuie facute, dar cel putin metoda nu va fi numita "setFoo", ci "doMeaningfulThing(value)". Alteori nu exista "alte lucruri" de business care trebuie facute, dar operatia de business are sens doar cu mai mult de un singur parametru, de exemplu "doMeaningfulThing(meaningfulVariable1, meaningfulVariable2)". Asa nu: setVar1(var1); setVar2(var2); Asa da: doMeaningfulThing(meaningfulVariable1, meaningfulVariable2) Astfel, numele metodelor exprima intentia, nu doar ceea ce se face. Poti avea metode care schimba aceeasi proprietate, dar cu diferite intentii. Intr-o arhitectura, una dintre cele mai dificile intrebari nu este "CE FACE CODUL?", ci "DE CE FACE CODUL ceea ce face?". Daca vreau sa stiu "CE", pai citesc codul si vad CE. Dar "DE CE-ul" e mai greu de rationalizat. De aceea abordarea descrisa mai sus. Edited by OriginalCopy, 06 May 2019 - 09:56. |
#4
Posted 06 May 2019 - 10:25
3. clar!
restul sunt diletantisme imprumutate din asa zisa "programare functionala" |
#5
Posted 06 May 2019 - 14:52
#6
Posted 06 May 2019 - 15:11
O arhitectura buna il forteaza pe programator sa scrie la randul lui cod nou curat. Bineinteles, programatorul tot poate face lucruri anapoda, dar, intr-o arhitectura buna, trebuie sa depuna mult mai mult efort.
Deci programatorul: ori face lucrurile curat si fara mult efort, ori depune mai mult efort ca sa faca lucrurile anapoda. E vorba de inertia unei arhitecturi curate si unde te duce ea. Daca o faci cu cap de la inceput, te poti proteja pe termen lung, iar folosirea responsabila a setterilor e o piesa din puzzle importanta in atingerea acestui scop. Asta ca sa nu mai vorbim si despre ubiquitous language si alte avantaje. Are putin de-a face cu "programarea functionala", ci mai mult cu o gandire sanatoasa si responsabila, nu gandire de plantatie de cod. Edited by OriginalCopy, 06 May 2019 - 15:16. |
#7
Posted 06 May 2019 - 19:37
OriginalCopy, on 06 mai 2019 - 09:45, said:
Setter = metoda de o linie care poate fi apelata din afara clasei, si care face un singur lucru: schimba valoarea unei proprietati a obiectului. Numele unui setter nu exprima o operatie cu sens, ci are o forma artificiala, de obicei setX, unde X e numele proprietatii. Cum construiesc eu clasele in proiectele in care am putere de decizie: 1.Setteri sunt evil, dar getteri nu-s A nu avea setteri nu inseamna NICIDECUM a nu schimba valori. Valorile sunt initializate (schimbate) in constructor, si apoi in metodele publice care fac si alte lucrurile utile pentru business, pe langa faptul ca seteaza o valoare. Uneori nu exista "alte lucruri" de business care trebuie facute, dar cel putin metoda nu va fi numita "setFoo", ci "doMeaningfulThing(value)". Alteori nu exista "alte lucruri" de business care trebuie facute, dar operatia de business are sens doar cu mai mult de un singur parametru, de exemplu "doMeaningfulThing(meaningfulVariable1, meaningfulVariable2)". Asa nu: setVar1(var1); setVar2(var2); Asa da: doMeaningfulThing(meaningfulVariable1, meaningfulVariable2) class Puppy{ private String state; //alte campuri Puppy(){ this.state = "doing nothing"; } //alte metode public String getState(){ return this.state; } public setState(String state){ this.state = state; } } //altundeva in alt obiect: Puppy puppy = new Puppy(); puppy.getState(); // "doing nothing" //cod pt actiunea stapanului = vorbeste cu catelul; puppy.setState("barking"); //cod pt actiunea stapanului = arunca un os puppy.setState("fetching bone"); //cod pt actiunea stapanului = pleaca la alte treburi puppy.setState("sleeping");Ce este gresit in folosirea acestui setter ? |
#8
Posted 06 May 2019 - 19:42
Codul nu are niciun sens. Daca vrei sa intelegi complexitatea lucrurilor despre care vorbesc si consecintele, trebuie sa vii cu o situatie mai complexa si plauzibila, in care mai multe obiecte interactioneaza.
Ce ai tu acolo nu are nevoie de clasa Puppy, poate fi bine mersi o variabila locala metodei. Fa un proiectel realist cu 15+ clase, apoi discutam. Si cu requirements foarte bine documentate intr-un document pdf, ca sa nu vorbim ca sa ne aflam in treaba. Edited by OriginalCopy, 06 May 2019 - 19:47. |
#9
Posted 06 May 2019 - 19:49
OriginalCopy, on 06 mai 2019 - 19:42, said:
Codul nu are niciun sens. Daca vrei sa intelegi complexitatea lucrurilor despre care vorbesc si consecintele, trebuie sa vii cu o situatie mai complexa si plauzibila, in care mai multe obiecte interactioneaza. Ce ai tu acolo nu are nevoie de clasa Puppy, poate fi bine mersi o variabila locala metodei. 2.Daca in realitate catelul exista atunci si obiectul catel trebuie sa existe, doarece oop-ul trebuie sa exprime interactiunea reala intre entitati din viata reala. 3.Decomadata nu inteleg ce nu are sens in interactiunea simpla a doua obiecte: Unul Puppy() si altul Stapan(). ? Tu cam ai modela strict aceasta problema: modificarea starii lui Puppy in interactiunea simpla dintre Puppy si Stapan ? (doresc cod, in orice limbaj vrei tu). Te rog, ai cuvantul. Edited by Iulius-Foyas, 06 May 2019 - 19:50. |
#10
Posted 06 May 2019 - 19:51
Nimic nu are sens, deoarece nu ai definit problema pe care vrei sa o rezolvi.
|
|
#11
Posted 06 May 2019 - 19:52
#12
Posted 06 May 2019 - 19:54
puppy.setState("scrie un roman");//asta e gresit, asa la nivelul de gradinita la care vrei sa discuti.
Daca vrei sa discuti serios, atunci: OriginalCopy, on 06 mai 2019 - 19:42, said:
Fa un proiectel realist cu 15+ clase, apoi discutam. Si cu requirements foarte bine documentate intr-un document pdf, ca sa nu vorbim ca sa ne aflam in treaba. |
#13
Posted 06 May 2019 - 20:19
#14
Posted 06 May 2019 - 20:19
Setter nu inseamna neaparat ca doar seteaza o valoare, chiar daca incepe cu "set". De exemplu, setFont sau setColor pe un element de UI vor schimba proprietatile si vor si redesena componenta.
Dar exista si destule cazuri in care ai nevoie de setter chior, cum ar fi orice obiect cu un set de variabile pe care vrei sau nu vrei sa le setezi la initializare, nu are sens sa faci o droaie de constructori pentru fiecare combinatie de variabile, doar pentru ca ai citit pe net ca setterii sint evil. Sau exista cazurile in care prin setarea unei variabile actionezi asupra obiectului doar schimbind variabila, de exemplu ai un thread in care ruleaza un loop. In general regula ar trebui sa fie sa nu pui automat getteri si setteri pentru fiecare varibila, doar pentru ca poti s-o faci in 2 secunde din IDE-ul minune. Trebuie sa te gindesti mai intii dacachiar ai nevoie de asa ceva. Acuma nu mai zic de aia care cred ca nu folosesc setteri daca in loc de setAmount() folosesc deposit() sau alte aberatii. Right, macar daca incep cu set le gasesti mai usor in IDE-ul minune, nu trebuie sa te chinui sa-ti imaginezi ce dracu de verb a folosit ala "ca sa nu foloseasca setteri". changeFontAndRepaint() |
#15
Posted 06 May 2019 - 20:23
MarianG, on 06 mai 2019 - 19:52, said:
faptul ca tu poti seta o stare, starea aia este o proprietatea a clasei, la fel cum este temperatura apei, o incalzesti, dar nu ii spui tu cat de calda sa fie Problema este: modificarea starii lui Puppy in interactiunea simpla dintre Puppy si Stapan. Cum ai modela aceasta interactiune, simpla de gradinitia (doresc cod de la tine). OriginalCopy, on 06 mai 2019 - 19:54, said:
Daca vrei sa discuti serios, atunci: Edited by Iulius-Foyas, 06 May 2019 - 20:22. |
|
#16
Posted 06 May 2019 - 20:26
cand nu este starea discreta ?
ca sa nu zic ca nu setezi stari ci obiective Edited by MarianG, 06 May 2019 - 20:33. |
#17
Posted 06 May 2019 - 20:28
Mosotti, on 06 mai 2019 - 20:19, said:
Acuma nu mai zic de aia care cred ca nu folosesc setteri daca in loc de setAmount() folosesc deposit() sau alte aberatii. Right, macar daca incep cu set le gasesti mai usor in IDE-ul minune, nu trebuie sa te chinui sa-ti imaginezi ce dracu de verb a folosit ala "ca sa nu foloseasca setteri". changeFontAndRepaint() Cu care nu sunt de acord din urmatorul rationament: setX e detaliu de implementare. In meeting cu product owner sau cine imi descrie business rules, cream un document. Acel document foloseste terminologia de business. PO nu va spune "setCoordinate", ci "focusOnPerson" in acele cerinte. Asta se numeste ubiquitous language. Iar documentul respectiv se duce de pe masa lui PO direct la programatorul care implementeaza, si programatorul il intelege pe PO, si PO intelege codul, deoarece cu totii folosim acelasi limbaj, aceeasi terminologie. Ulterior, cand apare o noua cerinta "I want users who pay for gold membership to be rendered with a golden star when they're focused on", e mai usor sa gasesti unde trebuie sa modifici in cod, pentru ca: 1. nu ai sute de apeluri la setCoordinate, din diferite motive, ci cateva, sau probabil doar unul la focusOnPerson() 2. cuvinte cheie din cerinta apar atat in formularea lui PO, cat si in cod => usor de gasit 3. cand ai prea mult de "set", prefixul "set" devine inutil ca autocomplete iti da ditamai lista de metode, si tot singur trebuie sa te descurci; dar cand cauti doar dupa "focus" sau "person", primesti cateva sugestii, si vor fi acele metode care sunt relevante pentru problema pe care vrei sa o rezolvi. Edited by OriginalCopy, 06 May 2019 - 20:39. |
#18
Posted 06 May 2019 - 20:44
Anunturi
▶ 0 user(s) are reading this topic
0 members, 0 guests, 0 anonymous users