dev.gamez.lv Forum Index dev.gamez.lv
Latvian Game Developers Community
 
 FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups 

Delphi Constructor

 
dev.gamez.lv Forum Index -> Programmēšana
View previous topic :: View next topic  
Author Message
S1
Indago dalībnieks
Indago dalībnieks


Joined: 31 Jul 2005
Posts: 219
Location: Jelgava

PostPosted: Wed Oct 04, 2006 2:29 pm    Post subject: Delphi Constructor

visu laiku esmu kautkā izticis bez šīs lietas... kāds ir PRAKTISKIAS pielietojums Constructor'am un Destructor'am?
Back to top
View user's profile Send e-mail
bubu
Indago Uzvarētājs
Indago Uzvarētājs


Joined: 23 Mar 2004
Posts: 3223
Location: Riga

PostPosted: Wed Oct 04, 2006 3:49 pm    Post subject:

Iedomājies, ka tev ir failu sistēmas wraperis. Failu tu vari atvērt pēc vārda, un tu arī gribi, ka fails tiek vienmēr aizvērts, kad tu beidz lietot objektu.
Kā tu rīkotos? Taisītu klasi ar open(string name) un close() metodēm?
Tādā gadījumā šāds kods varētu izpildīties nekorekti:
Code:
var fails: Fails;
begin
  ... (1)
  fails.open("teksts.txt");
  ... (2) // te izmantojam fails objektu
  fails.close();
end;

Tagad iedomājies, ka (2) vietā pēkšņi notiek exceptions, vai arī tu izdomā iziet no funkcijas (return), vai arī no cikla, kurā tiek izmantots šis fails (break). Tādā gadījumā, ceru, ka pats saproti, ka fails nekad netiks aizvērts! Tas var novest pie dažādām kļūdām - piemēram failu nevarēs atvērt vēlreiz, utt. Tipiskākos gadījumos tas noved pie atmiņas neatbrīvošanas, tātad memory leakiem.

Vēl viens slikts gadījums - tev ir garš kods, kurš var būt nevis vienā fjā, bet vairākās, tb vienā tu uztaisi to faila objektu, citā izmanto. Tad nu iedomājies, ka tu esi nokļūdījies, un (1) vietā mēģini lasīt/rakstīt tajā, pirms esi atvēris failu. Kas notiks? Labākajā gadījumā nekas, sliktākajā programma krašos, jo fails nebūs korekti atvērts/izveidots. Vai redzi, ka tev jāatcerās tik daudz lietu, kuras jāievēro, ja gribi izmantot savu Fails objektu? Un tas rada tikai problēmas - ka jāatcerās daudz. Klases jāveido tā, lai pēc to interfeisa būtu skaidrs kā tās jāizmanto, un tās nedotu iespēju sabojāt programmas darbību ar neuzmanības kļūdām.

Klašu konstruktra būtība ir tāda, ka tā objektu inicializē korektā stāvoklī!! Tb pēc konstruktora izpildīšanās tev nevajadzētu būt iespējas nokrašot programmu, jo objekts ir neinicializēts. Tas pats ir arī ar destruktoru - tas vienmēr izpildās objektam iznīcinoties, tāpēc tas tev dod iespēju izpildīt tajā darbības, kas nodrošinātu korektu resursu atbrīvošanu (faila aizvēršanu, atmiņas atbrīvošanu, datubāzes konekcijas aizvēršanu, tekstūru atbrīvošanu, utt)

Vienkāršākajā gadījumā pareizāk būtu faila konstruktorā padot faila vārdu, kurā tad arī notiktos faila atvēršana, kā arī faila aizvēršanu izpildīt tikai destruktorā automātiski.

Konstuktorā vienmēr vajag inicializēt visus klases mainīgos uz sakarīgām vērtībām (piemēram skaitļus uz 0). Citādi, ja tu tos neinicializēsi, tad var gadīties, ka tajā atmiņas vietā glabāsies kāds mistisks skaitlis, kurš tavās kalkulācijās radīs tikai problēmas.

Kāds no tā visa labums? Tāds pats, kā no cita korekta un pareiza koda. Programmas darbība paliek drošāka, programmēt paliek vieglāk, jo nevajag atcerēties, kurās vietās drīkst vai nedrīkst kautko izmantot.
Back to top
View user's profile Send e-mail
S1
Indago dalībnieks
Indago dalībnieks


Joined: 31 Jul 2005
Posts: 219
Location: Jelgava

PostPosted: Wed Oct 04, 2006 8:03 pm    Post subject:

tas vairs nav pousts, bet gan sakarīgs tutoriālis Very Happy , liels paldies!
Back to top
View user's profile Send e-mail
vampirelli



Joined: 06 Dec 2004
Posts: 36
Location: maaja

PostPosted: Thu Oct 05, 2006 5:19 pm    Post subject:

šito te es nezināju. Liels paldies Very Happy
_________________
kas i ko
Back to top
View user's profile
Display posts from previous:   
dev.gamez.lv Forum Index -> Programmēšana All times are GMT + 2 Hours
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group