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

#145
OriginalCopy

OriginalCopy

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

  • Grup: Senior Members
  • Posts: 27,268
  • Înscris: 10.08.2006
Solutia: introducem o noua abstractie.

Pe de o parte trebuie sa instantiem un Plugin pentru a ii afla dependintele.

Pe de alta parte, trebuie sa ii pasam dependintele constructorului pluginului.

De aici rezulta conflictul. init() nu e deloc problema, ci getDependencies() care nu e la locul potrivit. getDependencies() e metoda a fix acelui lucru (pluginul) ale carui dependinte vrem sa le aflam => imposibil.


Cum sa numim aceasta noua abstractie? Eu i-as zice PluginSpecification. Fiecare plugin are unul. Application::addPlugin() devine Application::addPluginSpecification().

#146
jegmihai

jegmihai

    Senior Member

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

#147
OriginalCopy

OriginalCopy

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

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

View Postjegmihai, on 26 septembrie 2018 - 11:37, said:

This one?
Incredibil pentru cate lucruri exista patterns.

Interesant, dar fa-o simplist de tot, nu ca acolo: extrage getDependencies() in clase separate care implementeaza PluginSpecification si adapteaza Application.

Simplu, nimic fancy, un refactoring de 30-60 minute.

#148
jegmihai

jegmihai

    Senior Member

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

View PostOriginalCopy, on 25 septembrie 2018 - 23:03, said:

Fiecare plugin are unul.
Ca membru?

#149
OriginalCopy

OriginalCopy

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

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

View Postjegmihai, on 26 septembrie 2018 - 12:15, said:

Ca membru?
Evident ca nu, altfel te invarti in cerc.

Mai degraba invers: PluginSpecification are o factory method pentru Plugin.

#150
jegmihai

jegmihai

    Senior Member

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

View PostOriginalCopy, on 26 septembrie 2018 - 12:05, said:

Interesant, dar fa-o simplist de tot, nu ca acolo: extrage getDependencies() in clase separate care implementeaza PluginSpecification si adapteaza Application.
Și ce metode ar trebui să aibă PluginSpecification?

Momentan la mine arată așa.

class IPluginSpecification
{
public:
	virtual ~IPluginSpecification() = default;
	virtual IPlugin* create(std::vector<IPlugin*> const& dependencies = std::vector<IPlugin*>())
		= 0;
	virtual std::vector<std::string> getDependencies() const noexcept = 0;
};


Am adaptat Application, funcționează, însă nu știu dacă s-ar comporta 100% corect în alte cazuri.


Asta ar fi metoda care s-ar ocupa de instanțiere.

auto Application::instantiatePlugins(std::vector<int> const& topologicallySorted) -> void
{
for (auto currentSpecificationIndex = 0; currentSpecificationIndex < topologicallySorted.size();
		 ++currentSpecificationIndex)
{
	 std::vector<IPlugin*> dependenciesSupplier;
	 for (auto const & [ specificationIndex, dependencySpecificationIndex ] : _dependencies)
	 {
		 if (currentSpecificationIndex == specificationIndex)
			 dependenciesSupplier.push_back(_plugins[dependencySpecificationIndex]); //Linia asta mă îngrijorează.
	 }
	 if (dependenciesSupplier.empty())
		 _plugins.push_back(_specifications[currentSpecificationIndex]->create());
	 else
		 _plugins.push_back(
			 _specifications[currentSpecificationIndex]->create(dependenciesSupplier));
}
}



#151
OriginalCopy

OriginalCopy

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

  • Grup: Senior Members
  • Posts: 27,268
  • Înscris: 10.08.2006
Arată ok.

#152
jegmihai

jegmihai

    Senior Member

  • Grup: Senior Members
  • Posts: 11,536
  • Înscris: 03.09.2013
Voi mai testa metoda instantiatePlugins(), iar apoi voi incerca să scap de naked pointers.

#153
jegmihai

jegmihai

    Senior Member

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

View Postjegmihai, on 27 septembrie 2018 - 08:04, said:

Voi mai testa metoda instantiatePlugins()
Am descoperit un bug pe care l-am corectat.

Am făcut update-ul complet pe GitHub.

#154
OriginalCopy

OriginalCopy

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

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

View Postjegmihai, on 27 septembrie 2018 - 11:27, said:

Am descoperit un bug pe care l-am corectat.

Am făcut update-ul complet pe GitHub.
Ok. Ce crezi despre rezultat?

#155
jegmihai

jegmihai

    Senior Member

  • Grup: Senior Members
  • Posts: 11,536
  • Înscris: 03.09.2013
Sunt mulțumit.

Acum vreau să revin asupra UI-ului.

Atenție că până acum, din motive de testare, am folosit vechiul storage plugin, fără Repository. Acum trebuie să adaptez UI-ul să comunice cu noul storage plugin.

Comunicarea dintre ele trebuie să se facă exclusiv prin obiecte din domain model?

#156
OriginalCopy

OriginalCopy

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

  • Grup: Senior Members
  • Posts: 27,268
  • Înscris: 10.08.2006
La citire de informatii din DB, ar trebui sa primesti doar modele.

La salvare, ai nevoie de PhonebookRepository, apelezi metode din el precum delete, create, update, cu modelul (Contact) corespunzator ca parametru.

Variatii si abordari exista o gramada. Toate implica crearea de noi abstractii, construirea de noi punti in arhitectura. Pe astea le inveti pe masura ce citesti despre arhitectura, si in practica. Nu as include in acest proiect nimic altceva.

Ce ai acum poate fi carmit in multe directii, ti le las tie ca "tema pentru acasa" sa le explorezi.

#157
jegmihai

jegmihai

    Senior Member

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

View PostOriginalCopy, on 27 septembrie 2018 - 20:02, said:

La citire de informatii din DB, ar trebui sa primesti doar modele.
Și aici presupun că voi fi nevoit să folosesc un soi de adapter.

Cum se numește mai exact acest sistem bazat pe plugins? Nu am găsit nici o denumire oficială/altceva.

View PostOriginalCopy, on 27 septembrie 2018 - 20:02, said:

Ce ai acum poate fi carmit in multe directii, ti le las tie ca "tema pentru acasa" sa le explorezi.
Corect.


Mulțumesc frumos pentru tot suportul pe care mi l-ai oferit de-a lungul acestui proiect.

View Postjegmihai, on 27 septembrie 2018 - 21:46, said:

Cum se numește mai exact acest sistem bazat pe plugins? Nu am găsit nici o denumire oficială/altceva.
Nevermind, cred că am găsit singur răspunsul.

OriginalCopy said:

Arhitectura pe care ti-o dau e bazata pe POCO si nu am gasit o situatie in care nu e buna, poate fi suprapusa peste orice combinatie de tehnologii sau arhitecturi. E sinteza mea personala a foarte multor ani de proiecte de succes care ruleaza milioane / an, carti, articole si conferinte. Presupun ca exista proiecte facute curat de altii intr-un mod similar, dar eu nu am intalnit asa ceva pana acum in industrie. Unii POs sunt reticenti atunci cand incerci sa le "vinzi" ideea unei arhitecturi curate, deoarece au impresia ca ar costa mai mult. Eu iti arat cum poti face lucruri cu mijloace simple, pastrand codul curat, modular, si cu probabilitate de buguri mai mica.


#158
OriginalCopy

OriginalCopy

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

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

View Postjegmihai, on 27 septembrie 2018 - 21:51, said:

Și aici presupun că voi fi nevoit să folosesc un soi de adapter.
Absolut niciun adapter.

repository returneaza si/sau opereaza cu obiecte Contact / Phonebook.

Important e sa folosesti doar repositories oferite de storage. Storage are doar trei clase publice (utilizate de alte pluginuri): plugin specification, clasa plugin insasi si repository (adaugi noi repositories dupa nevoi, ceea ce nu e necesar pentru aceasta aplicatie).

Pastreaza suprafata de contact cat mai mica.

PS: uita-te prin toate fisierele si curata-le. De exemplu includes nefolosite: https://github.com/I...esktop/main.cpp

Edited by OriginalCopy, 28 September 2018 - 06:42.


#159
jegmihai

jegmihai

    Senior Member

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

View PostOriginalCopy, on 28 septembrie 2018 - 06:14, said:

repository returneaza si/sau opereaza cu obiecte Contact / Phonebook.
Pe fluxul Ui -> Storage, da, Repository va lucra doar cu obiecte Contact/PhoneBook.

Pe de altă parte, pe fluxul Storage -> Ui, cel din urmă va avea nevoie de un Qt Model. Contact/PhoneBook sunt model-urile mele, însă ele trebuie să fie adaptate pentru a putea fi folosite împreună cu View-urile din Qt.

Bineînțeles că treaba asta o pot face în interiorul lui Ui Plugin.

Am aceeași problemă ca cel de aici: https://stackoverflo...to-qt-tableview.

Edited by jegmihai, 28 September 2018 - 09:04.


#160
OriginalCopy

OriginalCopy

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

  • Grup: Senior Members
  • Posts: 27,268
  • Înscris: 10.08.2006
A da, acel adapter, bineînțeles că ai nevoie de el.

Dar fi atent să nu introduci acel model specific UI nici în storage, nici în domain model.

Si nici să nu modifici modelul în orice mod.

Asta te asigură că într-adevăr modificarea ce tine de ui chiar rămâne în ui.

#161
OriginalCopy

OriginalCopy

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

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

View Postjegmihai, on 27 septembrie 2018 - 21:51, said:

Cum se numește mai exact acest sistem bazat pe plugins? Nu am găsit nici o denumire oficială/altceva.

Dacă ai vizionat deja, după experiența acestui proiect vei înțelege că ce zice uncle bob trebuie luat fix ca atare, cuvânt cu cuvânt:

[ https://www.youtube-nocookie.com/embed/asLUTiJJqdE?feature=oembed - Pentru incarcare in pagina (embed) Click aici ]



#162
jegmihai

jegmihai

    Senior Member

  • Grup: Senior Members
  • Posts: 11,536
  • Înscris: 03.09.2013
Mi-am creat propriul model, am reușit să-l folosesc, dar mai am de lucru.

Anunturi

Chirurgia cranio-cerebrală minim invazivă 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

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