Olen vist alates Delphi 1.0 alates igasugu teist koode parandanud ja täiustanud; nüüd on tulnud selliseid pirne, et pidin sellest lausa kirjutama. Öeldakse, inimene kas on programmeerija või ei ole, teisel juhul lihtsalt firma raha raiskaja.
Pirn nr 1: muutuja, mis on kõikjal.
– Globaalsed muutujad on saatanast, nende kasutamine peab olema eriti teadlik tegevus.
Enamasti on globaalsed muutujad eraldi unitis ala teed myglobals uniti;
Parameetrite edastamine ühest protseduurist teise globaalsete muutujate kaudu nimetatakse lausa halvima stiili musternäide.
unit1
…
var
dataindx : integer = 10;
unit2
…
var
dataindx: integer = 15;
ja siis unit3
implementation
uses unit1,unit2;
…
procedure dosomething;
begin
palju arvutusi ja dataindx…
end;
…
Juhul, kui üldse globaalset muutujat oleks vaja kasutada, mis sama nimega, siis ÄÄRMISEL juhul kasutada nii
procedure dosomething;
begin
palju arvutusi ja unit2.dataindx…
end;
Pärast leidsin ka protseduure, kus sisemiselt oli sama nimega muutuja defineeritud. Siis imestati, miks kusagil mingi array index üle piiride lendab.
Pirn nr 2: loodud globaalne massiiv A : Array[1..20000] of shortstring;
Selline praktika täiesti mõeldamatu, et nii andmeid hoida, seal oleks täiesti sobilik olnud TStringlist
või äärmisel juhul.
type
TStrArr = Array of string;
var
B : TStrArr;
….
setlength(b,512);
Pirn nr 3 Visuaalses pooles täielik käkerdamine.
Kui objektidel on property Enabled, siis kasutati hoopis võrdlemisel Color property’d ala objekt keelatud color=btnFace.
Pirn nr 4 Sul on ekraanil 95 visuaalset objekti ja tahad need korraga, kas enableda või disableda. Sa ei hakka ju tegema (aga reaalsuses tehti):
label1.enabled:=false;
label2.enabled:=false;
edit1.enabled:=false;
Teed omale utilities moodulisse funktsioonis, mis käib vormi komponendid üle ja vaatab, kas on enabled property olemas ning vastavalt soovile see kas true / false.
Pirn nr 5 Juhul, kui vaja andmebaasi mingid väärtused salvestada ning sa ei saa TDbComboboxi kasutada ning kasutad tavalist comboboxi, aga kuidas hoida indekseid ja valikuid jälgida.
Kood, mille mina leidsin sealt – Query abil loetakse andmed combosse;
Siis, kui tuli salvestamine kood: HARDCODED nimed;
if mycombo.text=’Goods’ then value:=1
else
if mycombo.text=’Cars’ then value:=2
Täielik katastroof, tootesse ei tohi kunagi midagi niimoodi hardcoded stiilis kirjutada.
Juhul, kui tavaline combo, siis tuleks ka nimetusega siduda väärtus, mis baasist tuli.
select id,name from …
while ….
if fieldbyname(’id’).asInteger>0 then
cmb.addobject(fieldbyname(‘name’).asString,TObject(Cardinal(fieldbyname(’id’).asInteger)));
end
Hiljem, kui väärtus valitud saab teha
id:= …Cardinal(objects[i]);
Täiesti lubatud lahendus, kui id väärtus jääb Cardinali väärtuse vahemikku. Pointer objektile ei pea olema objekt. Lihtsalt, kui addobject(…,TMyData.create(id)) teha, siis on oht, et hiljem unustatakse see abistav klass vabastada ! Seda viga esineb liiga palju.
Ka oli lahedust kasutatud, kus combo element oli stiilis
Car[ja mingi 1000 tühikut] :5
Pirn nr 6
Iga andmebaasi tegevuse jaoks oli tehtud oma query, datamodule oli nii kirju, et mul lõi endal pildi virvendama. Ntx kontrollpäringuid oleks saanud vabalt teha läbi ühe query.
Pirn nr 7
Jube palju kasutati andmebaasi puhul variante.
fieldbyname(‘somevalue’).value:=’A’;
fieldbyname(‘somevalue’).value:=123;
Seetõttu leidsin ikka X vigu, kus tuli invalid conversion. Üldiselt variant ka muutuja, mida tohib kasutada ainult teadlikult. Suurem rakendus neil pigem ActiveX juures, muidu kui on võimalik neid vältida, vältige
Pirn nr 8
Muutujate nimed ka täiesti kaootilised. Ühe protseduuri all võis olla kuni 40 muutujat stiilis aaaa,b1,c3,kkk,da,pbb ……
…nii side lõpp…üritan midagi ilusat mõeldaselle leitud kaose kõrvale.