Jump to content

SUBIECTE NOI
« 1 / 5 »
RSS
Transferuri instant intre bancile...

player video

Carefur Act for good

Parcare gratis in Bucuresti pentr...
 Rovinieta prin SMS pentru masina ...

Viteza mica Usb 3.2 gen.1 header

Cerificat atestare fiscala pentru...

Schimbare destinatie imobil din l...
 Dorsalgie

Recomandare brand cheie dinamomet...

Divorț la notar

Vechime vs km reali
 Android 12 : "Yahoo Mail s-a ...

Bloc Favorit cu RS2

Ce extractor audio (analogic) pen...

Cine suporta cheltuielile de jude...
 

Baze de date embedded – exercitiu practic (pentru programatori mid-level)

* * * - - 2 votes
  • Please log in to reply
183 replies to this topic

#163
jegmihai

jegmihai

    Senior Member

  • Grup: Senior Members
  • Posts: 11,536
  • Înscris: 03.09.2013
Am nevoie să adaug câteva metode extra clasei PhoneBook, metode care însă îmi sunt necesare strict pentru plugin-ul de Ui.

Nu vreau să le adaug pur și simplu, sunt sigur că există o soluție mai bună.

#164
OriginalCopy

OriginalCopy

    I'm harmful, fear me please! :))

  • Grup: Senior Members
  • Posts: 27,268
  • Înscris: 10.08.2006
Care ar fi acele metode?

#165
jegmihai

jegmihai

    Senior Member

  • Grup: Senior Members
  • Posts: 11,536
  • Înscris: 03.09.2013
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
OriginalCopy

OriginalCopy

    I'm harmful, fear me please! :))

  • Grup: Senior Members
  • Posts: 27,268
  • Înscris: 10.08.2006
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
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,114
  • Înscris: 24.02.2007
Variata 3, mai moderna, dar posibil mai ineficienta: o metoda forEach() cu un callback

#168
jegmihai

jegmihai

    Senior Member

  • Grup: Senior Members
  • Posts: 11,536
  • Înscris: 03.09.2013
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
jegmihai

jegmihai

    Senior Member

  • Grup: Senior Members
  • Posts: 11,536
  • Înscris: 03.09.2013
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
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,114
  • Înscris: 24.02.2007
De ce map? Folosesti un "banal" vector avand in vedere ca afisezi tot din el si ai nevoie de indexare dupa pozitie.

#171
jegmihai

jegmihai

    Senior Member

  • Grup: Senior Members
  • Posts: 11,536
  • Înscris: 03.09.2013
Mă refeream la map-ul de aici, mă gândeam să nu mai stochez ce am acolo și în altceva.

#172
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,114
  • Înscris: 24.02.2007
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
OriginalCopy

OriginalCopy

    I'm harmful, fear me please! :))

  • Grup: Senior Members
  • Posts: 27,268
  • Înscris: 10.08.2006

View Postjegmihai, on 05 octombrie 2018 - 16:18, said:

Voi cum ați implementa metoda data() cu o map ca structură de date?

View PostOriginalCopy, 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
OriginalCopy

OriginalCopy

    I'm harmful, fear me please! :))

  • Grup: Senior Members
  • Posts: 27,268
  • Înscris: 10.08.2006
Î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
OriginalCopy

OriginalCopy

    I'm harmful, fear me please! :))

  • Grup: Senior Members
  • Posts: 27,268
  • Înscris: 10.08.2006
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
jegmihai

jegmihai

    Senior Member

  • Grup: Senior Members
  • Posts: 11,536
  • Înscris: 03.09.2013

View PostOriginalCopy, on 06 octombrie 2018 - 05:48, said:

phonebook.addContact(new Contact(...))
Iar Repository să fie sesizat automat de schimbare?

#177
jegmihai

jegmihai

    Senior Member

  • Grup: Senior Members
  • Posts: 11,536
  • Înscris: 03.09.2013

View Postdani.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.
De Map am nevoie pentru accesul la contacte pe baza id-ului (vezi Update și Delete). Pot să populez vectorul și pe baza Map-ului.

Nu înțeleg cum QTableView se folosește de metoda data().

#178
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,114
  • Înscris: 24.02.2007

View Postjegmihai, on 06 octombrie 2018 - 18:00, said:

Nu înțeleg cum QTableView se folosește de metoda data().

Ii cere fiecare element din tabel/matrice specificand coordonatele.

#179
OriginalCopy

OriginalCopy

    I'm harmful, fear me please! :))

  • Grup: Senior Members
  • Posts: 27,268
  • Înscris: 10.08.2006

View Postjegmihai, on 06 octombrie 2018 - 17:44, said:

Iar Repository să fie sesizat automat de schimbare?
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.

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
jegmihai

jegmihai

    Senior Member

  • Grup: Senior Members
  • Posts: 11,536
  • Înscris: 03.09.2013

View PostOriginalCopy, on 06 octombrie 2018 - 18:51, said:

Nu ai facut teste (test-driven development), dar aceasta abordare iti face business domain mai testabil.
Dacă făceam TDD de la început, pe lângă celelalte beneficii pe care presupun că le-ar aduce, aș fi avut un cod 100% testabil?

View PostOriginalCopy, 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.
OK.

Anunturi

Neurochirurgie minim invazivă 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

0 user(s) are reading this topic

0 members, 0 guests, 0 anonymous users

Forumul Softpedia foloseste "cookies" pentru a imbunatati experienta utilizatorilor Accept
Pentru detalii si optiuni legate de cookies si datele personale, consultati Politica de utilizare cookies si Politica de confidentialitate