Bad examples of programming - i.e. code that you shouldn't use at allOverview
End of the year is close to us and we mean that not only serious articles and examples can be useful. Sometimes, wrong approach and/or pieces or code should be helpful for awareness what do and what do not. Let's look at several practical code samples which illustrate (maybe) common mistakes and bad approach.Using variable type with insufficient range
Code piece below tries to display day numbers within common year. Because we need at least 365 days and variable I is defined as a Byte, this procedure never ends. We should use rather "for I:=1 to 365 do ..." (where compiler checks variable range) instead "repeat..until".
Nested "with" clauses
procedure TForm1.Button1Click(Sender: TObject); var I:Byte; begin I:=0; repeat Inc(I); Memo1.Lines.Add('Day number within the year:'+IntToStr(I)); until I=365; end;
Using "With" clause can be reasonable in certain situations but it's generally recommended to avoid using it - main reason is that code written in such way is confusing and unpredictable. Using following code, we probably cause total uncertainty of releasing appropriate objects. Many AV errors can be expected :-)
Ommited "Next" method while going through database table
procedure TForm1.Button1Click(Sender: TObject); var MyList:TStrings; MyForm:TForm; begin MyList:=TStringList.Create; MyForm:=TForm.Create(Self); with MyList do with MyForm do begin Add('Item one'); Memo1.Lines.AddStrings(MyList); Free; end; end;
This mistake occurs very often and no wonder that going through table with few records lasts infinitely:-).
Naming variables anonymously
procedure TForm1.Button1Click(Sender: TObject); begin Table1.Open; while not Table1.EOF do begin MyValue:=Table1ID.Value; Memo1.Lines.Add(MyValue); end; end;
Naming your variables with short names or even letters is fast and handy but can it cause big troubles when you need to edit your code after longer period and aren't sure what every variable means. Using familiar and clear naming conventions for variables, constants and objects is much better way.
procedure TForm1.Button1Click(Sender: TObject); var A, B, C, D, H, I:integer; E, F, G:String; begin for I:=1 to 1000 do begin A:=B+C; E:='Sum B+C is'+IntToStr(A); D:=B-C; F:='Difference B-C is'+IntToStr(D); H:=B*C; G:='Product B*C is'+IntToStr(H); end; end;
Bad using "Next" method when deleting certain records from database table
Sometimes we need to delete set of records in a database table, such as all the records where price of item is greater than 100 (USD). Following approach is wrong and some records will remain undeleted.
procedure TForm1.Button1Click(Sender: TObject); begin Table1.Open; while not Table1.EOF do begin if Table1Price>100 then Table1.Delete; Table1.Next; end; end;
Proper way is very similar but "else" keyword is necessary:
procedure TForm1.Button1Click(Sender: TObject); begin Table1.Open; while not Table1.EOF do begin if Table1Price>100 then Table1.Delete else Table1.Next; end; end;
We're at the end of our New Year programmers jokes. Hope you enjoyed it and found useful. On behalf of Torry.net, I wish you prosperous new year 2018 and all the best!
About the AuthorIng. Karel Janeček, MBA, MSc.