Chirurgia cranio-cerebrală minim invazivă
Tehnicile minim invazive impun utilizarea unei tehnologii ultramoderne. Endoscoapele operatorii de diverse tipuri, microscopul operator dedicat, neuronavigația, neuroelectrofiziologia, tehnicile avansate de anestezie, chirurgia cu pacientul treaz reprezintă armamentarium fără de care neurochirurgia prin "gaura cheii" nu ar fi posibilă. Folosind tehnicile de mai sus, tratăm un spectru larg de patologii cranio-cerebrale. www.neurohope.ro |
Baze de date embedded – exercitiu practic (pentru programatori mid-level)
Last Updated: Oct 10 2018 14:21, Started by
jegmihai
, Sep 07 2018 22:27
·
0
#165
Posted 30 September 2018 - 09:06
As avea nevoie de un getter pentru map.
Celelalte metode ar fi fost size() și operatorul[], dar getter-ul le-ar suplini pe amândouã. |
#166
Posted 30 September 2018 - 13:44
Map e un detaliu de implementare, intern lui PhoneBook.
1. Mergi cu size() si operator[]. 2. Alta varianta ar fi sizeHint() si getContactsIterator care returneaza un indiciu (precis sau nu) asupra marimii si un forward iterator. Depinde ce vrei. Cu 1. e usor de implementat. Cu 2. poti optimiza consumul de memorie. Exista si alte metode, in functie de cerinte. Cum nu ai cerinte exacte, cel mai sigur e sa faci 1. Si mai e un aspect: phonebook e deja o colectie de contacte. sa iei dintr-o colectie inca o alta colectie pentru a face ceva pur si simplu nu ma face sa ma simt bine. Gandeste-te la semnificatia codului, in special in domain model, si scrie codul asa incat acesta sa reflecte acea semantica. Ce aspect al realitatii inconjuratoare modelezi in software e ce zice PO ca vrea in intalnirile cu el: "vreau un phone book cu contacte". Modelul asta trebuie sa modeleze, nu "map" sau alte artefacte. Bun, nici "iterator" nu este din domain model, dar "a itera" e mai degraba apropiat de limbajul lui PO ca "map", caci "harta" are o alta semnificatie pentru restul lumii. Varianta 2 are alte avantaje, de exemplu diferiti iteratori pentru diferite sortari. |
#167
Posted 30 September 2018 - 13:55
Variata 3, mai moderna, dar posibil mai ineficienta: o metoda forEach() cu un callback
|
#168
Posted 30 September 2018 - 14:34
Din motive de testare, am implementat (temporar) getter-ul, însã mã lovesc de probleme specifice Qt.
Cred cã acum este momentul oportun pentru: http://doc.qt.io/qt-...rogramming.html |
#169
Posted 05 October 2018 - 16:18
Am încercat să moștenesc QAbstractTableModel și să fac override metodelor rowCount(), columnCount() și data(), însă nu am reușit să îi dau de cap. Mă aștept ca metoda data() să fie implementată greșit, așa că am încercat să izolez problema și am încercat să implementez având o matrice ca structură de date (în loc de map), și a funcționat.
Voi cum ați implementa metoda data() cu o map ca structură de date? |
#170
Posted 05 October 2018 - 19:44
De ce map? Folosesti un "banal" vector avand in vedere ca afisezi tot din el si ai nevoie de indexare dupa pozitie.
|
#172
Posted 05 October 2018 - 22:07
N-am urmarit toata evolutia codului, dar parca ideea era sa folosesti o baza de date embedded. De ce mai ai nevoie de un map in cazul asta?
Imi imaginez scenariul simplu: vrei sa afisezi anumite intrari folosind Qt => faci query in baza de date => populezi un vector => oferi vectorul lui Qt impachetat in aceea interfata tabelara. Edited by dani.user, 05 October 2018 - 22:08. |
|
#173
Posted 06 October 2018 - 05:03
jegmihai, on 05 octombrie 2018 - 16:18, said:
Voi cum ați implementa metoda data() cu o map ca structură de date? OriginalCopy, on 30 septembrie 2018 - 13:44, said:
Map e un detaliu de implementare, intern lui PhoneBook. Suprafața de contact a lui Qt cu domain model e phonebook și contact. Map e un detaliu de implementare din domeniu. Analog, in pluginul de UI folosești orice structură de date funcționează, care e tot un detaliu de implementare. Nu am mai folosit Qt de ani buni, dar dacă nu ai cerințe precise, nu mi-aș bate prea mult capul cu aceste detalii. Dacă char** funcționează, funcționează. Înțeleg că vrei ceva anume pentru orgoliul tău personal, ceea ce e ok. Vino cu un branch separat în care arăți ce și cum nu funcționează. PS: nu văd în ce mod ar avea sens un map într-un view tabelar qt. Vector poate. În domain model map are sens, pentru că vrei să poți accesa contacte individuale pornind de la id-ul lor. |
#174
Posted 06 October 2018 - 05:24
Încă ceva: cum introduci date din ui? Vezi că în UI trebuie să operezi pe domain model, ceea ce înseamnă că domain model trebuie să notifice storage la fiecare operație. În același timp, atenție la direcția dependințelor. Concluzia: phonebook trebuie să implementeze observer pattern - phonebook e observable.
|
#175
Posted 06 October 2018 - 05:48
Acum m-am uitat pe main widget.
Sursa conflictului de interese constă în faptul că vrei să pregătești o arhitectură mai complexă folosind o aplicație crud. Momentan nu vedem gărgărița din pădure din cauza copacilor. Ce ar fi dacă am avea o operație de business mai complexă ca "createContact"? Am pune acea operație în phonebook. Noi nu avem o astfel de operație, deci trebuie să tratăm operația "create" însăși ca pe una de business. Zic să faci așa pentru a fi construit deja podul mental în arhitectură pentru acele cazuri mai complexe. Deci pe undeva prin ui, trebuie să ai o linie de cod precum (pseudocod) : phonebook.addContact(new Contact(...)) De citit poți citi din baza de date, dar operațiile de modificare (create, update, delete) trebuie să treacă prin model. Ca să te conving, exemplu de operație mai complexă: în contacts din android poți selecta două contacte și le poți uni; algoritmul de reconciliere ține de business. |
#176
Posted 06 October 2018 - 17:44
#177
Posted 06 October 2018 - 18:00
dani.user, on 05 octombrie 2018 - 22:07, said:
Imi imaginez scenariul simplu: vrei sa afisezi anumite intrari folosind Qt => faci query in baza de date => populezi un vector => oferi vectorul lui Qt impachetat in aceea interfata tabelara. Nu înțeleg cum QTableView se folosește de metoda data(). |
|
#178
Posted 06 October 2018 - 18:03
#179
Posted 06 October 2018 - 18:51
jegmihai, on 06 octombrie 2018 - 17:44, said:
Iar Repository să fie sesizat automat de schimbare? De ce? Nu ai facut teste (test-driven development), dar aceasta abordare iti face business domain mai testabil. Acel Observer primeste ca parametru in constructor fie instanta repository, fie intregul storage plugin. Ai doar un singur repository, deci doar acel repository e suficient. Observer si Observable sunt interfete in infrastructure. |
#180
Posted 07 October 2018 - 08:43
OriginalCopy, on 06 octombrie 2018 - 18:51, said:
Nu ai facut teste (test-driven development), dar aceasta abordare iti face business domain mai testabil. OriginalCopy, on 06 octombrie 2018 - 18:51, said:
Daca pe Phonebook il faci Observable, atunci ai nevoie de un Observer in storage plugin. Orice clasa din storage e un posibil candidat, dar eu as face o clasa dedicata pentru asta. |
Anunturi
▶ 0 user(s) are reading this topic
0 members, 0 guests, 0 anonymous users