Hoofdcategorieën
Topicacties

[Alg] Slechtste programmeervoorbeelden deel 3

Pagina: 1 2 3 4 ... 29 30 31 32 33 34 35 36 37 38 39 40 41 last

Nieuw Topic
Berichten: 1.168
Reg. datum: 24 maart 2004

quote:
Niekk schreef op zaterdag 12 juli 2008 @ 19:56:
[...]

.. ?
Dat stukje was PHP, dus waarom praat jij dan over JAVA? Ik volg het even niet meer. :+
Hij geeft aan dat zulke fouten vaker voorkomen, bijvoorbeeld in Java.

Het valt me op dat do..while loops weinig gebruikt worden. Dan zie je zoiets:
C++:
1
2
3
4
5
6
7
/* skip header */
string line;
line = file.readLine();

while (isHeader(line)) {
  line = file.readLine();
}

Met een do..while zonder code duplicatie:
C++:
1
2
3
4
5
/* skip header */
string line;
do {
  line = file.readLine();
while (isHeader(line));

FZR 600R
Berichten: 6.213
Reg. datum: 27 augustus 2001

Nouja, omdat die 2e constructie wellicht veel onbekender is bij programmeurs :P?

Ik heb er mijn allereerste C# (e)book nog eens op nageslagen (het eerste boek waaruit wij op het HBO programmeerles kregen), daarin zie je ook alleen de eerste constructie terug.

In het volgende boek staat deze constructie wel, maar dan slaan we de basis natuurlijk over...waardoor de meeste studenten het dus alsnog niet leren kennen.

slindenau wijzigde dit bericht 12-07-2008 20:45 (28%)

Liberate tutame ex inferis.
"De programma’s die we gebruiken zijn eigenlijk zo ontworpen dat ze allemaal onze aandacht opeisen als een stel dreinende peuters."

Berichten: 5.666
Reg. datum: 02 februari 2004

Er staat mij iets bij dat ergens in een boek werd afgeraden om de do-while te gebruiken, maar ik zou eigenlijk niet meer weten waarom dat zou zijn.

Kater? Eerst water, de rest komt later
Bouw mee aan Tweak-City! Topic

She's tha BOMB SHAKIRA

quote:
JanDM schreef op zaterdag 12 juli 2008 @ 20:37:
[...]

Hij geeft aan dat zulke fouten vaker voorkomen, bijvoorbeeld in Java.

Het valt me op dat do..while loops weinig gebruikt worden. Dan zie je zoiets:
C++:
1
2
3
4
5
6
7
/* skip header */
string line;
line = file.readLine();

while (isHeader(line)) {
  line = file.readLine();
}

Met een do..while zonder code duplicatie:
C++:
1
2
3
4
5
/* skip header */
string line;
do {
  line = file.readLine();
while (isHeader(line));

Zie dit nog wel regelmatig, is ook geleerd tijdens programeren met C++, While is voorwaarde controle vooraf, DoWhile is voorwaarde controle achteraf
Hoi :w
Berichten: 200
Reg. datum: 26 mei 2006

Inderdaad daarmee verzorg je dus dat je code na do { altijd 1x word uitgevoerd. Maar do while loop is ook equivalent aan:
C++:
1
2
3
4
5
6
7
8
9
10
do {
   foo();
while (conditie);

==

while (true) {
   foo();
   if (!conditiebreak;
}

Wouser wijzigde dit bericht 12-07-2008 21:50 (45%)

 
Berichten: 426
Reg. datum: 04 april 2007

hmm, ik heb waarschijnlijk een eigenaardige hersenkronkel, maar maak wel graag gebruik vaak do-while, op gepast moment uiteraard.

ook heb ik de switch graag:
Dit stukje komt uit het eerste bestand dat ik open had staan:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php
        switch (true)
        {
            case isset($_POST['delete']):
            
                $query = 'DELETE FROM `store` WHERE `id` = '.$productid.' LIMIT 1;';
                $db->query($query);

            break;
            case isset($_POST['update']):
                $query = 'SELECT * FROM `store` WHERE id='.$productid.' LIMIT 1;';
                $db->query($query);
                $product = $db->fetch();
                $title = $product['title'];
                $description = $product['description'];
                $ref = $product['ref'];
                $price = $product['price'];
                
                include('resources/apps/store/product_p1.php');
            break;
        }
?>

Zoiets kan dus ook met if, of if elseif, maar ik vind het overzichtelijker, en flexibeler zo.

g4wx3 wijzigde dit bericht 12-07-2008 22:40 (4%)

Berichten: 553
Reg. datum: 04 mei 2003

Het zal aan mij liggen, ik vind switch enorm handig, maar in jou voorbeeld eigenlijk helemaal niets. Gebruik switch wel veel tijdens tekst-verwerk dingen, met iets als
Java:
1
2
switch (string.charAt(index)) {
}

Maar jou ding: Wat als zowel update als delete is gezet <gerommel met input waarschijnlijk>, maar toch. Vind dit nou juist niet overzichtelijker en flexibeler dan ifs.
 
CiPHER

Ik zie daar ook totaal de meerwaarde niet van een switch, en alleen maar de foutgevoeligheid bij het vergeten van een break.

Enige keren dat ik een switch gebruik is wanneer meerdere condities dezelfde uitvoer moeten geven, voor de rest altijd elseif's. Als je dan een accolade vergeet heb je tenminste nog een parse-error

frickY wijzigde dit bericht 12-07-2008 23:22 (12%)

Lágrimas negras
Berichten: 17.144
Reg. datum: 31 mei 2001

quote:
g4wx3 schreef op zaterdag 12 juli 2008 @ 22:36:
hmm, ik heb waarschijnlijk een eigenaardige hersenkronkel, maar maak wel graag gebruik vaak do-while, op gepast moment uiteraard.

ook heb ik de switch graag:
Dit stukje komt uit het eerste bestand dat ik open had staan:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php
        switch (true)
        {
            case isset($_POST['delete']):
            
                $query = 'DELETE FROM `store` WHERE `id` = '.$productid.' LIMIT 1;';
                $db->query($query);

            break;
            case isset($_POST['update']):
                $query = 'SELECT * FROM `store` WHERE id='.$productid.' LIMIT 1;';
                $db->query($query);
                $product = $db->fetch();
                $title = $product['title'];
                $description = $product['description'];
                $ref = $product['ref'];
                $price = $product['price'];
                
                include('resources/apps/store/product_p1.php');
            break;
        }
?>

Zoiets kan dus ook met if, of if elseif, maar ik vind het overzichtelijker, en flexibeler zo.
Ik vind het vreselijk.
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
// ...
if ( $contract$model->contract->getRecordById ( $request->contract_id ) ) ) {
   switch ( $request->action ) {
      case 'edit':
         $this->handleEditRequest ( $request$contract );
         break;
      case 'resign':
         $this->handleResignRequest ( $request$contract );
         break;
   }
}
// ...
?>

Beter nog (want weg is je switch):
PHP:
1
2
3
4
5
6
7
8
9
10
<?php
// ...
if ( $contract$model->contract->getRecordById ( $request->contract_id ) ) ) {
   call_user_func (
      array ( $thissprintf ( 'handle%sRequest'convert::dash2camel ( $request->action ) ) ),
      array ( $request$contract )
   );
}
// ...
?>

En dan natuurlijk functies als:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<?php
// ...
/**
 * Blah blah
 *
 * @param Request $request The request object that is to be handled.
 * @param ContractRecord $contract The contract object that is to be resigned if possible.
 * @return boolean TRUE if the contract could be resigned, FALSE otherwise.
 */

public function handleResignRequest ( Request $requestContractRecord $contract ) {
   $model = $this->getModel ();
   $view  = $this->getView ();

   if ( $result = $contract->resign ( $model$request->resign_date ) ) {
      $message = "Het contract is opgezegd per %s.";
   } else {
      $message = "Het contract kan pas worden opgezegd per %s.";
   }

   $view->message = sprintf (
      nls::translate ( $message ),
      $contract->getDisplayValue ( $contract->entity->resign_date )
   );

   return $result;
}
// ...
?>

Iets dergelijks is een stuk eleganter dan overal strooien met mysql_query, $db->query, $_POST en allerlei low-level stuff. Daar wil je je op applicatieniveau toch helemaal niet meer mee bezighouden? Uiteraard was dit even snel ingeklopte code, maar het gaat om het idee.

I finally found you, my personal slaughter. As an appetizer, I let you taste my daughter!
Call me sick but this is what I need. My only purpose here is for you to feed!

Human-readable is relatief
Berichten: 184
Reg. datum: 01 september 2007

Wow! Dit zie ik voor het eerst. Kent PHP typecasting ? In C doen "we" inderdaad:
code:
1
2
3
int nice_stuff(int i, int j) { /* deze line bedoel ik dan */
    return i + j;
}

maar kent PHP dat ? want PHP is een taal zonder types, toch ?!

Niekk wijzigde dit bericht 13-07-2008 11:45 (6%)

Vind jij dat ook niet ?

Oosterplas Panorama

quote:
Niekk schreef op zondag 13 juli 2008 @ 11:35:
maar kent PHP dat ? want PHP is een taal zonder types, toch ?!
Sinds PHP5 kan je opgeven of parameters arrays of objecten zijn. De andere standaard types kan je stupide genoeg nog niets mee.

Verder kent PHP wél types en kan je wél casten. Anders is de conversie tussen standaard types automagisch, maar die is vaak genoeg ongewenst (string '123abc' wordt int 123 8)7 ). Anyway, ga je mond spoelen en lees het hoofdstuk over data types nog een keer. :>

Voutloos wijzigde dit bericht 13-07-2008 11:46 (3%)

Talkin.nl daily photoblog
Day 984: Oosterplas Panorama
Foto specs: Canon 300D, Tamron 17-50 f/2.8, 1/640s, f/7.1, ISO 200

No time for love, doctor Jones
Berichten: 5.392
Reg. datum: 20 september 2001

PHP is idd worst-of-both-worlds: wel gezeur met type conversie, maar geen type safety ;)
 
Berichten: 3.630
Reg. datum: 12 februari 2001

Leuke vergelijking:

In PHP:
Hoeveel is 'appel' + 'peer'? Antwoord: 0.
Hoeveel is 'appel' + '42'? Antwoord: 42.
Hoeveel is 'appel' + 42? Antwoord: 42.

In Python:
code:
1
2
3
4
5
6
7
8
>>> 'appel' + 'peer'
'appelpeer'
>>> 'appel' + '42'
'appel42'
>>> 'appel' + 42
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
TypeError: cannot concatenate 'str' and 'int' objects

Ik weet wel wat ik logischer vind. :)

| Last.fm | "Mr Bent liked counting. You could trust numbers, except perhaps for pi, but he was working on that in his spare time and it was bound to give in sooner or later." -Terry Pratchett

FZR 600R
Berichten: 6.213
Reg. datum: 27 augustus 2001

Maar dat komt meer omdat de + in Python/Java/C(#) twee functies heeft die in PHP zijn opgesplitst naar 2 operators...namenlijk:
Numeriek optellen: +
Concat strings: .

In alle overige genoemde talen hangt het dus van de objecten links en rechts van de + af wat er gebeurt, en wanneer er geen match gevonden wordt krijg je een exception.

Bij PHP gaat ie gewoon alles op proberen te tellen :). Daarbij komt inderdaad wel kijken dat PHP heel makkelijk getallen ziet in/maakt van niet-integer-objecten :).

Liberate tutame ex inferis.
"De programma’s die we gebruiken zijn eigenlijk zo ontworpen dat ze allemaal onze aandacht opeisen als een stel dreinende peuters."

Oosterplas Panorama

Leuk, maar dat soort voorbeelden is vaak genoeg ook wel erg geforceerd. Ik weet wel wanneer ik een sommetje doe of wat strings aan elkaar plak, en daar zijn aparte operators voor. :z Ik ben geen php weak typing jehova, maar er valt best mee te werken.

Talkin.nl daily photoblog
Day 984: Oosterplas Panorama
Foto specs: Canon 300D, Tamron 17-50 f/2.8, 1/640s, f/7.1, ISO 200

Human-readable is relatief
Berichten: 184
Reg. datum: 01 september 2007

quote:
Voutloos schreef op zondag 13 juli 2008 @ 11:46:
[...]
Sinds PHP5 kan je opgeven of parameters arrays of objecten zijn. De andere standaard types kan je stupide genoeg nog niets mee.

Verder kent PHP wél types en kan je wél casten. Anders is de conversie tussen standaard types automagisch, maar die is vaak genoeg ongewenst (string '123abc' wordt int 123 8)7 ). Anyway, ga je mond spoelen en lees het hoofdstuk over data types nog een keer. :>
Klopt. Ik vind dat PHP een taal zou moeten zijn die zich wel eits aantrekt van types. Dit voorkomt zoveel fouten. je kan opgeven of iets een array of object moet zijn, maar dit vind ik nutteloos. Waarom niet int vs string o.i.d. ? Dat is juist waar PHP "moeite" mee heeft. (zoals dat 123 voorbeeld dat je gaf)

Vind jij dat ook niet ?

Oosterplas Panorama

Het is halfbakken en het voorkomt hiipe features als method overloading. Het string '123abc' is natuurlijk net zo geforceerd als wat ik in voorgaande post zei. :P

Talkin.nl daily photoblog
Day 984: Oosterplas Panorama
Foto specs: Canon 300D, Tamron 17-50 f/2.8, 1/640s, f/7.1, ISO 200

Human-readable is relatief
Berichten: 184
Reg. datum: 01 september 2007

quote:
Voutloos schreef op zondag 13 juli 2008 @ 13:00:
Het is halfbakken en het voorkomt hiipe features als method overloading. Het string '123abc' is natuurlijk net zo geforceerd als wat ik in voorgaande post zei. :P
je hebt wel gelijk, ik moet zeggen dat ik er niet zo erg veel last van heb. Maar 't is niet goed vind ik.

Vind jij dat ook niet ?

She's tha BOMB SHAKIRA

quote:
Jaap-Jan schreef op zondag 13 juli 2008 @ 12:10:
Leuke vergelijking:

In PHP:
Hoeveel is 'appel' + 'peer'? Antwoord: 0.
Hoeveel is 'appel' + '42'? Antwoord: 42.
Hoeveel is 'appel' + 42? Antwoord: 42.

In Python:
code:
1
2
3
4
5
6
7
8
>>> 'appel' + 'peer'
'appelpeer'
>>> 'appel' + '42'
'appel42'
>>> 'appel' + 42
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
TypeError: cannot concatenate 'str' and 'int' objects

Ik weet wel wat ik logischer vind. :)
In deze lijn kan ook snel de volgende fout gemaakt worden:
PHP:
1
2
3
4
5
6
7
<?php

if (0 == "") {
    echo "This is wrong!";
}

?>


Acties: [view]


Door: Creepy
Moderator PRG/SEA/DTE
Eye Have You
Berichten: 13.126
Reg. datum: 01 juni 2001

quote:
Jaap-Jan schreef op zondag 13 juli 2008 @ 12:10:
Leuke vergelijking:

In PHP:
Hoeveel is 'appel' + 'peer'? Antwoord: 0.
Hoeveel is 'appel' + '42'? Antwoord: 42.
Hoeveel is 'appel' + 42? Antwoord: 42.

In Python:
code:
1
2
3
4
5
6
7
8
>>> 'appel' + 'peer'
'appelpeer'
>>> 'appel' + '42'
'appel42'
>>> 'appel' + 42
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
TypeError: cannot concatenate 'str' and 'int' objects

Ik weet wel wat ik logischer vind. :)
Dan vergeet je voor het gemak dat PHP een string concatenation operator heeft?

En je laat het leukste voorbeeld weg :P
PHP:

1
<?php
echo "40 appels" + "50 peren";
?>

Geeft 90 ;)

Creepy wijzigde dit bericht 13-07-2008 14:13 (4%)

- Ik kan niet zingen, geen gitaar spelen en niet drummen.... ik hou het wel bij Rock Band
Juist dan gaan mensen het weer prachtig vinden (Denk aan de josty band *blauw* *blauw* *rood*, *blauw* *blauw* *rood)

FZR 600R
Berichten: 6.213
Reg. datum: 27 augustus 2001

90 wat ;)?

Liberate tutame ex inferis.
"De programma’s die we gebruiken zijn eigenlijk zo ontworpen dat ze allemaal onze aandacht opeisen als een stel dreinende peuters."

Berichten: 426
Reg. datum: 04 april 2007

Inderdaad, ik, ik ken geen andere talen dan PHP en JS, maarik zou het toch veel aangenamer vinden als php stricter was met gegevenstypes.
Ik heb er opzich geen last van, maar vind het wel een onlogica dat je appelen en peren (zogezegd) bij elkaar kan optellen, dat zou een fout moeten geven, net als if('1'==1) false zou moeten returnen. Dan weet je pas of je programma zonder flaws is geschreven

@hierboven HAHAHA, die is geweldig!

g4wx3 wijzigde dit bericht 13-07-2008 14:24 (24%)

heeft een echte avatar

quote:
Stuks fruit natuurlijk ;)

More than meets the eye
There is no I in TEAM... but there is ME
Stanzinist | system specs

...has a Kirika fetish
Berichten: 1.973
Reg. datum: 30 maart 2003

quote:
Creepy schreef op zondag 13 juli 2008 @ 14:12:
En je laat het leukste voorbeeld weg :P
PHP:

1
<?php
echo "40 appels" + "50 peren";
?>

Geeft 90 ;)
Iedereen weet dat de peer de tegenpool is van de appel. Het antwoord dat PHP dus geeft is dus fout. Het juiste antwoord moet zijn: "10 peren".

:+

Ipsa Scientia Potestas Est
Touching is Good! | Younha \o/

programulator
Berichten: 21.027
Reg. datum: 26 september 2000

quote:
Niekk schreef op zaterdag 12 juli 2008 @ 13:28:
de officiele regels voor C zijn nog raarder vind ik.
Officiele C regels? Kom op zeg :). Er is K&R style, maar er zijn geen officiele regels voor C.
quote:
Wouser schreef op zaterdag 12 juli 2008 @ 21:48:
Inderdaad daarmee verzorg je dus dat je code na do { altijd 1x word uitgevoerd. Maar do while loop is ook equivalent aan:
C++:
1
2
3
4
5
6
7
8
9
10
do {
   foo();
while (conditie);

==

while (true) {
   foo();
   if (!conditiebreak;
}

Nee, dat is het niet. Een continue in de loop zal in het eerste geval conditie opnieuw checken, maar in het tweede geval niet.
quote:
Cheatah schreef op zaterdag 12 juli 2008 @ 23:59:
Beter nog (want weg is je switch):
PHP:
1
2
3
4
5
6
7
8
<?php
// ...
if ( $contract$model->contract->getRecordById ( $request->contract_id ) ) ) {
   call_user_func (
      array ( $thissprintf ( 'handle%sRequest'convert::dash2camel ( $request->action ) ) ),
      array ( $request$contract )
   );
}

Ik vind dat allesbehalve beter. Als er een keer een foute waarde in $request->action staat ben je de sjaak (zeker als die foute waarde toevallig ook nog eens resulteert in een daadwerkelijke functie). Met een switch is je code duidelijker en veiliger.
quote:
g4wx3 schreef op zondag 13 juli 2008 @ 14:21:
Ik heb er opzich geen last van, maar vind het wel een onlogica dat je appelen en peren (zogezegd) bij elkaar kan optellen, dat zou een fout moeten geven, net als if('1'==1) false zou moeten returnen. Dan weet je pas of je programma zonder flaws is geschreven
Als je dat wilt dan kun je === en !== gebruiken - die controleert ook of de typen overeen komen. Op zich vind ik het niet raar dat "1"==1 gelijk is aan true. Ik vind het wel raar dat "boom" == 0 gelijk is aan true.

.oisyn wijzigde dit bericht 13-07-2008 17:32 (97%)

Pagina: 1 2 3 4 ... 29 30 31 32 33 34 35 36 37 38 39 40 41 last


Dit topic is gesloten.


VNU Media logo Powered by True

© 1998 - 2008 Tweakers.net - Alle rechten voorbehouden

Uitgever van: