Jump to content

SUBIECTE NOI
« 1 / 5 »
RSS
tavan fals rigips

Ce preferați: produse mai scumpe ...

Demagnetizare (minimala) ori ba?

Cum pot sa vad pe un proiector pr...
 Joc Drone

Dropshipping

Sfat achizitie AC Gree Fairy vs P...

MONITOR LG fara sonor !
 Batalia pentru Bucuresti - ND, Fi...

Identificare font

problema ping in jocuri online

Problema calculator
 Samsung Galaxy A35

Sfat pentru aprinderea automata a...

Rfg crescut

Cum reactivez Google Maps?
 

Muncă multă în constructor - da sau ba?

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

#19
Iulius-Foyas

Iulius-Foyas

    Active Member

  • Grup: Members
  • Posts: 1,361
  • Înscris: 21.04.2019
Cand este necesar un obiect intantiat in stare "nevalida" ?  cand  starea de "validitate" a obiectului  depinde de alte obiecte care la timpul curent nu exista.

Exemplu: obiectul table nu poate fii instantiat direct in stare "valida":
Table table  = new Table(); //instantiere in stare "nevalida"
for(int i =0; i<dataSet.size();i++){
	Row row = new Row(); //intializare in stare "nevalida"
	for(int j = 0; j <dataSet.get(i).size(); j++) {
	   Object value =  dataSet.get(i).get(j).getValue();
	   Cell cell = new Cell(value); // initializare in stare  "valida"
		row.add(cell);
	}
	//s-a finalizat definirea completa a obiectului Row din interatia curenta
	table.add(row);
}
//s-a finalizat  definirea completa a obiectului Table din interatiile  anterioare
//prelucrari in continuare cu obiectul Table complet validat


Edited by Iulius-Foyas, 30 April 2019 - 22:06.


#20
Iulius-Foyas

Iulius-Foyas

    Active Member

  • Grup: Members
  • Posts: 1,361
  • Înscris: 21.04.2019
Ai putea spune foarte usor:  "pai pot sa pun ambele for-uri in interiorul obiectului table  intr-o metoda si sa invoca metoda in constructor si gata"
adica:
Class Table() {
//campurile clasei
private DataSet ds;

public Table(DataSet ds) {
	 this.ds = ds;
	 processDataSet();
}

//alte metode publice

//alte metode private
private void processDataSet(){
	 //codul din exemplu anterior aici
}
}

altundeva:
//obiectul dataSet vin din alte obiect
Table table = new Table(dataSet);

Da, se poate asa ceva.Insa daca am un DataSet de 3 milioane de linii si 120 de coloane,
din care doresc  un subset de doar 300 de linii si 4 coloane , atunci varianta anterioara cu buclele for exteriorizate, te avantajeaza.
Insa este drept, ca ai putea face si astfel:
Table table = new Table(dataSet, maxNumberOfRows, maxNumberOfColumns);

Sunt situatii cand instantierea intr-o stare "nevalida" te poate avantaja dar si situatii cand instantiera in stare "valida" te poate avantaja
De aceea aceasta  "validitate" este subiectiva.
Uneori programatorul poate considera ca starea valida al unui obiect sunt totalitatea operatiilor necesare doar pt instantiera obiectului.
Alterori acelasi programator poate considera ca stare valida al unui obiect sunt totalitatea operatiilor necesare doar pt instantiera si pregatirea obiectului
in vederea prelucrarilor ulterioare.
Insa de multe ori programatorii isi creaza clase care pot fi folosite pt a instantia obiecte "atat in stare valida"  cat si in stare "nevalida" in
functie de cum doreste sa foloseasca obiectele  instantiate, ca produse  "valide/nevalide" ale aceluiasi prototip de clasa.

Caz clasic in acest sens: trebuie sa creezi un modul nou intr-un proiect vechi unde s-a lucrat pe un anumit stil si anumita filosofie iar tu (prin regulile interne de scriere a codului)
trebuie sa creezi acel modul in alt stil si alta filosofie.
Atunci creezi un clasa cu rol de "bridge adapter" care permite ca inputurile proiectului vechi sa fie introduse pe acea filosofie si outputul  sa fie scos pe noua filosofie, si atunci
iti trebuie astfel de clase care pot intantia si obiecte "nevalide" si obiecte "valide".

In fond starea de validate o determina programatorul si nu este batuta in cuie.

Edited by Iulius-Foyas, 30 April 2019 - 22:30.


#21
OriginalCopy

OriginalCopy

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

  • Grup: Senior Members
  • Posts: 27,268
  • Înscris: 10.08.2006
N-am citit tot pomelnicul de postari, dar pot spune doar ca metode ca load...Data() n-au ce cauta ca metode publice. Daca e, le apelezi intern, cand e nevoie de informatii in metode care fac lucruri utile.

#22
TS030

TS030

    Guru Member

  • Grup: Senior Members
  • Posts: 15,193
  • Înscris: 25.06.2012
Eu as zice si ca nu exista nici o scuza pentru instantierea unui obiect intr-o stare invalida.
In momentul in care constructorul s-a executat, obiectul este valid - si va continua sa fie, pana la distrugere. Orice altceva este o eroare de design.

#23
Iulius-Foyas

Iulius-Foyas

    Active Member

  • Grup: Members
  • Posts: 1,361
  • Înscris: 21.04.2019

View PostOriginalCopy, on 30 aprilie 2019 - 22:41, said:

N-am citit tot pomelnicul de postari, dar pot spune
Pai daca n-ai citit nu poti spune.Te invit sa le recitesti.

Quote

Daca e, le apelezi intern, cand e nevoie de informatii in metode care fac lucruri utile.
gandirea ta cat si a lui TS030 sunt de fapt gandiri in paradigme imperative insa folosind cod OOP, ceea ce este in opinia mea personala   periculos atunci
cand dezvolti cod OOP.Adica este periculos atunci cand dezvolti cod OOP in paradigma imperativa, in loc sa fie facuta in paradigma OOP .Daca o sa lucrati cu specialisti
OOP (candva in viitor) o sa vi se atraga imediat atentia asupra acestor aspecte.

La revedere.

Edited by Iulius-Foyas, 30 April 2019 - 23:30.


#24
TS030

TS030

    Guru Member

  • Grup: Senior Members
  • Posts: 15,193
  • Înscris: 25.06.2012
As aprecia daca ai face mai putine judecati personale. Nu vreau sa zic mai multe, ca n-are rost.

Ca fapt divers, exemplele cu Table nu sunt OOP.

#25
DemocracySucks

DemocracySucks

    Junior Member

  • Grup: Members
  • Posts: 227
  • Înscris: 06.04.2019

View PostOriginalCopy, on 30 aprilie 2019 - 20:40, said:

state invalid.

View PostTS030, on 30 aprilie 2019 - 23:05, said:

stare invalida.
Definiti state invalid/stare invalida.

#26
OriginalCopy

OriginalCopy

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

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

View PostDemocracySucks, on 01 mai 2019 - 09:48, said:

Definiti state invalid/stare invalida.
state invalid e atunci cand nu poti apela orice metoda publica in orice ordine, cand trebuie sa apelezi foo() inainte de bar(), ambele public.

Unde intra constructorul in joc: daca nu reusesti sa construiesti un obiect valid, mai bine arunci o exceptie, atunci macar nu mai ai un obiect in apelant, decat sa continui sa operezi pe un obiect care va interactiona (cel mai probabil) cu alte obiecte si va corupe date cine stie pe unde.

#27
elbjorn

elbjorn

    Senior Member

  • Grup: Senior Members
  • Posts: 3,085
  • Înscris: 02.09.2016

View Postdexterash, on 30 aprilie 2019 - 01:21, said:

Complet de acord cu tine! Sau nu (prea) ai vrut sa fii un exemplu?
Mea culpa Posted Image
Cratimile sunt o problema veche,

@Iulius-Foyas: Ne omori cu pomelnicele astea. Te rog pune-le in spoiler!

View PostTS030, on 30 aprilie 2019 - 23:05, said:

In momentul in care constructorul s-a executat, obiectul este valid - si va continua sa fie, pana la distrugere. Orice altceva este o eroare de design.
Posted Image

Edited by elbjorn, 01 May 2019 - 10:05.


#28
DemocracySucks

DemocracySucks

    Junior Member

  • Grup: Members
  • Posts: 227
  • Înscris: 06.04.2019

View PostOriginalCopy, on 01 mai 2019 - 09:54, said:

state invalid e atunci cand nu poti apela orice metoda publica in orice ordine, cand trebuie sa apelezi foo() inainte de bar(), ambele public.

Unde intra constructorul in joc: daca nu reusesti sa construiesti un obiect valid, mai bine arunci o exceptie, atunci macar nu mai ai un obiect in apelant, decat sa continui sa operezi pe un obiect care va interactiona (cel mai probabil) cu alte obiecte si va corupe date cine stie pe unde.
Serios? Si cum zici ca ai face o structura de date de tip container ce poate fi inclusiv goala ca varianta perfect valida(ca de aia e container) si ar respecta ce zici tu? In conditiile in care ai sa zicem o metoda get() care evident trebuie sa functioneze doar daca exista ceva de returnat(iar o valoare precum null e perfect valida ca valoare)?

#29
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,235
  • Înscris: 24.02.2007
Un container gol e intr-o stare valida. Un exemplu ipotetic de cum ar putea fi un container gol intr-o stare invalida intalnim in C:
struct IntVector* vector = malloc(sizeof(IntVector));
vector->size = 0; //pana nu fac asta nu pot folosi adecvat vectorul, constructorul ar trebui sa rezolve acest detaliu (si o face in mai toate bibliotecile limbajelor OOP).


Edited by dani.user, 01 May 2019 - 11:23.


#30
OriginalCopy

OriginalCopy

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

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

View PostDemocracySucks, on 01 mai 2019 - 11:04, said:

Serios? Si cum zici ca ai face o structura de date de tip container ce poate fi inclusiv goala ca varianta perfect valida(ca de aia e container) si ar respecta ce zici tu? In conditiile in care ai sa zicem o metoda get() care evident trebuie sa functioneze doar daca exista ceva de returnat (iar o valoare precum null e perfect valida ca valoare)?
O incapsulez in asa fel incat ma pot asigura ca e mereu valida.

#31
DemocracySucks

DemocracySucks

    Junior Member

  • Grup: Members
  • Posts: 227
  • Înscris: 06.04.2019

View Postdani.user, on 01 mai 2019 - 11:21, said:

Un container gol e intr-o stare valida. Un exemplu ipotetic de cum ar putea fi un container gol intr-o stare invalida intalnim in C:
Evident ca e stare valida. Numai ca asta:

View PostOriginalCopy, on 01 mai 2019 - 09:54, said:

state invalid e atunci cand nu poti apela orice metoda publica in orice ordine, cand trebuie sa apelezi foo() inainte de bar(), ambele public.
pica!

Cam trebuie sa folosesti o testare gen if(!(container.isEmpty()) inainte de a apela o metoda ce returneaza ceva din container, gen get()

#32
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,235
  • Înscris: 24.02.2007
Decat acel if prefer sa-mi returneze get un option<ceva>.

#33
OriginalCopy

OriginalCopy

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

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

View PostDemocracySucks, on 01 mai 2019 - 11:38, said:

Cam trebuie sa folosesti o testare gen if(!(container.isEmpty()) inainte de a apela o metoda ce returneaza ceva din container, gen get()
Vorbim despre lucruri diferite.

Acest topic, postarea #1, da de inteles ca e vorba despre ceva specific de business, nu containere generale.

Eu despre aceasta situatie vorbesc.

Tu poti sa iti deschizi topic separat in care sa vorbesti despre orice doresti tu.

View Postdani.user, on 01 mai 2019 - 11:40, said:

Decat acel if prefer sa-mi returneze get un option<ceva>.
Da, asta e o solutie foarte eleganta, pentru ca il forteaza pe apelant sa faca verificarea.

#34
DemocracySucks

DemocracySucks

    Junior Member

  • Grup: Members
  • Posts: 227
  • Înscris: 06.04.2019

View Postdani.user, on 01 mai 2019 - 11:40, said:

Decat acel if prefer sa-mi returneze get un option<ceva>.
Adica sa complici codul aiurea, un container sa-ti returneze un alt container, iar in final de verificare tot nu se scapa(doar muti problema si faci codul mai complex).

Solutia voastra "eleganta" deja da dureri de cap prin java unde au bagat mizeria de Optional<T>

Edited by DemocracySucks, 01 May 2019 - 11:53.


#35
OriginalCopy

OriginalCopy

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

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

View PostDemocracySucks, on 01 mai 2019 - 11:48, said:

Adica sa complici codul aiurea, un container sa-ti returneze un alt container, iar in final de verificare tot nu se scapa(doar muti problema si faci codul mai complex).
Tocmai asta e ideea, sa nu scapi de verificare, sa te asiguri ca verificarea e acolo in apelant. Dar asta e o problema diferita de subiectul acestui topic.

Exemplu mai bun e: Un site are o lista de domenii, si are cel putin un domeniu. Atunci introduci clasa Site. Deasemenea, ai metode de adaugare sau de stergere domenii, iar cea de stergere se asigura ca nu poti sterge ultimul domeniu.

Exemplu usor de inteles ce inseamna sa ai un obiect mereu valid.

Despre asta e acest topic - si despre rolul constructorului.

"Site" este un container (in acest exemplu), dar nu unul generic al carui state valid e si sa fie gol, ci unul specific cu constrangeri din domain logic.

Edited by OriginalCopy, 01 May 2019 - 11:57.


#36
TS030

TS030

    Guru Member

  • Grup: Senior Members
  • Posts: 15,193
  • Înscris: 25.06.2012
Ideea de baza este ca orice clasa/tip de date are un set de invarianti, care sunt stabiliti in constructor si raman valizi orice metode ai apela, pana la distrugerea obiectului.
Un pointer ar putea pointa catre o zona de memorie alocata sau nullptr.
Un container ar putea contine 0 sau mai multe elemente.
Un Site ar putea contine 1 sau mai multe domenii.

Daca trebuie sa mai apelezi o metoda pentru a avea un obiect valid... ai o problema.

Apropo, exemplu banal de cum poti folosi un container fara a verifica daca are sau nu elemente:
auto sum = std::accumulate(begin(cont), end(cont), 0);



Anunturi

Bun venit pe Forumul Softpedia!

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