[alg] Slechtste programmeervoorbeelden deel 4 Vorige deel Overzicht Laatste deel

Dit topic is onderdeel van een reeks. Ga naar het meest recente topic in deze reeks.

Pagina: 1 ... 78 ... 103 Laatste
Acties:
  • 993.627 views

Acties:
  • 0 Henk 'm!

  • hgp
  • Registratie: Juni 2008
  • Laatst online: 24-09 21:26

hgp

De laatste 40 regels van een 450 regels lange functie waar ik wat in aan heb moeten passen. De rest van de code past ook goed in dit topic maar ik denk dat dit wel genoeg is :P

Visual Basic:
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
29
30
31
32
33
34
35
36
37
38
39
40
...code..
                                                        End If
                                                        
                                                        pSQL = ""
                                                        Call DB.Execute(pSQL)
                                                        
                                                    End If
                                                Else
                                                    ' Niets gevonden. Dat kan niet?!?
                                                End If
                                                Set rs4 = Nothing
                                            End If
                                            
                                        Case Else
                                            Debug.Print ("")
                                        End Select  ' Select Case (CLng(rs3!ba1.Type))
                                    End If   ' If (Not IsNull(rs3!ba1.Type)) Then
                                End If   ' If (Not (rs3.BOF And rs3.EOF)) Then
                                Call rs3.Close
                                Set rs3 = Nothing
                                DoEvents
                            End If   ' If (Not (rs3 Is Nothing)) Then
                            rs2.MoveNext
                            DoEvents
                        Loop Until rs2.EOF   ' Do
                        rs2.Close
                        Set rs2 = Nothing
                        
                    Else
                        ' 
                        ' 
                    End If   ' If (Not (rs2.BOF And rs2.EOF)) Then
                End If   ' If (Not (rs2 Is Nothing)) Then
                rs.MoveNext
                DoEvents
            Loop Until rs.EOF   '  Do
        End If  ' If (Not (rs.BOF And rs.EOF)) Then
        rs.Close
        Set rs = Nothing
    End If  ' If (Not (rs Is Nothing)) Then

Acties:
  • 0 Henk 'm!

  • Quincy5
  • Registratie: November 2006
  • Laatst online: 24-09 16:01
Behalve misschien de lege else-clausules zie ik er niet echt iets mis mee. De commentaren achter de End If's zijn juist nuttig voor het overzicht.

PV Output


Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Ehm nee? :X :r

Dat commentaar is überfout, want het legt niets uit. Het lijkt hier enkel handig omdat het een wanhoopspoging tot overzicht in een te diep geneste, 450 regels tellende, brei is. En dat is dus enkel symptoombestrijding ipv een nettere structurele oplossing zoals bijvoorbeeld meer functies en dergelijke gebruiken.

Plus tal van mogelijke problemen zoals bijvoorbeeld achterhaalde comments wanneer de if conditie zelf een keer bijgeschaafd wordt etc etc.

{signature}


Acties:
  • 0 Henk 'm!

  • hgp
  • Registratie: Juni 2008
  • Laatst online: 24-09 21:26

hgp

Welk overzicht? :+

Bij een functie van 450 regels code met ongeveer 15 geneste if/do/select's heb ik geen overzicht meer. Het dubbel op moeten schrijven van je code om weer een soort van overzicht te krijgen vind ik ook geen goed idee.

wat Voutloos zegt dus :)

[ Voor 11% gewijzigd door hgp op 10-12-2011 23:11 ]


Acties:
  • 0 Henk 'm!

  • RTG
  • Registratie: Mei 2009
  • Niet online

RTG

Quincy5 schreef op zaterdag 10 december 2011 @ 22:46:
Behalve misschien de lege else-clausules zie ik er niet echt iets mis mee. De commentaren achter de End If's zijn juist nuttig voor het overzicht.
Code hoort voor zichzelf te spreken en commentaar hoort iets toe te voegen wat niet uit de code kan blijken. Als je commentaar nodig hebt om iets duidelijk te maken wat uit de code zou kunnen blijken dan zit je code misschien niet helemaal lekker in elkaar. ;)

Acties:
  • 0 Henk 'm!

  • Gomez12
  • Registratie: Maart 2001
  • Laatst online: 17-10-2023
RTG schreef op zaterdag 10 december 2011 @ 23:38:
[...]

Code hoort voor zichzelf te spreken en commentaar hoort iets toe te voegen wat niet uit de code kan blijken. Als je commentaar nodig hebt om iets duidelijk te maken wat uit de code zou kunnen blijken dan zit je code misschien niet helemaal lekker in elkaar. ;)
Als je dat wilt dan moet je je code binair gaan schrijven, dan is elke regel op zichzelf duidelijk.

In real-world loop je wel eens tegen insider-dingetjes of formules aan waardoor het voor de leek niet direct duidelijk is en je dus commentaar nodig hebt

Acties:
  • 0 Henk 'm!

  • jip_86
  • Registratie: Juli 2004
  • Laatst online: 24-09 21:51
Ja precies. Hier laatst ook, belt iemand met een bug. Ga je uitzoeken waar het aan ligt. Kom je echt op een regel code uit op een plek waarvan je denkt WTF, waarom staat dat op zo'n plek :?

Ik had het wel prettig gevonden als er bij stond waarom. De veroorzaker was uiteraard op vakantie.

[ Voor 26% gewijzigd door jip_86 op 11-12-2011 01:05 ]


Acties:
  • 0 Henk 'm!

  • RTG
  • Registratie: Mei 2009
  • Niet online

RTG

Gomez12 schreef op zondag 11 december 2011 @ 00:12:
[...]

Als je dat wilt dan moet je je code binair gaan schrijven, dan is elke regel op zichzelf duidelijk.

In real-world loop je wel eens tegen insider-dingetjes of formules aan waardoor het voor de leek niet direct duidelijk is en je dus commentaar nodig hebt
Ik zeg toch niet dat commentaar niet nuttig kan zijn... :?

Het gaat erom dat commentaar hoort te zeggen wat code niet kan zeggen. In het geval van hgp wordt de code gewoon herhaalt in comments, voegt het dus niks toe en is het onnodige ruis die de code juist nog onleesbaarder en fragieler maakt.

Acties:
  • 0 Henk 'm!

  • MacWolf
  • Registratie: Januari 2004
  • Laatst online: 06-09-2024
Ik moet in een project werken waar de volgende code in zit (geschreven door Indiërs):

C:
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
- (void) setViewForTabNo:(int) tabNumber
{
    UIImage *imgHorLine = [UIImage imageWithContentsOfResolutionIndependentFile:[DOCUMENTS_DIR stringByAppendingPathComponent:@"horizontal_line.png"]];
    
    GeneralRecordData *theData = [self.detailViews objectAtIndex:0];
    
    if(theData.isAgenda)
    {
        if(tabNumber > 0)
        {
            return;
        }
        
      
        if(theData.isAttandeeEnabled)
        {
            UIView *attendingView = [[UIView alloc] initWithFrame:CGRectMake(0, 0,320, 480)];
            attendingView.backgroundColor = [UIColor clearColor];
            
            [segmentsTitles addObject:@"Attending"];
            self.videoView = [[[VideosView alloc] initWithNibName:@"VideosView" bundle:[NSBundle mainBundle]]autorelease];
            GeneralRecordData *theData = [detailViews objectAtIndex:0];
            videoView.tmp = theData.eventId;
            videoView.argument = theData.dataType;
            videoView.tableDataType = agendaAttendees;
            videoView.customSelector = @selector(getDataForAgendaAttendees);
            videoView.viewWithTabsObj = self;
            [videoView.youTubeTableView layoutIfNeeded];
            
            [attendingView addSubview:[videoView view]];
            [videoView.youTubeTableView setFrame:CGRectMake(0, 40, 320, 480 - (50 + 40 + 40))];
            
            CustomFont *pplFont = [NSKeyedUnarchiver unarchiveObjectWithData:[[NSUserDefaults standardUserDefaults] objectForKey:@"font_4"]];
         
            self.labelPplGoing = [[[UILabel alloc] initWithFrame:CGRectMake(10, 10, 200, 20)] autorelease];
            [labelPplGoing setBackgroundColor:[UIColor clearColor]];
            [labelPplGoing setFont:[UIFont fontWithName:pplFont.name size:[pplFont.size floatValue]]];
            [labelPplGoing setTextColor:pplFont.color];
            [attendingView addSubview:labelPplGoing];
            
            CustomFont *customFont = [NSKeyedUnarchiver unarchiveObjectWithData:[[NSUserDefaults standardUserDefaults] objectForKey:@"font_1"]];
            self.btnIamGoing = [[[UIButton alloc] initWithFrame:CGRectMake(220, 10, 88, 25)] autorelease];
            [btnIamGoing setBackgroundImage:[UIImage imageWithContentsOfResolutionIndependentFile:[DOCUMENTS_DIR stringByAppendingPathComponent:@"button_medium.png"]] forState:UIControlStateNormal];
            [btnIamGoing setBackgroundImage:[UIImage imageWithContentsOfResolutionIndependentFile:[DOCUMENTS_DIR stringByAppendingPathComponent:@"button_medium_press.png"]] forState:UIControlStateHighlighted];
            
            self.isUpcomingAgenda = theData.isUpcomingAgenda;
            
            if(self.isUpcomingAgenda)
                [btnIamGoing setTitle: @"I am going!" forState:UIControlStateNormal];
            else
                [btnIamGoing setTitle:@"I went" forState:UIControlStateNormal];
            
            [btnIamGoing addTarget:self action:@selector(btnIamGoingClicked:) forControlEvents:UIControlEventTouchUpInside];
            btnIamGoing.titleLabel.font = [UIFont fontWithName:customFont.name size:[customFont.size floatValue]];
            [btnIamGoing setTitleColor:customFont.color forState:UIControlStateNormal];
         
            [attendingView addSubview:btnIamGoing];
            self.btnIamGoing = nil;
            
            [attendingView setHidden:TRUE];
            [containerView addSubview:attendingView];
            [segmentViews addObject:attendingView];
            [attendingView release];
            
        }
        if(theData.isPhotoEnabled)
        {
         
            [segmentsTitles addObject:@"Photos"];
            self.tempPhotoView = [[[PhotoView alloc] initWithNibName:@"PhotoView" bundle:[NSBundle mainBundle]] autorelease];
            tempPhotoView.commentEnabled = theData.isCommentEnabledOnPictures;
            tempPhotoView.likeEnabled = theData.isLikeEnabled;
            tempPhotoView.eventId = theData.eventId;
            tempPhotoView.dataType = theData.dataType;
            tempPhotoView.uploadType = UploadTypeAgenda;
            tempPhotoView.AlbumId = theData.albumId;
            tempPhotoView.uploadEnabled = theData.enablePhotoUpload;
            tempPhotoView.view.backgroundColor = [UIColor clearColor];
            [segmentViews addObject:tempPhotoView.view];
            [containerView addSubview:tempPhotoView.view];
         
         
        }
        if(theData.isCommentEnabled)
        {
            [segmentsTitles addObject:@"Comments"];

         CommentData *commentData = [[CommentData alloc] init];
         [commentData setIdentifier:theData.Id];
         [commentData setGuid:theData.Id];
         [commentData setMediaId:theData.Id];
         [commentData setTargetId:theData.Id];
         [commentData setType:theData.dataType];

         viewController = [[CommentsViewController alloc] initWithFormId:theData.formId 
                                                                                          feedId:theData.feedId 
                                                                                     isReplyView:YES 
                                                                                   isLikeEnabled:NO 
                                                                                            data:commentData 
                                                                            parentViewController:self];
         [viewController.view setFrame:CGRectMake(0.0f, 0.0f, 320.0f, 360.0f)];
         [segmentViews addObject:viewController.view];
         
        }
        
        if(theData.isMapEnabled)
        {
            
            CustomFont *font = [NSKeyedUnarchiver unarchiveObjectWithData:[[NSUserDefaults standardUserDefaults] objectForKey:@"font_1"]];
            
            UIButton *showMapButton = [[UIButton alloc] initWithFrame:CGRectMake(215, 125, 100, 20)];
            
            [showMapButton setBackgroundImage:[UIImage imageWithContentsOfResolutionIndependentFile:[DOCUMENTS_DIR stringByAppendingPathComponent:@"button_small.png"]] forState:UIControlStateNormal];
            [showMapButton addTarget:self action:@selector(showMap:) forControlEvents:UIControlEventTouchUpInside];
         
            [showMapButton.titleLabel setFont:[UIFont fontWithName:font.name size:[font.size floatValue]]];
            [showMapButton setTitleColor:font.color forState:UIControlStateNormal]; 
            [showMapButton setTitle:@"Show Map" forState:UIControlStateNormal];
            
            if(theData.latittude == 0.0 || theData.longitude == 0.0)
            {
                Communication_Parsing *com = [[Communication_Parsing alloc] init];
                
                NSString *urlString = [NSString stringWithFormat:@"http://maps.googleapis.com/maps/api/geocode/json?address=%@&sensor=false", [NSString stringWithFormat:@"%@,%@", theData.street,theData.city]];
                NSLog(@"URL :%@",urlString);
                NSURL *requestURL   = [NSURL URLWithString:[urlString stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding]];
                
                [com callWebServiceWithURL:requestURL];
                NSMutableDictionary *entries = [com parseResponseForExternalSource:@"test"]; 
                NSArray *results = [entries objectForKey:@"results"];
                
                double lat = [[[[[results objectAtIndex:0] valueForKey:@"geometry"] objectForKey:@"location"] objectForKey:@"lat"] doubleValue];
                double lng = [[[[[results objectAtIndex:0] valueForKey:@"geometry"] objectForKey:@"location"] objectForKey:@"lng"] doubleValue];                
                
                if(lat != 0.0 && lng != 0.0)
                {
                    theData.latittude = lat;
                    theData.longitude = lng;
                    [self.infoView addSubview:showMapButton];
                }
                [showMapButton release];    
                [com release];
                
            }
            else {
                [self.infoView addSubview:showMapButton];
            [showMapButton release];
            }           
        }
        
        //TODO
        //check 70 = 20 + 50 = status bar + navigation bar 
        [scrollView setContentSize:CGSizeMake(320, self.infoView.frame.size.height + 70)];      
        [containerView release];
    }
    
    else {
        
        GeneralRecordData *theData = [detailViews objectAtIndex:tabNumber];
        if(theData.isMainTab)
        {
            if(theData.isCommentEnabled)
            {
            CommentData *commentData = [[CommentData alloc] init];
            [commentData setTargetId:theData.Id];
            [commentData setMediaId:self.mediaId];
            [commentData setType:theData.dataType];
            [commentData setGuid:theData.Id];
            
            
            viewController = [[CommentsViewController alloc] 
                                                      initWithFormId:theData.formId 
                                                      feedId:nil 
                                                      isReplyView:YES 
                                                      isLikeEnabled:theData.isLikeEnabled 
                                                      data:commentData 
                                                      parentViewController:self];
            
            
            CGRect viewFrame = CGRectZero;
                if(kNoOfTabs > 1)
                {
               viewFrame = CGRectMake(0.0f, 100.0f + self.infoView.frame.size.height + imgHorLine.size.height, 320.0f, 250.0f);
                }
                else
                {
               viewFrame = CGRectMake(0.0f, 100.0f + self.infoView.frame.size.height + imgHorLine.size.height, 320.0f, 250.0f);

                }
            [viewController.view setFrame:viewFrame];
            

                if([theData.tabTitle length] > 10)
                    [segmentsTitles addObject:[NSString stringWithFormat:@"%@...",[theData.tabTitle substringWithRange:NSMakeRange(0,6)]]];
                else
                    [segmentsTitles addObject:theData.tabTitle];
            
            [viewController.view setHidden:NO];
                [segmentViews addObject:viewController.view];
                
            }
        }
        else 
        {
            
            UIView *segmentView = [[UIView alloc] initWithFrame:CGRectMake(0, self.infoView.frame.size.height + imgHorLine.size.height, 320, 230)];
            
            CustomFont *customfont = [NSKeyedUnarchiver unarchiveObjectWithData:[[NSUserDefaults standardUserDefaults] objectForKey:@"font_4"]];
            
         
            UITextView *DescriptionText = [[UITextView alloc] init];
            [DescriptionText setFont:[UIFont fontWithName:customfont.name size:[customfont.size floatValue]]];
            [DescriptionText setTextColor:customfont.color];
            DescriptionText.editable = NO;
            DescriptionText.backgroundColor = [UIColor clearColor];
            DescriptionText.delegate = self;
         
            
            if(kNoOfTabs > 1)
            {
                [DescriptionText setFrame:CGRectMake(15.0f,10.0f, 300, 230)];
                [segmentView setFrame:CGRectMake(segmentView.frame.origin.x, segmentView.frame.origin.y, 320, 230)];
            }
            else {
                [DescriptionText setFrame:CGRectMake(15.0f,10.0f, 300, 275)];
                [segmentView setFrame:CGRectMake(segmentView.frame.origin.x, segmentView.frame.origin.y, 320, 275)];
            }

            [DescriptionText setText:theData.tabContent];
            [segmentView addSubview:DescriptionText];
            [DescriptionText release];
            
            
            [segmentView setBackgroundColor:[UIColor clearColor]];
            
            UIImage *theImage = [UIImage imageWithContentsOfResolutionIndependentFile:[DOCUMENTS_DIR stringByAppendingPathComponent:@"wallpaper_dimmer.png"]];
            UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, segmentView.frame.size.width, segmentView.frame.size.height)];
            [imageView setImage:theImage];
            [segmentView addSubview:imageView]; 
            [imageView release];
            
            
            [scrollView setBackgroundColor:[UIColor clearColor]];
            [segmentView setHidden:FALSE];
            
            if(![theData.tabTitle isEqual:[NSNull null]] && [theData.tabTitle length] > 10)
                [segmentsTitles addObject:[NSString stringWithFormat:@"%@...",[theData.tabTitle substringWithRange:NSMakeRange(0,6)]]];
            else
                [segmentsTitles addObject:theData.tabTitle];
            
            [scrollView addSubview:segmentView];
            [segmentViews addObject:segmentView];
            [segmentView release];
            
            
        }
      
        
    }
   
}


Het hele project is helaas van ongeveer dezelfde kwaliteit ...

Microsoft Windows: A thirty-two bit extension and graphical shell to a sixteen-bit patch to an eight-bit operating system originally coded for a four-bit microprocessor which was written by a two-bit company that can't stand one bit of competition.


Acties:
  • 0 Henk 'm!

  • MacWolf
  • Registratie: Januari 2004
  • Laatst online: 06-09-2024
En dat was slechts 1 functie. Het hele project is een WTF ...

Ik overweeg de app te herschrijven, kost denk ik minder werk, want het is één onsamenhangende brij en daardoor erg lastig in onderhoud.

[ Voor 22% gewijzigd door MacWolf op 11-12-2011 19:12 ]

Microsoft Windows: A thirty-two bit extension and graphical shell to a sixteen-bit patch to an eight-bit operating system originally coded for a four-bit microprocessor which was written by a two-bit company that can't stand one bit of competition.


Acties:
  • 0 Henk 'm!

  • Pizzalucht
  • Registratie: Januari 2011
  • Laatst online: 10:32

Pizzalucht

Snotneus.

Ik krijg al hoofdpijn door er naar te kijken :+

Acties:
  • 0 Henk 'm!

  • YopY
  • Registratie: September 2003
  • Laatst online: 13-07 01:14
MacWolf schreef op zondag 11 december 2011 @ 19:11:
En dat was slechts 1 functie. Het hele project is een WTF ...

Ik overweeg de app te herschrijven, kost denk ik minder werk, want het is één onsamenhangende brij en daardoor erg lastig in onderhoud.
Nouja, herschrijven lijkt me een nogal grove stap. Als het resultaat verder goed is / doet wat het moet doen zou ik er eens een dag aan refactoring aan besteden. Het lijkt erop dat het slechts lange functies zijn; lange functies kun je eenvoudig opbreken. Dat is iig sneller dan herschrijven.

Lange functies in objective-C / view-bouwende code komen wel eens voor. Dat het allemaal in één functie hangt kun je nog wel fixen.

Acties:
  • 0 Henk 'm!

  • PiepPiep
  • Registratie: Maart 2002
  • Laatst online: 18-01-2023
MacWolf schreef op zondag 11 december 2011 @ 19:11:
En dat was slechts 1 functie. Het hele project is een WTF ...

Ik overweeg de app te herschrijven, kost denk ik minder werk, want het is één onsamenhangende brij en daardoor erg lastig in onderhoud.
Ik vind het wel mooi samenhangend eigenlijk. Mooi 1 massief blok waar ik niet aan zou durven te komen :)

486DX2-50 16MB ECC RAM 4x 500MB Drive array 1.44MB FDD MS-Dos 6.22


Acties:
  • 0 Henk 'm!

  • Haan
  • Registratie: Februari 2004
  • Laatst online: 07:42

Haan

dotnetter

Alex) schreef op zaterdag 10 december 2011 @ 01:06:
[...]

Waarom doen mensen dat? Waarom iets static maken als dat geen nut heeft? :')
Ik kan wel een gokje doen: als je het static maakt blijven je lists mooi gevuld na een postback :')
Hou je er wel rekening mee dat de ViewState vrij fors kan worden, en bij iedere postback geheel over de lijn gaat? En dat users de viewstate kunnen lezen/aanpassen (indien deze niet geëncrypt is)? :)
Bedankt voor de waarschuwing, maar is bekend en het gaat om een klein stukje uit een intranet applicatie dus dat is in dit geval geen probleem.

Kater? Eerst water, de rest komt later


Acties:
  • 0 Henk 'm!

  • Webgnome
  • Registratie: Maart 2001
  • Nu online
MacWolf schreef op zondag 11 december 2011 @ 19:11:
En dat was slechts 1 functie. Het hele project is een WTF ...

Ik overweeg de app te herschrijven, kost denk ik minder werk, want het is één onsamenhangende brij en daardoor erg lastig in onderhoud.
Hoewel ik geen kaas heb gegeten van C is de code op het eerste gezegd niet heel lastig. Het is alleen veel. Met een beetje refactoren kom je al een heel eind en is helemaal opnieuw schrijven niet nodig. Ik zou alleen wel eventjes de persoon die verantwoordelijk is voor deze rommel door de spreekwoordelijke gehaktmolen halen..

Strava | AP | IP | AW


Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 03:42
't Is trouwens Objective-C, niet standaard C.

Acties:
  • 0 Henk 'm!

  • MacWolf
  • Registratie: Januari 2004
  • Laatst online: 06-09-2024
Webgnome schreef op maandag 12 december 2011 @ 21:28:
[...]


Hoewel ik geen kaas heb gegeten van C is de code op het eerste gezegd niet heel lastig. Het is alleen veel. Met een beetje refactoren kom je al een heel eind en is helemaal opnieuw schrijven niet nodig. Ik zou alleen wel eventjes de persoon die verantwoordelijk is voor deze rommel door de spreekwoordelijke gehaktmolen halen..
Ik ben eigenlijk al sinds begin 2011 met die code bezig en het een gedeelte van de app ge-refactored, echter het is gewoon te veel code om in zijn geheel aan te passen. Ik heb het idee dat je bij een iOS app een goede indicatie van de kwaliteit van de code kan krijgen door de AppDelegate klasse te bestuderen. In dit geval wordt de AppDelegate gebruikt om allerlei variabelen bij te houden (als het ware in 1 gigantische singleton), waardoor refactoren erg lastig wordt.

De verantwoordelijk Indiër voor de meerderheid van deze code heeft trouwens afgelopen jaar nog wel contact opgenomen met de opdrachtgever. Hij ging voor zichzelf beginnen en wilde een wat 'endorsements' en hoopte nog meer werk binnen te krijgen via dezelfde opdrachtgever.

Wat trouwens wel grappig was, was dat ze ook een kwalitatief veel betere ontwikkelaar in dienst hadden -een dame- en zij werd de laatste maanden bij het project betrokken, want de oplevering was al een maand of 3 te laat. Over haar code ben ik wel goed te spreken, maar helaas is dat maar een klein aandeel in het project.

De AppDelegate header zag er begin dit jaar (na overdracht) als volgt uit:

C:
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
#import <UIKit/UIKit.h>
#import <CoreData/CoreData.h>
#import "SplashAppGlobals.h"
#import "Reachability.h"

@class MusicPlayerViewController;
@class BackgroundImage;

typedef enum {
    //TABCHANGED = 0,
    //PRESENTERROR = 1,
    NETWORKERROR = 2
} TypeOfAlert;


@interface AppDelegate : NSObject <UIApplicationDelegate, UIScrollViewDelegate,UITextFieldDelegate> {

    UIAlertView* dialog;
    UITextField *nameField;
    
    BackgroundImage *backgroundImage;
    MusicPlayerViewController *mPlayerController;
    
    UINavigationController *navigationController;
    UIWindow *window;
    NSMutableArray *imgArray;
    
    UIScrollView *scrollView;
    
    NSString *baseUrl;
    NSString *resourceUrl;
    
    
    int commentHierarchyCount;
    SplashAppGlobals *splashAndGlobals;
    
    NSArray *homeSreenIcons;
    NSArray *homeSreenHeaders;
    NSArray *homeScreenPlayList;
    NSArray *fontArray;
    NSString *documentsDirectory;
    
    NSString *backgroundImagePath;
    NSString *formId;
    NSString *screenId;
    NSString *iAppId;
    NSString *mediaType;
    NSString *modName;
    
    NSString *curUserName;
    
    NSMutableDictionary *APIKeys;
    NSMutableDictionary *screenTitles;
    
    UIDeviceOrientation currentOrientationType;
    
    UIActivityIndicatorView *activityIndicator;

    UIImageView *splashImageView;
    UIImageView *tempSplashImageView;
    
    BOOL isHostReachable;
    Reachability* hostReach;
    Reachability* internetReach;
    Reachability* wifiReach;
    TypeOfAlert typeOfAlert;

    BOOL facebookLoginStatus;
    
    NSMutableDictionary *savedPhotos;
    NSMutableDictionary *photoNames;
    NSMutableDictionary *photoDetails;
    NSMutableDictionary *storedPhotoData;
    
    NSString *LFMUNameSession;
    NSString *LFMPwdSession;
    BOOL showSpinnerInAccountView;
    BOOL isSleep;
}

- (void) getSplashScreenAndGlobalSetting;
- (void) downloadThemesAndFonts;
- (void) downloadHomeScreenIcon;
- (NSString *) retrieveUserDefaultForKey:(NSString *) key;
- (void) saveToUserDefault:(NSString *) key Value:(id) val;
- (void) startActivityIndicator;
- (void) stopActivityIndicator;
- (void) startActivityIndicatorInBackground;
- (void) stopActivityIndicatorInBackground;
- (void) backgroundLoadingProcess;
- (void) updateInterfaceWithReachability: (Reachability*) curReach;
- (void) popViewController;

@property (nonatomic, retain) IBOutlet UIWindow *window;
@property (nonatomic, retain) UIImageView *splashImageView;
@property (nonatomic, retain) IBOutlet UIImageView *tempSplashImageView;
@property (nonatomic, retain) UIActivityIndicatorView *activityIndicator;
@property (nonatomic, retain) IBOutlet UINavigationController *navigationController;
@property (nonatomic, retain) BackgroundImage *backgroundImage;
@property (nonatomic, retain) MusicPlayerViewController *mPlayerController;
@property (nonatomic, retain) NSMutableArray *imgArray;
@property (nonatomic, retain) IBOutlet UIScrollView *scrollView;
@property (nonatomic, retain) NSString *baseUrl;
@property (nonatomic, retain) NSString *resourceUrl;
@property (nonatomic, retain) SplashAppGlobals *splashAndGlobals;
@property (nonatomic, retain) NSArray *homeSreenIcons;
@property (nonatomic, retain) NSString *documentsDirectory;
@property (nonatomic, retain) NSArray *homeSreenHeaders;
@property (nonatomic, retain) NSArray *homeScreenPlayList;
@property (nonatomic, retain) NSArray *fontArray;
@property (nonatomic, retain) NSString *backgroundImagePath;
@property (nonatomic, retain) NSString *formId;
@property (nonatomic, retain) NSString *screenId;
@property (nonatomic, retain) NSString *iAppId;
@property (nonatomic, retain) NSMutableDictionary *APIKeys;
@property (nonatomic, retain) NSMutableDictionary *screenTitles;
@property (nonatomic) int commentHierarchyCount;
@property (nonatomic) UIDeviceOrientation currentOrientationType;
@property (nonatomic, retain) NSMutableDictionary *savedPhotos;
@property (nonatomic, retain) NSMutableDictionary *photoNames;
@property (nonatomic, retain) NSMutableDictionary *photoDetails;
@property (nonatomic, retain) NSMutableDictionary *storedPhotoData;
@property (nonatomic, retain) NSString *mediaType;
@property (nonatomic, retain) NSString *modName;
@property (nonatomic, retain) NSString *curUserName;
@property (nonatomic, retain) NSString *LFMUNameSession;
@property (nonatomic, retain) NSString *LFMPwdSession;
@property (nonatomic, assign) BOOL showSpinnerInAccountView;
@end

Microsoft Windows: A thirty-two bit extension and graphical shell to a sixteen-bit patch to an eight-bit operating system originally coded for a four-bit microprocessor which was written by a two-bit company that can't stand one bit of competition.


Acties:
  • 0 Henk 'm!

  • alienfruit
  • Registratie: Maart 2003
  • Laatst online: 00:42

alienfruit

the alien you never expected

Uit interesse, hoe zou je het dan oplossen? Er zijn een boel dictionaries en arrays. Zou je dan een PhotosModel klasse maken ofzo?

Acties:
  • 0 Henk 'm!

  • MacWolf
  • Registratie: Januari 2004
  • Laatst online: 06-09-2024
De meeste dictionaries in dit project zijn erg onhandig om mee te werken, ze zijn opgebouwd uit JSON data van een webserver. Binnen de hele applicatie worden waardes uit die dictionaries gehaald op basis van key strings. In onderhoud is dit natuurlijk heel lastig, wijzigt er iets op de webservice, dan moeten de juiste keys in de hele app doorzocht worden en vervangen. Iedere dictionary moet dus geconverteerd worden naar een object met properties voor ieder veld.

Sommige gegevens zijn echter wel globaal en voor zulke zaken zou ik een aparte singleton gebruiken, niet de AppDelegate. Mijn inziens moet de AppDelegate altijd heel beperkt zijn in functionaliteit.

Zaken als Facebook, Twitter, Music Player moeten niet eens in de AppDelegate voorkomen. Sommige arrays met plaatjes worden niet globaal gebruik in de app en moeten dus verplaatst worden naar de juiste klasse. Voorbeeld daarvan is de array "homeScreenHeaders", deze zijn alleen zichtbaar op het "Home" scherm.

Het generieke achtergrondplaatje "backgroundImage" wordt wel in de AppDelegate op de achtergrond geplaatst, maar deze zou niet van "buiten" af zichtbaar moeten zijn. Daar is eigenlijk niet eens een property voor nodig (je plaatst dit plaatje eenmaal op de mainWindow en daarna zit je er niet meer aan.

En zou zijn er nog wel een aantal zaken te bedenken.

Ik ben afgelopen vrijdag toch "stiekem" begonnen met een rewrite. Mooie code schrijven geeft zo veel voldoening, dus doe dat met veel plezier.

Microsoft Windows: A thirty-two bit extension and graphical shell to a sixteen-bit patch to an eight-bit operating system originally coded for a four-bit microprocessor which was written by a two-bit company that can't stand one bit of competition.


Acties:
  • 0 Henk 'm!

  • Aloys
  • Registratie: Juni 2005
  • Niet online
Ik kom hier een leuke tegen op internet:
Java:
1
int not_dir = dir == 0 ? 1 : 0;

WHY?!

Gebruik dan:
Java:
1
int not_dir = !dir;


Of nog liever, gewoon overal waar je not_dir nodig hebt:
Java:
1
!dir


8)7

Acties:
  • 0 Henk 'm!

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
gebruik liever een boolean.

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


Acties:
  • 0 Henk 'm!

  • Aloys
  • Registratie: Juni 2005
  • Niet online
Inderdaad, maar ik weet niet of dat een mogelijkheid was, want dit komt via een parameter van een meegegeven object. Misschien kon dat object niet aangepast worden?

edit: Andersom natuurlijk :F . Het komt van een object dat is meegegeven als parameter.

[ Voor 12% gewijzigd door Aloys op 13-12-2011 22:50 ]


Acties:
  • 0 Henk 'm!

  • Tim
  • Registratie: Mei 2000
  • Laatst online: 04-08 16:29

Tim

Aloys schreef op dinsdag 13 december 2011 @ 22:42:
Ik kom hier een leuke tegen op internet:
Java:
1
int not_dir = dir == 0 ? 1 : 0;

WHY?!
Omdat de not-operator niet werkt op integers?

Acties:
  • 0 Henk 'm!

  • Aloys
  • Registratie: Juni 2005
  • Niet online
Tim schreef op dinsdag 13 december 2011 @ 23:42:
[...]

Omdat de not-operator niet werkt op integers?
Scherp, geen idee hoe dat zit in de verschillende talen, maar dat kan vast een goed argument zijn. Overigens was een boolean natuurlijk nog gewoon duidelijker / mooier geweest, maar met input van een ander weet je het ook niet altijd.

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-09 16:37

.oisyn

Moderator Devschuur®

Demotivational Speaker

Tim schreef op dinsdag 13 december 2011 @ 23:42:
[...]

Omdat de not-operator niet werkt op integers?
Dan nog hoef je geen ?: te gebruiken
Java:
1
int not_dir = dir == 0;

.edit: oh, nevermind, in Java is een boolean ook niet automatisch te converten naar een int 8)7

[ Voor 16% gewijzigd door .oisyn op 14-12-2011 00:19 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • Noxious
  • Registratie: Juli 2002
  • Laatst online: 24-09 17:38
Delphi:
1
2
 if basis.klantentable['KORTING'] >0 then
  kor:=basis.klantentable['KORTING'] else kor:=0;


8)7

Acties:
  • 0 Henk 'm!

  • Ram0n
  • Registratie: Maart 2002
  • Laatst online: 03-07 13:05

Ram0n

Bierbrouwende nerd

Noxious schreef op woensdag 14 december 2011 @ 11:04:
Delphi:
1
2
 if basis.klantentable['KORTING'] >0 then
  kor:=basis.klantentable['KORTING'] else kor:=0;


8)7
Het zou vreemd zijn, daar niet van, maar is dit wellicht om te voorkomen dat een korting negatief kan zijn?

Eigenaar/brouwer Milky Road Brewery


Acties:
  • 0 Henk 'm!

  • Noxious
  • Registratie: Juli 2002
  • Laatst online: 24-09 17:38
Ram0n schreef op woensdag 14 december 2011 @ 11:13:
[...]

Het zou vreemd zijn, daar niet van, maar is dit wellicht om te voorkomen dat een korting negatief kan zijn?
Mja het veld in de database is een tekstveld, bij geen korting blijft het veld gewoon leeg.
Waarschijnlijk had de oorspronkelijke dev daar wat problemen mee :P

In plaats van z'n database te fixen heeft hij besloten dus maar te checken of iets null is :P

Acties:
  • 0 Henk 'm!

  • SysRq
  • Registratie: December 2001
  • Laatst online: 24-09 21:48
Misschien ook om te voorkomen dat er een negatieve korting gegeven wordt?

Lelijke structuur trouwens...

-


Acties:
  • 0 Henk 'm!

  • Ram0n
  • Registratie: Maart 2002
  • Laatst online: 03-07 13:05

Ram0n

Bierbrouwende nerd

Noxious schreef op woensdag 14 december 2011 @ 11:23:
[...]

Mja het veld in de database is een tekstveld, bij geen korting blijft het veld gewoon leeg.
Waarschijnlijk had de oorspronkelijke dev daar wat problemen mee :P

In plaats van z'n database te fixen heeft hij besloten dus maar te checken of iets null is :P
Een tekstveld? Als in een varchar o.i.d.? Voor korting? Dan is er wel meer mis :D

Eigenaar/brouwer Milky Road Brewery


Acties:
  • 0 Henk 'm!

  • Otherside1982
  • Registratie: Februari 2009
  • Laatst online: 24-09 20:54
Ram0n schreef op woensdag 14 december 2011 @ 11:47:
[...]

Een tekstveld? Als in een varchar o.i.d.? Voor korting? Dan is er wel meer mis :D
Nee toch? Dan kan je mooi ingeven:
  • 10%
  • 5€
  • 5 euro per 25€
  • de helft van de prijs
  • Gratis aansteker
Heerlijk flexibel toch :+

Acties:
  • 0 Henk 'm!

  • PdeBie
  • Registratie: Juni 2004
  • Laatst online: 07:22
Otherside1982 schreef op woensdag 14 december 2011 @ 12:11:
[...]

Nee toch? Dan kan je mooi ingeven:
  • 10%
  • 5€
  • 5 euro per 25€
  • de helft van de prijs
  • Gratis aansteker
Heerlijk flexibel toch :+
I rofl'd :D

Acties:
  • 0 Henk 'm!

  • soedesh
  • Registratie: September 2011
  • Laatst online: 13-09 01:49
Ik ben geen programmeur maar een beheerder en ik wil even kwijt dat ik me sowieso irriteer aan slecht geprogrammeerde/geschreven software.
Echter de laatste tijd loopt het helemaal de spuigaten uit met slecht werkende websites/ webapplicaties.

Eindgebruikers wijzen steevast als eerste met de beschuldigende vinger naar de systeembeheerders als er iets niet werkt en het heeft me al talloze uren gekost om uit te zoeken en daarna uit te leggen wat ik eigenlijk allang al wist, namelijk dat de fout aan een specifiek (slecht geschreven) programma of website/webapplicatie lag en dat er helemaal niks aan de hand was/is met de PC of Server.

Computers zijn nog steeds abracadabra voor de meeste mensen en dat zal helaas altijd zo blijven want er zijn nog genoeg die denken dat je als beheerder alle ins en outs van alle softwarepaketten die ooit op de wereld zijn uitgebracht op je duimpje kent ("jij hebt toch verstand van computers" zeggen ze dan) terwijl ik bijvoorbeeld nauwelijks kennis heb (laat staan wil hebben) van Excel of Word!.
Ze denken ook nog eens dat je als beheerder precies weet hoe je een flitsende website maakt.
Uitleggen dat je daar geen kennis van hebt (of wil hebben) heeft mij ook menig uurtje gekost.
Zelfs personeel van wervings en selectiebureau's moet ik nog al te vaak uitleggen wat het verschil is tussen een beheerder en een programmeur, maar ik neem aan dat de lezers van dit topic dat nog wel weten.

Om terug te komen op het steeds groter wordende probleem van slecht functionerende websites/webapplicaties het volgende:

Ik krijg het vermoeden dat veel van de huidige websites/webapplicaties te complex zijn.
Vaak gebruikt men op maat geschreven software waarvan soms niemand meer precies weet hoe en/of door wie de code geschreven is en men (dus) ook niet op de hoogte is hoe men de applicatie moet onderhouden/updaten.
Programmeurs zijn duur (duurder dan beheerders! ;-) en vaak zijn ze om die reden maar even in dienst.
Ze klaren een klusje en gaan dan weer door naar de volgende opdracht met achterlating van zeer slecht geschreven software, waarvan alleen zijzelf de logica en opbouw kennen/snappen.

Komt nog bij dat met name bij webapplicaties een gezamenlijke inspanning van zowel programmeurs, webontwikkelaars, webdesigners als systeembeheerders noodzakelijk is.
Als er ook maar een zwakke schakel daartussen zit ligt de website plat of werkt het betreffende webformulier niet.

Uiteraard ben ik als ervaren systeembeheerder van mening dat de problemen met name bij de andere schakels liggen.
Zonder daarbij in een ellenlange discussie te willen geraken (met voor en tegenstanders van bepaalde software of een over en weer discussie tussen beheerders en ontwikkelaars) heeft het mijn voorkeur om met beproefde (niet maatwerk) software van gerenommeerde softwareleveranciers zoals Microsoft te werken.
De grote jongens (zoals Microsoft, maar ook Apple en Google en Adobe) maken namelijk software die over de hele wereld beproefd is en hebben genoeg middelen in huis om door te blijven ontwikkelen en verbeteren, wat zelfs de allergrootse afnemers van 'maatwerksoftware' niet lukt getuige het feit dat websites van zelfs gerenomeerde bedrijven en instanties (met name non-profit instanties) simpelweg niet functioneren.

Ik wil het hier nieteens hebben over de beveiligingsproblemen/lekken, want dat is weer een ander topic.
Wat mij betreft mag er zelfs nog een beveiliginslek (met het certificaat of iets dergelijks) zijn als de site maar functioneert!
Helaas is dat laatste tegenwoordig nieteens meer het geval/vanzelfsprekend.

Wordt het misschien weer tijd om terug te gaan naar de basics en ouderwetse HTML pagina's met wat foto's en tekst en hooguit een simpel email formuliertje te maken? Dan kan je tenminste waarmaken wat je belooft aan bezoekers van je site......

SWITCHES=/F DEVICE=HIMEM.SYS /TESTMEM:OFF


Acties:
  • 0 Henk 'm!

  • Sebazzz
  • Registratie: September 2006
  • Laatst online: 23-09 18:21

Sebazzz

3dp

Hmmm alles in ASP.NET sessies stoppen :9

Leuke foutjes krijg je dan al de hele sessie door de war loopt.

[Te koop: 3D printers] [Website] Agile tools: [Return: retrospectives] [Pokertime: planning poker]


Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 11:24
Ik irriteer me aan luie systeembeheerders

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-09 16:37

.oisyn

Moderator Devschuur®

Demotivational Speaker

Nee. Luie systeembeheerders irriteren je, of je ergert je aan luie systeembeheerders. Je kunt je niet ergens aan irriteren. Tot zover deze les Nederlands op jouw verjaardag :P

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 11:24
Als je nog mod was, had je kunnen zien dat ik eerst het werkwoord 'ergeren' had gebruikt, maar ik wou hetzelfde gebruiken. je hebt - voor een keer- natuurlijk wel gelijk.

/maar goed, ik ben dan ook Vlaming, dus Nederlands boeit me niet. :P

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • Paul
  • Registratie: September 2000
  • Laatst online: 12:14
Wat is er lui aan een oproep om betere software te schrijven? :P

Ik ben ook systeembeheerder, en ik heb er ook een pleurishekel aan om klanten te moeten zeggen dat het probleem bij een 3e partij zit. De klant denkt met een kluitje in het riet gestuurd te worden, de klant wordt niet geholpen, en de klant wil maar één ding: dat het werkt :P

Dat gezegd hebbend denk ik niet zozeer dat het probleem zit in het maatwerk, het probleem zit hem bij de verwachtingen en het budget van de klant :) Pay peanuts, get monkeys. Huur een paar programmeurs voor 2 weken, schrijf Facebook en zet dat live, tja, dan heb je het soort webapplicaties waar Soedesh het over heeft.

Huur een paar business analists, ontwikkelaars, designers, testers, een project manager en wijs wat een kennisgroep uit je interne organisatie aan voor een paar maanden, dan heb je dat soort gezeik (mits je een beetje goede mensen inhuurt) niet. Dan kan er nog wel eens iets mis mee zijn (dat houd je altijd, ook met MS, Google, Apple en Adobe) maar dan weet je in ieder geval waar je moet zijn en heb je (als het goed is)afspraken over wanneer het weer werkt. Maar ja, dat kost geld :P

"Your life is yours alone. Rise up and live it." - Richard Rahl
Rhàshan - Aditu Sunlock


Acties:
  • 0 Henk 'm!

  • Noxious
  • Registratie: Juli 2002
  • Laatst online: 24-09 17:38
Otherside1982 schreef op woensdag 14 december 2011 @ 12:11:
[...]

Nee toch? Dan kan je mooi ingeven:
  • 10%
  • 5€
  • 5 euro per 25€
  • de helft van de prijs
  • Gratis aansteker
Heerlijk flexibel toch :+
:D :D

Maar het staat in de database als een varchar inderdaad.
Er zitten wel meer dergelijke enge dingen in, zoals een char(1) veld met de naam 'SPEC':

Delphi:
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
procedure Tklntwrkform.FormActivate(Sender: TObject);
var i,c:integer;
    s:string;
begin
 totaalbedrag:=0.0;regelnr:=0;
 obh:=0.0;obl:=0.0;obn:=0.0;
 begin
  basis.klantentable.open;
  basis.klantentable.findkey([menuform.mklantnr]);
  if menuform.mklantnr='100'then
  label2.caption:=kontantform.edit1.text else
   label2.caption:=basis.klantentable['BEDRIJF'];
  label1.caption:=basis.klantentable['KLANTNR'];
  if basis.klantentable['CODE']='V' then label16.caption:='Vaste prijs';
  if basis.klantentable['CODE']='A' then label16.caption:='Afhankelijk';
  if basis.klantentable['CODE']='S' then
  begin
    label16.caption:='Speciaal';
    basis.aflbonnentable.close;                           //aflbonnen=dicht
    basis.aflbonnentable.indexfieldnames:='KLANTNR';
    basis.aflbonnentable.open;                            //aflbonnen=open
  end;
  if basis.klantentable['SPEC']='R' then label17.caption:='Rekening';
  if basis.klantentable['SPEC']='W' then Label17.caption:='Weekrekening';
  if basis.klantentable['SPEC']='K' then label17.caption:='Kontant';
  if basis.klantentable['SPEC']='I' then label17.caption:='Incasso';
  if basis.klantentable['SPEC']='Z' then label17.caption:='WeekIncasso';
  if basis.klantentable['EXTRA']='J' then label18.caption:='Extra bon' else
     label18.caption:='Geen extra bon';
 end;
 // De BTW gegevens en bonnr worden in het geheugen gezet
 basis.laatstetable.open;
 label14.caption:=datetostr(date());
 mBTW_H:=basis.laatstetable['BTW_H'];
 mBTW_L:=basis.laatstetable['BTW_L'];
 mBonnr:=basis.laatstetable['BONNR'];
 val(mBonnr,i,c);
 i:=i+1;str(i,mBonnr);
 Label15.caption:=mBonnr;
 statuslabel.caption:='Maak uw keuze';
 activecontrol:=button1;
end;


Die ook in andere delen terug komt:

Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
if (basis.klantentable['SPEC']='I') OR (basis.klantentable['SPEC']='Z') then
 begin
  QRDBText32.visible:=true;
  QRLabel23.caption:='Wij zullen automatisch  het faktuurbedrag van';
  qrLabel24.caption:='Euro , van uw rekening overschrijven op onze';
  qrlabel25.caption:='bankrekening nr';
 end else
 if basis.klantentable['SPEC']='K' then
 begin
  QRLabel23.caption:='Wij verzoeken u vriendelijk om het bedrag van';
  qrLabel24.caption:='Euro , kontant te betalen !';
  qrlabel25.caption:=' ';
  qrDBtext32.visible:=false;
 end else
 begin
  qrdbtext32.visible:=true;
  QRLabel23.caption:='Wij verzoeken u vriendelijk om het bedrag van';
  qrLabel24.caption:='Euro ,binnen 14 dagen over te maken op onze';
  qrlabel25.caption:='bankrekening nr:';
 end;


Ook de prachtige backupfunctionaliteit wil ik jullie niet onthouden:

Delphi:
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
procedure Tbackupform.Button1Click(Sender: TObject);
var command,params,workdir:string;
begin
 command:='xcopy32.exe' +#0;
 params:='c:\fakturering\data\*.* c:\fakturering\backup\*.*' +#0;
 workdir:='' +#0;
 if shellexecute(handle,'open',@command[1],
    @params[1],@workdir[1], sw_shownormal) <32 then
    messageDlg('Foute opdracht kopie',
    mtError,[mbOk],0);
 button3.enabled:=true;
end;

procedure Tbackupform.FormActivate(Sender: TObject);
begin
 button3.enabled:=false;
end;

procedure Tbackupform.Button3Click(Sender: TObject);
var command,params,workdir:string;
begin
  command:='c:\fakturering\backup\arj.exe' +#0;
  params:='A A:reserve -V1440 -JM1 -X*.exe' +#0;
  workdir:='C:\fakturering\backup\' +#0;
  if shellexecute(handle,'open',@command[1],
    @params[1],@workdir[1], sw_shownormal) <32 then
    messageDlg('Foute opdracht opslaan',
    mtError,[mbOk],0)
  else
  begin
   basis.laatstetable.open;
   basis.laatstetable.edit;
   basis.laatstetable['BACKUP']:=date();
   basis.laatstetable.post;
  end;
end;

procedure Tbackupform.Button4Click(Sender: TObject);
var command,params,workdir:string;
begin
 command:='xcopy32.exe' +#0;
 params:='c:\fakturering\backup\*.* c:\fakturering\data\*.*' +#0;
 workdir:='' +#0;
 if shellexecute(handle,'open',@command[1],
    @params[1],@workdir[1], sw_shownormal) <32 then
    messageDlg('Foute opdracht herstel',
    mtError,[mbOk],0);
 close;
end;


@ Darkstone: ja dat is ook zo heerlijk aan dit project :P

Acties:
  • 0 Henk 'm!

Verwijderd

Noxious schreef op woensdag 14 december 2011 @ 14:53:
Delphi:
1
2
3
  QRLabel23.caption:=
  qrLabel24.caption:=
  qrlabel25.caption:=
Altijd leuk, die makkelijk te onthouden variable namen.

Acties:
  • 0 Henk 'm!

  • themole
  • Registratie: Juli 2010
  • Laatst online: 19-11-2023
En als spec niet gedefinieerd is hoef je niet te betalen? Handig. :P

Acties:
  • 0 Henk 'm!

  • Harmsen
  • Registratie: November 2000
  • Nu online
Noxious schreef op woensdag 14 december 2011 @ 14:53:
[...snip...]
Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
procedure Tbackupform.Button3Click(Sender: TObject);
var command,params,workdir:string;
begin
  command:='c:\fakturering\backup\arj.exe' +#0;
  params:='A A:reserve -V1440 -JM1 -X*.exe' +#0;
  workdir:='C:\fakturering\backup\' +#0;
  if shellexecute(handle,'open',@command[1],
    @params[1],@workdir[1], sw_shownormal) <32 then
    messageDlg('Foute opdracht opslaan',
    mtError,[mbOk],0)
  else
  begin
   basis.laatstetable.open;
   basis.laatstetable.edit;
   basis.laatstetable['BACKUP']:=date();
   basis.laatstetable.post;
  end;
end;
Woei! Old Skool ARJ inpakken op diskette formaat!

What a fine day for Science! | Specs


Acties:
  • 0 Henk 'm!

  • Noxious
  • Registratie: Juli 2002
  • Laatst online: 24-09 17:38
Harmsen schreef op woensdag 14 december 2011 @ 15:10:
[...]


Woei! Old Skool ARJ inpakken op diskette formaat!
Toen ik dit tegenkwam heb ik eerst 5 minuten blauw gelegen van het lachen ja, de opdrachtgever zat er bij en keek me maar wat raar aan.. :P

Acties:
  • 0 Henk 'm!

  • soedesh
  • Registratie: September 2011
  • Laatst online: 13-09 01:49
Hallo Paul,

Je schrijft:

"Huur een paar business analists, ontwikkelaars, designers, testers, een project manager en wijs wat een kennisgroep uit je interne organisatie aan voor een paar maanden, dan heb je dat soort gezeik (mits je een beetje goede mensen inhuurt) niet".

Ik heb gewerkt bij bedrijven en aan projecten meegewerkt waar geld geen probleem was (al dan niet betaald met belastinggeld) en waar al deze mensen werden ingehuurd.
Probleem is echter dat ook deze (en misschien wel juist deze) bedrijven en instanties met de geschetste problemen kampen.

Laatst belde ik bijv. met de Belastingdienst (ongeveer de rijkste instantie van allemaal neem ik aan?) en ik kon niet worden geholpen omdat er een "computerstoring" was.
Toen ik vroeg of ze een notitie met pen en papier konden maken zodat ik niet opnieuw hoefde te bellen ("pen en papier werken toch nog wel bij jullie?" vroeg ik) vertikten ze dat.
En wat dacht je van de websites van nota bene internet en telecomproviders zoals T-Mobile en Vodafone?
Probeer daar maar eens een webformulier in te vullen.
Grote kans dat je dat een paar keer opnieuw moet doen.
Tegenwoordig gebruik ik uit voorzorg de copy en paste functie van mijn muis als ik een webformulier invul, want ik ga er al vanuit dat als ik op "next" druk ik een melding krijg zoals "oeps er is iets misgegaan, probeer het opnieuw".
De website van het UWV (Werk) wil ik niet teveel woorden aan kwijt , maar geloof me dat is echt kommer en kwel .
Ook van deze instantie (met name van deze instantie) neem ik aan dat er genoeg blikken dure ICT-ers worden opengetrokken....

Op de flauwe en kinderachtige opmerkingen van de anderen zal ik maar niet reageren.

SWITCHES=/F DEVICE=HIMEM.SYS /TESTMEM:OFF


Acties:
  • 0 Henk 'm!

  • PiepPiep
  • Registratie: Maart 2002
  • Laatst online: 18-01-2023
Noxious schreef op woensdag 14 december 2011 @ 14:53:
[...]
Delphi:
1
2
3
  QRLabel23.caption:='Wij zullen automatisch  het faktuurbedrag van';
  qrLabel24.caption:='Euro , van uw rekening overschrijven op onze';
  qrlabel25.caption:='bankrekening nr';


@ Darkstone: ja dat is ook zo heerlijk aan dit project :P
Ik vind die hoofdletters/kleine letters ook wel erg mooi.

486DX2-50 16MB ECC RAM 4x 500MB Drive array 1.44MB FDD MS-Dos 6.22


Acties:
  • 0 Henk 'm!

  • Spockz
  • Registratie: Augustus 2003
  • Laatst online: 21-09 10:08

Spockz

Live and Let Live

PiepPiep schreef op woensdag 14 december 2011 @ 15:31:
[...]

Ik vind die hoofdletters/kleine letters ook wel erg mooi.
Ach, dat maakt toch niet uit. Pascal is niet hoofdletter gevoelig.


/me rent

C'est le ton qui fait la musique. | Blog | @linkedin
R8 | 18-55 IS | 50mm 1.8 2 | 70-200 2.8 APO EX HSM | 85 1.8


Acties:
  • 0 Henk 'm!

  • Paul
  • Registratie: September 2000
  • Laatst online: 12:14
soedesh schreef op woensdag 14 december 2011 @ 15:29:
Laatst belde ik bijv. met de Belastingdienst (ongeveer de rijkste instantie van allemaal neem ik aan?) en ik kon niet worden geholpen omdat er een "computerstoring" was.
Dat kan altijd natuurlijk...
Ook van deze instantie (met name van deze instantie) neem ik aan dat er genoeg blikken dure ICT-ers worden opengetrokken....
Die kampen met hele andere problemen, geloof mij maar dat dat niks te maken heeft met 'maatwerk' en 'niemand weet wie wat gedaan heeft'. Het probleem daar is mijns inziens dat vooral a-technische mensen betrokken worden bij de beslissingen; iedere manager wil er zijn plasje over doen, iedereen zit met zijn eigen domein, iedereen heeft zijn eigen belangen.

Zo zijn er manager die de hele (technische) achterban compleet negeren en de nieuwe versie live zetten ondanks gigantische bugs, vulnerabilities etc alleen maar omdat ze daardoor de deadline halen en dus hun eindejaarsbonus krijgen. Dat de klant vervolgens nog maanden met een waardeloos klotepakket zit boeit ze werkelijk helemaal niks.

De belangen van het bedrijf of van de klant hoeven helemaal niet de belangen van degene die het project leidt te zijn. Krom en waardeloos? Behoorlijk. Realiteit? Helaas :(

"Your life is yours alone. Rise up and live it." - Richard Rahl
Rhàshan - Aditu Sunlock


Acties:
  • 0 Henk 'm!

  • Otherside1982
  • Registratie: Februari 2009
  • Laatst online: 24-09 20:54
Noxious schreef op woensdag 14 december 2011 @ 14:53:
...
Ook de prachtige backupfunctionaliteit wil ik jullie niet onthouden:

Delphi:
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
procedure Tbackupform.Button1Click(Sender: TObject);
var command,params,workdir:string;
begin
 command:='xcopy32.exe' +#0;
 params:='c:\fakturering\data\*.* c:\fakturering\backup\*.*' +#0;
 workdir:='' +#0;
 if shellexecute(handle,'open',@command[1],
    @params[1],@workdir[1], sw_shownormal) <32 then
    messageDlg('Foute opdracht kopie',
    mtError,[mbOk],0);
 button3.enabled:=true;
end;

procedure Tbackupform.FormActivate(Sender: TObject);
begin
 button3.enabled:=false;
end;

procedure Tbackupform.Button3Click(Sender: TObject);
var command,params,workdir:string;
begin
  command:='c:\fakturering\backup\arj.exe' +#0;
  params:='A A:reserve -V1440 -JM1 -X*.exe' +#0;
  workdir:='C:\fakturering\backup\' +#0;
  if shellexecute(handle,'open',@command[1],
    @params[1],@workdir[1], sw_shownormal) <32 then
    messageDlg('Foute opdracht opslaan',
    mtError,[mbOk],0)
  else
  begin
   basis.laatstetable.open;
   basis.laatstetable.edit;
   basis.laatstetable['BACKUP']:=date();
   basis.laatstetable.post;
  end;
end;

procedure Tbackupform.Button4Click(Sender: TObject);
var command,params,workdir:string;
begin
 command:='xcopy32.exe' +#0;
 params:='c:\fakturering\backup\*.* c:\fakturering\data\*.*' +#0;
 workdir:='' +#0;
 if shellexecute(handle,'open',@command[1],
    @params[1],@workdir[1], sw_shownormal) <32 then
    messageDlg('Foute opdracht herstel',
    mtError,[mbOk],0);
 close;
end;


@ Darkstone: ja dat is ook zo heerlijk aan dit project :P
Als ik het goed begrijp werkt de backup dus als volgt:
  • 1 knop om alles te kopieren naar de backup folder
  • 1 knop om de backup folder te comprimeren naar (een self extracting exe) op diskette A:
  • 1 knop om de backup folder terug te zetten naar de werk-folder
Dus om een gecomprimeerde backup terug te zetten moet je dan manueel de self-extracting exe naar de backupfolder kopieren, daar uitvoeren en laten extracten en dan button4 aanklikken? Handig.

Acties:
  • 0 Henk 'm!

  • Noxious
  • Registratie: Juli 2002
  • Laatst online: 24-09 17:38
Ik vermoed het inderdaad, zo goed heb ik er niet eens naar gekeken.
Ik heb maar besloten dat we 0 gaan doen met de oude code.

Acties:
  • 0 Henk 'm!

  • Davio
  • Registratie: November 2007
  • Laatst online: 06-01 16:46
Altijd mooi om volledige logica in je events te stoppen.
En dan copy-pasten als je een menu-item hebt die hetzelfde moet doen. :)

Acties:
  • 0 Henk 'm!

  • Paul
  • Registratie: September 2000
  • Laatst online: 12:14
1 stapje omhoog is
Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
procedure Tbackupform.Button3Click(Sender: TObject);
begin
    // doe meukjes
end;

procedure Tbackupform.Button213Click(Sender: TObject);
begin
    Button3Click(Sender);
end;

// Of voor de luie mensch
procedure Tbackupform.Button214Click(Sender: TObject);
begin
    Button3.Click();
end;
Ik heb een paar jaar Delphi 5-code mogen onderhouden waar 0 (user defined) klasses in zaten maar _alles_ in de eventhandlers 8)7 Absolute winnaar was een Timer1.Timer() van 25.000 regels :X

"Your life is yours alone. Rise up and live it." - Richard Rahl
Rhàshan - Aditu Sunlock


  • Avalaxy
  • Registratie: Juni 2006
  • Laatst online: 24-09 23:22
Janoz schreef op donderdag 15 december 2011 @ 09:40:

Ik denk dat de omgang met managers toch wel een redelijk deel van de werkzaamheden van de gemiddelde ontwikkelaar is ;)
Maar het is geen slecht programmeervoorbeeld ;)

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 09:43

Janoz

Moderator Devschuur®

!litemod

Avalaxy schreef op donderdag 15 december 2011 @ 09:49:
[...]


Maar het is geen slecht programmeervoorbeeld ;)
Donders. Dit is het andere lange topic. Posts zijn ondertussen naar de andere draad gegooid.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • Stroopwafels
  • Registratie: September 2009
  • Laatst online: 11:23
Luiheid? 8)

PHP:
1
2
3
4
5
function mres($value)
{
    $string = mysql_real_escape_string($value);
    return $string;
}

  • Skobes
  • Registratie: Oktober 2011
  • Laatst online: 07-09 09:04
Het is geen stuk code, maar mijn PHP/Programmeren leraar juicht het gebruik van MD5 toe. Is volgens hem amper gekraakt, en het veiligste om te gebruiken..

  • PiepPiep
  • Registratie: Maart 2002
  • Laatst online: 18-01-2023
Ik kom nu ook weer een mooie tegen hier op werk.
Er zijn 3 tabellen x y en z die 1 op n met elkaar verbonden zijn zodat je een mooie boomstructuur krijgt.
Ik lees tabel x in en zet het in een mooie sorteddictionary zodat ik snel y.parent kan opzoeken om daar dan de zooi aan toe te voegen die ik nodig heb en vervolgens kan ik weer snel z.parent.parent zoeken en daarvan z.parent om de y te vinden om de z items toe te voegen.
Crasht mijn code op een null value.
Na toch nog even een uurtje te moeten zoeken kom ik erachter dat wanneer je een item y uit een x weggooit de z items gewoon blijven bestaan en de database hier niet over zeurt omdat er totaal geen foreign keys zijn gemaakt.
Lang leve de databases met zooi erin waar je omheen moet programmeren :S

486DX2-50 16MB ECC RAM 4x 500MB Drive array 1.44MB FDD MS-Dos 6.22


Verwijderd

Skobes schreef op donderdag 15 december 2011 @ 14:34:
Het is geen stuk code, maar mijn PHP/Programmeren leraar juicht het gebruik van MD5 toe. Is volgens hem amper gekraakt, en het veiligste om te gebruiken..
Vraag hem dan eens waarom het veiliger is dan SHA256/SHA512, etc. kijken wat ie zegt xD

  • Skobes
  • Registratie: Oktober 2011
  • Laatst online: 07-09 09:04
Volgens mij heeft 'ie nog nooit gehoord van SHA, MD5 boven alles!

  • PiepPiep
  • Registratie: Maart 2002
  • Laatst online: 18-01-2023
Skobes schreef op donderdag 15 december 2011 @ 14:34:
Het is geen stuk code, maar mijn PHP/Programmeren leraar juicht het gebruik van MD5 toe. Is volgens hem amper gekraakt, en het veiligste om te gebruiken..
Vroeger in zijn tijd was het vast nog veilig.
Ik zie op wikipedia dat er in 96 een niet ernstige fout gevonden is en verder in 2007 12 verschillende pdf's gemaakt zijn met dezelfde hash en in 2008 zelfs een ssl certificaat is vervast. Lijkt me toch niet echt de veiligste nee :P

486DX2-50 16MB ECC RAM 4x 500MB Drive array 1.44MB FDD MS-Dos 6.22


Verwijderd

Stroopwafels schreef op donderdag 15 december 2011 @ 14:13:
Luiheid? 8)

PHP:
1
2
3
4
5
function mres($value)
{
    $string = mysql_real_escape_string($value);
    return $string;
}
Nee dit is luiheid:
PHP:
1
2
3
4
function mres($value)
{
    return mysql_real_escape_string($value);
}

Verwijderd

Verwijderd schreef op donderdag 15 december 2011 @ 15:00:
[...]

Nee dit is luiheid:
PHP:
1
2
3
4
function mres($value)
{
    return mysql_real_escape_string($value);
}
Nee dat kost weer meer moeite als ie ooit nog $string verder aan wil passen, en sommige mensen moeten even nadenken voordat ze zien: hey dat kan gewoon meteen achter die return. Meer moeite dus.

  • urk_forever
  • Registratie: Juni 2001
  • Laatst online: 24-09 16:52
Kom net dit tegen:

C#:
1
2
StringBuilder sbErrors = new StringBuilder();
sbErrors.AppendFormat(string.Format(ResourcesFile.Melding123, Environment.NewLine));


Melding123 is een string met de volgende inhoud: "Melding 123: {0}"

8)7 :F

Hail to the king baby!


  • MBV
  • Registratie: Februari 2002
  • Laatst online: 10:59
Janoz schreef op donderdag 15 december 2011 @ 09:55:
[...]

Donders. Dit is het andere lange topic. Posts zijn ondertussen naar de andere draad gegooid.
En bedankt, ik dacht al dat ik te weinig koffie had gehad vanochtend (of dat Ubuntu weer eens was vergeten de titelbalk te updaten, ik zie nu op dit moment ook "printf - C+ Reference " boven mijn firefox-venster staan 8)7)

  • YopY
  • Registratie: September 2003
  • Laatst online: 13-07 01:14
Verwijderd schreef op donderdag 15 december 2011 @ 15:00:
[...]

Nee dit is luiheid:
PHP:
1
2
3
4
function mres($value)
{
    return mysql_real_escape_string($value);
}
Kan nog korter!

PHP:
1
2
3
$mres = 'mysql_real_escape_string'

$pdowuzzat = $mres("select * from users where '' or 1 = 1")


Nog meer alternatieven op http://stackoverflow.com/...e-alias-a-function-in-php

[ Voor 3% gewijzigd door YopY op 15-12-2011 15:44 ]


  • Bartjeh
  • Registratie: September 2010
  • Laatst online: 17-09 09:27
YopY schreef op donderdag 15 december 2011 @ 15:43:
[...]


Kan nog korter!

PHP:
1
2
3
$mres = 'mysql_real_escape_string'

$pdowuzzat = $mres("select * from users where '' or 1 = 1")


Nog meer alternatieven op http://stackoverflow.com/...e-alias-a-function-in-php
Korter ja, leesbaarder nee.

  • wjzijderveld
  • Registratie: Augustus 2005
  • Laatst online: 23-08 10:55
YopY schreef op donderdag 15 december 2011 @ 15:43:
[...]
PHP:
1
2
3
$mres = 'mysql_real_escape_string'

$pdowuzzat = $mres("select * from users where '' or 1 = 1")
Heeft weinig meer te maken met het origineel, maar waarom escape je een complete query?

Canon EOS60D | Canon 100mm f/2.8 USM | Canon 100-400mm f/4.5-5-6L | Canon 10-22mm f/3.5-4.5 USM | Canon 430EX II


  • barfieldmv
  • Registratie: Maart 2004
  • Laatst online: 23-08 21:37
urk_forever schreef op donderdag 15 december 2011 @ 15:34:
Kom net dit tegen:

C#:
1
2
StringBuilder sbErrors = new StringBuilder();
sbErrors.AppendFormat(string.Format(ResourcesFile.Melding123, Environment.NewLine));


Melding123 is een string met de volgende inhoud: "Melding 123: {0}"

8)7 :F
Dat doe ik ook consequent met meldingen. {0} is een NewLine die als Constant string br staat gedefinieerd op de meeste base classes.
Een newline typen in een resource file is zo lastig O-)

  • urk_forever
  • Registratie: Juni 2001
  • Laatst online: 24-09 16:52
barfieldmv schreef op donderdag 15 december 2011 @ 16:20:
[...]


Dat doe ik ook consequent met meldingen. {0} is een NewLine die als Constant string br staat gedefinieerd op de meeste base classes.
Een newline typen in een resource file is zo lastig O-)
Dat was niet eens waar ik op doelde, de String.Format binnen de AppendFormat is dubbelop, ze doen beide hetzelfde.
Daarnaast wordt deze melding alleen in WinForms gebruikt dus kan je net zo goed een AppendLine gebruiken.

Hail to the king baby!


Acties:
  • 0 Henk 'm!

  • TheJVH
  • Registratie: Mei 2007
  • Laatst online: 01:30
Hier op m'n werk ook wat leuks tegengekomen:

Een site waarvan een slideshow goed moest passen in een gebied, met goede verhoudingen. Prima, maar omdat er op de site een menu onderin soms wat langer is, is er dus voor elke mogelijkheid een if/else geschreven:
JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
var projmh = $('#project_menu').height();
    
    if(projmh <= 15) {
        $('.slideshow').css('height',sh-125);
    } 
    else if(projmh == 28) {
        $('.slideshow').css('height',sh-153);
}
    else if(projmh == 30) {
        $('.slideshow').css('height',sh-145);
}
    else if(projmh == 56) {
        $('.slideshow').css('height',sh-195);
}
    else if(projmh == 84) {
        $('.slideshow').css('height',sh-231);
}


Natuurlijk was het buggy as hell, dus heb ik het maar onderaan rechtgezet met:
JavaScript:
1
2
3
var contentHolderHeight = $('.content_holder').css('height');
    
$('.slideshow').css('height', contentHolderHeight);



Overigens was de code niet gecomment en waren er variabelen aanwezig als "sw", "sh", "projmh", etc... Verder ben ik er maar niet aan gekomen...

Acties:
  • 0 Henk 'm!

  • 418O2
  • Registratie: November 2001
  • Nu online
hou je wel rekening met height en eventuele outerheight issues.

Acties:
  • 0 Henk 'm!

  • TheJVH
  • Registratie: Mei 2007
  • Laatst online: 01:30
Is geen issue ;) . Dit werkte en toen ben ik maar weer heel snel uit de code gevlucht...

Acties:
  • 0 Henk 'm!

  • YopY
  • Registratie: September 2003
  • Laatst online: 13-07 01:14
NIET BELANGRIJK KORTER IS GOED asdifowj2^$%#%&. :+
wjzijderveld schreef op donderdag 15 december 2011 @ 16:18:
[...]

Heeft weinig meer te maken met het origineel, maar waarom escape je een complete query?
x) onnozelheid, excuus.

Acties:
  • 0 Henk 'm!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
... dacht even dat dit de devschuur was ... :P

[ Voor 82% gewijzigd door Michali op 16-12-2011 11:52 ]

Noushka's Magnificent Dream | Unity


Acties:
  • 0 Henk 'm!

  • RHochstenbach
  • Registratie: Oktober 2006
  • Laatst online: 27-02-2021
Deze is leuk:
code:
1
2
3
4
5
6
7
8
9
<form method='post' action=''>
Show this file: <input type='text' name='file'><br>
<input type='submit' name='submit' value='show file'>
</form>
<?php
if(isset($_POST['submit'])) {
        echo "<pre>".shell_exec("cat files/".$_POST['file']) ."</pre>";
}
?>

[ Voor 14% gewijzigd door RHochstenbach op 16-12-2011 12:31 ]


Acties:
  • 0 Henk 'm!

  • Dragor
  • Registratie: Juni 2003
  • Laatst online: 08-02 11:04
RHochstenbach schreef op vrijdag 16 december 2011 @ 12:28:
Deze is leuk:
code:
1
2
3
4
5
6
7
8
9
<form method='post' action=''>
Show this file: <input type='text' name='file'><br>
<input type='submit' name='submit' value='show file'>
</form>
<?php
if(isset($_POST['submit'])) {
        echo "<pre>".shell_exec("cat files/".$_POST['file']) ."</pre>";
}
?>
Laat mij dan maar de file '; rm -rf /' zien >:)

Acties:
  • 0 Henk 'm!

  • themole
  • Registratie: Juli 2010
  • Laatst online: 19-11-2023
RHochstenbach schreef op vrijdag 16 december 2011 @ 12:28:
Deze is leuk:
code:
1
2
3
4
5
6
7
8
9
<form method='post' action=''>
Show this file: <input type='text' name='file'><br>
<input type='submit' name='submit' value='show file'>
</form>
<?php
if(isset($_POST['submit'])) {
        echo "<pre>".shell_exec("cat files/".$_POST['file']) ."</pre>";
}
?>
Altijd leuk van die mensen die shell_exec() voor van alles en nog wat gebruiken zonder dat er wordt gekeken wat er in de $_POST zit. :')

Acties:
  • 0 Henk 'm!

  • Killemov
  • Registratie: Januari 2000
  • Laatst online: 11:11

Killemov

Ik zoek nog een mooi icooi =)

themole schreef op vrijdag 16 december 2011 @ 13:42:
[...]

Altijd leuk van die mensen die shell_exec() voor van alles en nog wat gebruiken zonder dat er wordt gekeken wat er in de $_POST zit. :')
Ik zie vaak dat dit soort dingen in den beginne even worden gerapid-prototypt en dat er aan den einden geen gelegenheid meer is om het goed te doen. Meer een managersprobleem dus. |:(

Hey ... maar dan heb je ook wat!


Acties:
  • 0 Henk 'm!

  • EddoH
  • Registratie: Maart 2009
  • Niet online

EddoH

Backpfeifengesicht

Killemov schreef op vrijdag 16 december 2011 @ 14:38:
[...]

Ik zie vaak dat dit soort dingen in den beginne even worden gerapid-prototypt en dat er aan den einden geen gelegenheid meer is om het goed te doen. Meer een managersprobleem dus. |:(
Nou ben ik ook van mening dat goede software tijd kost, maar om zoiets gelijk af te schuiven op de manager gaat toch wel heel ver :P

Acties:
  • 0 Henk 'm!

  • Noxious
  • Registratie: Juli 2002
  • Laatst online: 24-09 17:38
Daarbij ben ik eigenlijk van mening dat dit zelfs voor 'rapid prototyping' veel te ver gaat :+

Wat is er moeilijk aan een echo(file_get_contents("bestandje.bla")); wat voor de front-end hetzelfde doet maar wel veel veiliger?

Acties:
  • 0 Henk 'm!

  • Killemov
  • Registratie: Januari 2000
  • Laatst online: 11:11

Killemov

Ik zoek nog een mooi icooi =)

Noxious schreef op vrijdag 16 december 2011 @ 14:56:
Daarbij ben ik eigenlijk van mening dat dit zelfs voor 'rapid prototyping' veel te ver gaat :+

Wat is er moeilijk aan een echo(file_get_contents("bestandje.bla")); wat voor de front-end hetzelfde doet maar wel veel veiliger?
Daar is helemaal niets moeilijks aan. Ik zeg alleen dat ik het zo in de praktijk heb meegemaakt.

Hey ... maar dan heb je ook wat!


Acties:
  • 0 Henk 'm!

  • Davio
  • Registratie: November 2007
  • Laatst online: 06-01 16:46
EddoH schreef op vrijdag 16 december 2011 @ 14:41:
[...]


Nou ben ik ook van mening dat goede software tijd kost, maar om zoiets gelijk af te schuiven op de manager gaat toch wel heel ver :P
Tja, dit soort dingen zijn al zo lang bekend dat als je dit als zelfrespecterend PHP-er nog in de praktijk doet, beter een andere baan kunt zoeken.

Je moet jezelf gewoon aanleren om het altijd in het begin al netjes te doen en niet achteraf een complete code review te moeten doen om dit soort fouten eruit te halen.

Acties:
  • 0 Henk 'm!

  • Kwastie
  • Registratie: April 2005
  • Laatst online: 23-09 16:09

Kwastie

Awesomeness

Killemov schreef op vrijdag 16 december 2011 @ 14:38:
[...]

Ik zie vaak dat dit soort dingen in den beginne even worden gerapid-prototypt en dat er aan den einden geen gelegenheid meer is om het goed te doen. Meer een managersprobleem dus. |:(
Wel erg gemakkelijk om het op de manager af te schuiven..

Na mijn menige schrijf je zulke functionaliteit niet als het rapid-prototypen bent, je gebruikt een framework die veel dingen VOOR jouw doet. (dat scheelt pas veel tijd :9 )

Rapid-prototypen betekend niet dat je slechte code hoeft te schrijven, sommige dingen had je misschien achteraf anders/beter willen doen, maar dat is geen rede voor slechte (brakke/onvelige) code.

[ Voor 18% gewijzigd door Kwastie op 17-12-2011 20:50 ]

When I get sad i stop being sad and be awesome instead


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-09 16:37

.oisyn

Moderator Devschuur®

Demotivational Speaker

Eentje van mezelf:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
typedef std::vector</*some type*/> vector_type;

vector_type VectorRotateLeft(const vector_type & v, int amount)
{
    amount %= v.size();
    if (amount < 0)
        amount += v.size();

    vector_type r;
    r.reserve(v.size());
    r.insert(r.end(), v.begin() + amount, v.end());
    r.insert(r.end(), v.begin(), v.begin() + amount);

    return r;
}

En ik me maar afvragen waarom de resultaten zo raar zijn bij negatieve getallen |:(

hint: de fout zit op regel 5

[ Voor 4% gewijzigd door .oisyn op 20-12-2011 01:50 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • CodeCaster
  • Registratie: Juni 2003
  • Niet online

CodeCaster

Can I get uhm...

Regel 7 had amount = abs(amount); moeten zijn? O-)

https://oneerlijkewoz.nl
Op papier is hij aan het tekenen, maar in de praktijk...


Acties:
  • 0 Henk 'm!

  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
Was std::rotate() geen optie? :p

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-09 16:37

.oisyn

Moderator Devschuur®

Demotivational Speaker

CodeCaster schreef op dinsdag 20 december 2011 @ 00:38:
Regel 7 had amount = abs(amount); moeten zijn? O-)
Natuurlijk niet, rotate(v, -1) is niet hetzelfde als rotate(v, 1) (met v.size() > 2). Als v.size() == 10, dan rotate(v, -1) == rotate(v, 9). Maar dat gaat dus niet goed op de huidige manier. Ik denk dat je het zonder goede kennis van C / C++ niet echt kan spotten ;)
Niet echt. Die gaat ten eerste het probleem dat ik had niet fixen (std::rotate gaat uit van iterators, niet van een aantal), en ten tweede wil ik sowieso een kopie maken. Twee ranges kopiëren is in dit geval gewoon wat efficienter (en ik gebruik VC++ 2010 met support voor r-value references, dus de return value wordt gemoveconstruct dus dat is sowieso geen penalty ;))

[ Voor 38% gewijzigd door .oisyn op 20-12-2011 01:52 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • EddoH
  • Registratie: Maart 2009
  • Niet online

EddoH

Backpfeifengesicht

De %-operator in C++ is een remainder implementatie en geen echte modulo volgens mij?
Kan in de trein moeilijk testen :)

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-09 16:37

.oisyn

Moderator Devschuur®

Demotivational Speaker

C definieert het gedrag van % niet (het antwoord mag zowel positief als negatief zijn), maar in de praktijk is het resultaat negatief als slechts een van de operanden negatief is. -1 en 6 zijn in feite beide goede antwoorden voor -1 % 7, VC++ en gcc zeggen -1. Maar dat is niet erg, daar check ik op op regel 6.

Maar dat is het punt niet. Het punt is dat std::vector::size() unsigned is, en dus wordt amount ook geconverteerd naar unsigned. -1 % 7 wordt dan dus 4294967295 % 7 == 3.

[ Voor 5% gewijzigd door .oisyn op 20-12-2011 11:50 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • EddoH
  • Registratie: Maart 2009
  • Niet online

EddoH

Backpfeifengesicht

Ach natuurlijk. Wist niet uit m'n hoofd dat std::vector::size() unsigned is. Ik gebruik eigenlijk altijd QVector (Qt), waarbij size() gewoon signed is.

Acties:
  • 0 Henk 'm!

  • Andre-85
  • Registratie: April 2003
  • Niet online

Andre-85

Sid

EddoH schreef op dinsdag 20 december 2011 @ 12:06:
Ach natuurlijk. Wist niet uit m'n hoofd dat std::vector::size() unsigned is. Ik gebruik eigenlijk altijd QVector (Qt), waarbij size() gewoon signed is.
Wat helemaal niet zo "gewoon" is omdat size niet negatief kan zijn. ;)

Lorem
Whenever we feel the need to comment something, we write a method instead. - Martin Fowler
People who think they know everything really annoy those of us who know we don't - Bjarne Stroustrup


Acties:
  • 0 Henk 'm!

  • EddoH
  • Registratie: Maart 2009
  • Niet online

EddoH

Backpfeifengesicht

Andre-85 schreef op dinsdag 20 december 2011 @ 12:13:
[...]

Wat helemaal niet zo "gewoon" is omdat size niet negatief kan zijn. ;)
Als het goed is doolt er ergens hier nog een post van mij rond waarin ik me afvraag waarom sommige size() methods van een signed type zijn ;)

Het voorkomt iig bugs zoals .oisyn aangaf :+

Acties:
  • 0 Henk 'm!

  • BeerenburgCola
  • Registratie: September 2009
  • Laatst online: 20-09 14:18
EddoH schreef op dinsdag 20 december 2011 @ 12:17:
[...]


Als het goed is doolt er ergens hier nog een post van mij rond waarin ik me afvraag waarom sommige size() methods van een signed type zijn ;)

Het voorkomt iig bugs zoals .oisyn aangaf :+
Dit kan als de size() methode een berekening doet. Het is allemaal maar theoretisch, maar je weet niet hoe de size() method de actuele lengte berekend.
Door een undefined <whatever> of een programmeerfout zou je een negatieve waarde kunnen krijgen.
Door size() signed te maken en the checken op if (size()>=0)... of if (size()>0) ... vang je dit soort hypothetische fouten af. Dit soort fouten zijn zeer zeldzaam maar niet onmogelijk. Discussies hierover zijn ook behoorlijk "Academisch"...

In Java kun je trouwens niet anders omdat Java geen unsigned types kent.
Ook is het soms handig om "signed vs unsigned" gedoe te vermijden.
Maak alles signed en je hebt het probleem niet.

[ Voor 6% gewijzigd door BeerenburgCola op 20-12-2011 12:29 ]


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-09 16:37

.oisyn

Moderator Devschuur®

Demotivational Speaker

Sorry maar dat gaat nergens over. Leuk dat je fouten af kunt vangen door te kijken of ze negatief zijn, maar daarmee vang je de fouten die positief zijn niet af, en het geeft daardoor alleen maar een vals gevoel van correctheid. Beter bewijs je het algoritme of gebruik je extensieve tests om fouten op te sporen. En er bestaat een veel belangrijkere reden om size unsigned te maken: er kunnen 2x zoveel elementen in.
In Java kun je trouwens niet anders omdat Java geen unsigned types kent.
Ook is het soms handig om "signed vs unsigned" gedoe te vermijden.
Maak alles signed en je hebt het probleem niet.
En het is tevens niet zo gek dat Java een aantal problemen kent als je om probeert te gaan met binaire data, juist door het gemis van een unsigned byte type. Signed/unsigned bugs zijn in feite nog af te vangen door de compiler (standaard C is wat dat betreft een beetje gaar wat betreft impliciete conversies tussen numerieke fundamentele typen). Vergeten een &255 te doen bij conversie van byte naar int in Java niet.

[ Voor 52% gewijzigd door .oisyn op 20-12-2011 12:44 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • Infinitive
  • Registratie: Maart 2001
  • Laatst online: 25-09-2023
Als het berekenen van een lengte een foutmelding op kan leveren dan heb je verschillende betere oplossingen i.p.v. negatieve waarden:
  1. exceptions (indien beschikbaar)
  2. de lengte via een out-parameter (pointer/reference), en een foutcode/boolean als resultaat opleveren
  3. een union-achtige constructie waarbij je eerst moet bepalen welke van de alternatieven opgeleverd is
Het combineren van een foutcode en een echt resultaat in een integer is gemakzucht. Echter, toch zie je het veel gebeuren. Bijvoorbeeld in de linux kernel waarbij een pointer wordt opgeleverd en bepaalde bits als foutcodes worden gebruikt. De reden is denk ik dat optie (2) je programma minder leesbaar maakt of in ieder geval langer te schrijven omdat je dan ook nog locale variabelen als buffer dient te declareren.

[ Voor 26% gewijzigd door Infinitive op 20-12-2011 12:48 ]

putStr $ map (x -> chr $ round $ 21/2 * x^3 - 92 * x^2 + 503/2 * x - 105) [1..4]


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-09 16:37

.oisyn

Moderator Devschuur®

Demotivational Speaker

Infinitive schreef op dinsdag 20 december 2011 @ 12:45:
Als het berekenen van een lengte een foutmelding op kan leveren dan heb je verschillende betere oplossingen i.p.v. negatieve waarden:
Volgens mij bedoelt hij dat je de code op fouten kunt controleren door te kijken of de berekening wel een verwachte uitkomst heeft (bijv. dmv een assert). Niet om legitieme foutmeldingen te rapporteren aan de gebruiker van de functie.

[ Voor 6% gewijzigd door .oisyn op 20-12-2011 12:58 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • BeerenburgCola
  • Registratie: September 2009
  • Laatst online: 20-09 14:18
.oisyn schreef op dinsdag 20 december 2011 @ 12:57:
[...]

Volgens mij bedoelt hij dat je de code op fouten kunt controleren door te kijken of de berekening wel een verwachte uitkomst heeft (bijv. dmv een assert). Niet om legitieme foutmeldingen te rapporteren aan de gebruiker van de functie.
Yup. Ik heb dit soort technieken in plain C geleerd, waar je bijvoorbeeld geen exceptions hebt. Zoals hierboven aangeven.
Het gaat dus niet om het terrug geven van foutcodes maar daadwerkelijk programmeer fouten afvangen.
Dit heet "defensive" programming.

[ Voor 4% gewijzigd door BeerenburgCola op 20-12-2011 14:03 ]


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-09 16:37

.oisyn

Moderator Devschuur®

Demotivational Speaker

Defensive programming moet niet in de weg staan van het kiezen van het juiste type.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • RayNbow
  • Registratie: Maart 2003
  • Laatst online: 08:22

RayNbow

Kirika <3

.oisyn schreef op dinsdag 20 december 2011 @ 12:35:
Beter bewijs je het algoritme of gebruik je extensieve tests om fouten op te sporen slaat de compiler je om de oren met een warning wanneer je signed en unsigned integers in de blender gooit.
Fixed that for you. :Y)

(Of rigoreuzer zoals Haskell: een type error)

[ Voor 8% gewijzigd door RayNbow op 20-12-2011 16:09 ]

Ipsa Scientia Potestas Est
NNID: ShinNoNoir


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-09 16:37

.oisyn

Moderator Devschuur®

Demotivational Speaker

Als je nou gewoon eens mijn hele post las :P
Signed/unsigned bugs zijn in feite nog af te vangen door de compiler (standaard C is wat dat betreft een beetje gaar wat betreft impliciete conversies tussen numerieke fundamentele typen).

[ Voor 69% gewijzigd door .oisyn op 20-12-2011 16:18 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • RayNbow
  • Registratie: Maart 2003
  • Laatst online: 08:22

RayNbow

Kirika <3

.oisyn schreef op dinsdag 20 december 2011 @ 16:18:
Als je nou gewoon eens mijn hele post las :P

[...]
M'n attention span is blijkbaar niet al te groot deze middag. :p

Ipsa Scientia Potestas Est
NNID: ShinNoNoir

Pagina: 1 ... 78 ... 103 Laatste

Dit topic is gesloten.

Let op:
Uiteraard is het in dit topic niet de bedoeling dat andere users en/of topics aangehaald worden om ze voor gek te zetten. Lachen om je eigen code, of over dingen die je "wel eens tegengekomen bent" is prima, maar hou het onderling netjes. :)