Saved by the buoyancy of citrus
Kopieer de code dan ook goed en ga geen nonsense-verhaal ophalen over verkeerd in de mail ge-paste oidVerwijderd schreef op maandag 30 oktober 2006 @ 17:02:
[...]
Ik vond het nogal lang duren vorodat iemand die code in google flikkerde...in plaats van in zijn compiler... gelukkig maar dat ik dan niet de slechtste programmeur van GoT ben. Zoals een goed programmeur betaamt kun je goede code beter 'lenen' dan proberen opnieuw uit te vinden...
Ace of Base vs Charli XCX - All That She Boom Claps (RMT) | Clean Bandit vs Galantis - I'd Rather Be You (RMT)
You've moved up on my notch-list. You have 1 notch
I have a black belt in Kung Flu.
*schaam*S2K schreef op vrijdag 03 november 2006 @ 10:19:
[...]
Ik vrees dat Edsger W. Dijkstra zich nu in zijn graf omdraait dat zijn naam zo verbasterd word.
Ik weet wel dat het Dijkstra is, ik had alleen even last van een thinko
More than meets the eye
There is no I in TEAM... but there is ME
system specs
Verwijderd
Zie hier mijn oplossing van het zoeken van een IP in de database:
1
2
3
4
5
6
7
8
9
| $ip=$_SERVER['REMOTE_ADDR'];
$sql3 = "SELECT * FROM zkshoutbanned";
$resultaat = mysql_query($sql3);
while($record = mysql_fetch_object($resultaat)){
$banned = $record->banned;
if($ip == $banned){
$banned2=1;
}
} |
[ Voor 3% gewijzigd door Verwijderd op 04-11-2006 20:55 ]
Mweh, ik las er ook overheen hoor.IceManX schreef op vrijdag 03 november 2006 @ 20:48:
[...]
*schaam*
Ik weet wel dat het Dijkstra is, ik had alleen even last van een thinko
Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info
in C/C++ zou dit ook een heel plausibele construcie zijn om bij een corrupte stack door een pointer fout oid te detecteren dat de waarde van aBool defect is. ( het wordt door de schrijvers van http://www.pragmaticprogrammer.com/ppbook/index.shtml aangeraden om te doen )EdwinG schreef op vrijdag 27 oktober 2006 @ 11:21:
Een typisch voorbeeld van hoe het dus NIET moet:
code:
1 2 3 4 5 6 7 8 9switch ( aBool ) { case TRUE: do_dit(); case FALSE: do_dat(); default: doe_iets_anders(); }
Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.
Verwijderd
1
2
3
4
| if (LOG.isDebugEnabled()) {
LOG.debug("doe belangrijke dingen");
doeBelangrijkeDingen();
} |
hehe, die is leuk ja.Verwijderd schreef op woensdag 08 november 2006 @ 12:37:
Ik had in een pet-project laatst eens een haastige fout gemaakt. Het duurde alleen wel even voordat ik hem had opgespoort...
code:
1 2 3 4if (LOG.isDebugEnabled()) { LOG.debug("doe belangrijke dingen"); doeBelangrijkeDingen(); }
Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info
1
2
3
4
5
6
7
8
| #include <cassert> bool doeBelangrijkeDingen(); // returns true on success int main() { assert(doeBelangrijkeDingen()); } |
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.
Persoonlijk zou ik de test isDebugEnabled () in de debug-method zelf stoppen. Het lijkt me vrij logisch dat een debug-method niets doet als isDebugEnabled false is. En dan kan bovenstaande fout zich ook niet voordoen.Verwijderd schreef op woensdag 08 november 2006 @ 12:37:
Ik had in een pet-project laatst eens een haastige fout gemaakt. Het duurde alleen wel even voordat ik hem had opgespoort...
code:
1 2 3 4if (LOG.isDebugEnabled()) { LOG.debug("doe belangrijke dingen"); doeBelangrijkeDingen(); }
Als dit java-code is en je met log4j logt dan los je dit in je log4j.properties of log4j.xml opschoene schreef op woensdag 08 november 2006 @ 13:12:
[...]
Persoonlijk zou ik de test isDebugEnabled () in de debug-method zelf stoppen. Het lijkt me vrij logisch dat een debug-method niets doet als isDebugEnabled false is. En dan kan bovenstaande fout zich ook niet voordoen.
1
2
3
4
5
| if(!session_id()){ session_start(); } ini_set('session.gc_maxlifetime',3600000*24*30); //lifetime a bit high, irritating otherwise. |
Bezoek eens een willekeurige pagina
Als je in je log4j.properties of log4j.xml debug logging disbaled dan wordt de String "doe belangrijke dingen" nog steeds aangemaakt, ook al wordt er niets meegedaan. Nu is dat hier misschien niet zo schokkend, maar zodra je Strings gaat concateneren dan is het efficiënter om eerst te kijken of het Debug level enabled, danwel disabled is voor de logger, voordat je überhaupt verder gaat.rrrandy schreef op woensdag 08 november 2006 @ 13:21:
[...]
Als dit java-code is en je met log4j logt dan los je dit in je log4j.properties of log4j.xml op
[ Voor 3% gewijzigd door Kwistnix op 08-11-2006 14:11 ]
Mijn kennis van c++ is nihil, maar je zegt hier dus eigenlijk:.oisyn schreef op woensdag 08 november 2006 @ 12:55:
Da's altijd zo mooi met asserts in C(++)
C++:
1 2 3 4 5 6 7 8 #include <cassert> bool doeBelangrijkeDingen(); // returns true on success int main() { assert(doeBelangrijkeDingen()); }
Kijk of 'doeBelangrijkeDingen()' true is, terwijl het een true oplevert?
Je kan dus eigenlijk ook 'if(doeBelangrijkeDingen())' neerzetten?
[ Voor 8% gewijzigd door TeeDee op 08-11-2006 15:48 ]
Heart..pumps blood.Has nothing to do with emotion! Bored
1
2
3
4
5
6
7
8
9
10
11
| 'Het aanal records bepalen DoCmd.GoToRecord acDataForm, "Jaar Update", acLast Aant = Me.CurrentRecord 'Naar de eerste gaan DoCmd.GoToRecord acDataForm, "Jaar Update", acFirst For I = 1 To Aant - 1 DoeWat() DoCmd.GoToRecord acDataForm, "Jaar Update", acNext Next |
Voor de niet Access-Guru's onder ons: in deze code wordt dus steeds het event aangeroepen om de volgende record in het form te laten zien.
Ik had nog nooit van Recordsets, UPDATE statements en andere nuttige zaken gehoord
Och, dan is het niet fout. Dan wist je alleen de veeeeeel handigere dingen nietPhysicsRules schreef op woensdag 08 november 2006 @ 16:24:
Ik heb jaren geleden een keer een stuk code geschreven in Access waarin in een tabel alle waardes geupdate werden. De tabel werd geladen in een Form met het volgende resultaat:
[...]
Voor de niet Access-Guru's onder ons: in deze code wordt dus steeds het event aangeroepen om de volgende record in het form te laten zien.
Ik had nog nooit van Recordsets, UPDATE statements en andere nuttige zaken gehoord
Ah, had wel even gauw wat opgezocht over assert, wist alleen niet dat het zoveel te maken had met debuggingVerwijderd schreef op woensdag 08 november 2006 @ 16:44:
[...]
Nee, het volledige statement verdwijnt als je het zonder debug parameters compileert
------------------------
en wat betreft de openstaande vragen: Wat FallenAngel666 zei...
[ Voor 42% gewijzigd door TeeDee op 08-11-2006 16:53 ]
Heart..pumps blood.Has nothing to do with emotion! Bored
Verwijderd
Nee, het volledige statement verdwijnt als je het zonder debug parameters compileertTeeDee schreef op woensdag 08 november 2006 @ 15:46:
Je kan dus eigenlijk ook 'if(doeBelangrijkeDingen())' neerzetten?
------------------------
en wat betreft de openstaande vragen: Wat FallenAngel666 zei...
De code is niet fout, neeTeeDee schreef op woensdag 08 november 2006 @ 16:36:
[...]
Och, dan is het niet fout. Dan wist je alleen de veeeeeel handigere dingen nietQua code is het imo niet zo heel erg fout.
[...]
Ah, had wel even gauw wat opgezocht over assert, wist alleen niet dat het zoveel te maken had met debugging
Dat is gewoon gebrek aan kennis. Op zich is het een mooi stuk codePhysicsRules schreef op woensdag 08 november 2006 @ 16:54:
[...]
De code is niet fout, neeMaar over slechte programmeervoorbeelden gesproken
. Om over de performance maar te zwijgen
Zo heb ik er ook nog wel eentje. In een van mijn eerste .Net 1.1 projecten heel stoer aan de slag met een BasePage.cs.
1
2
3
4
| public class BasePage { ... // doe allemaal leuke dingen } |
1
2
3
4
5
6
7
| public class _default : System.Web.UI.Page { ... // doe allemaal leuke dingen maar ook BasePage bp = new BasePage(); literalPageTitle = bp.GetPageTitle; //etc. etc. } |
1
2
3
4
| public class BasePage : System.Web.UI.Page { ... // doe allemaal leuke dingen } |
1
2
3
4
5
6
| public class _default : BasePage { ... // doe allemaal leuke dingen maar ook literalPageTitle = bp.GetPageTitle; //etc. etc. } |
Nadat ik daar achter was heb ik het e.e.a. herschreven. Scheelt performance EN regels code
Slecht voorbeeld inderdaad. Maak anders van EenWillekeurigeMethod wat Propertie getters. Het is in ieder geval geen HelperMethod. Zal er straks nog eens induiken of ik het kan verduidelijken..oisyn schreef op woensdag 08 november 2006 @ 17:10:
Nou mis ik wat context, maar ik zou dat wat je daar doet nou niet echt per definitie beter noemen. Wat ik uit je code opmaak is dat EenWillekeurigeMethod een helper functie is en dus beter static had kunnen zijn. Gewoon maar van classes extenden zodat je hun methodes aan kunt roepen zonder een instantie te new'en is iig nooit een goed idee.
[ Voor 23% gewijzigd door TeeDee op 08-11-2006 17:17 ]
Heart..pumps blood.Has nothing to do with emotion! Bored
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.
Sowieso is het vrij inefficiënt, waarom zou je twee if statements gebruiken?therat10430 schreef op maandag 30 oktober 2006 @ 12:51:
code:
1 2 If Jeugdigen.Geslacht = True Then txt_Geslacht.ListIndex = 1 If Jeugdigen.Geslacht = False Then txt_Geslacht.ListIndex = 0
imho is dit het stuk gekste code dat ik in tijden heb geschreven! (
een true boolean is een mannetje en een false een vrouwtje..)
1
2
3
4
5
| If Jeugdigen.Geslacht = True Then txt_Geslacht.ListIndex = 1 Else txt_Geslacht.ListIndex = 0 EndIf |
En als je iets van C hebt ofzo...
1
| txt_Geslacht.ListIndex = Jeugdigen.Geslacht ? 1 : 0; |
Ook vind ik het vreemd dat je een listbox prefixed met txt_, neem dan lst_ ofzo
Laatst kwam ik het volgende tegen:
1
2
3
4
5
6
7
| if (anInt != 1) {
foo();
} else {
if (anInt == 1) {
bar();
}
} |
Ook een lekkere zinloze if
Leuk topic
[ Voor 6% gewijzigd door Punksmurf op 08-11-2006 19:45 ]
met een hamer past alles
Klopt
Klopt
Klopt
(doh, geloof het of niet, maar ik "programmeer" al enkele jaren een beetje met VB, en ik begin nu bas de handigheid van
1
2
3
4
| If blaat = true then geengeblaat = false nogmeer = true end if |
en
1
2
3
4
5
6
7
8
| Select Case iInteger Case is 1 'code Case is 2 'code etc. |
daarvoor gebruikte ik een bulk goto's en rijtjes if's
[ Voor 78% gewijzigd door roy-t op 12-11-2006 17:39 ]
Plaats dan een externe link, lijkt me een prima foute code.therat10430 schreef op zondag 12 november 2006 @ 17:36:
[...]
daarvoor gebruikte ik een bulk goto's en rijtjes if'smaar het werkte wel! en heb er hele leuke programma's mee geschreven, laatst kwam ik een stukje programma tegen (te lange foute code om hier te plakken, dat vinden de modjes niet leuk denk ik) wat ik heb geschreven, wat geloof ik met 4 case selects zo gedaan had kunnen worden, maar waar ik echt 3 meter code voor nodig had
Bezoek eens een willekeurige pagina
Daarin zitten nogal wat dingen die wel in .Net 1.1 zitten niet, .Net CF is pas vanaf 2.0 een beetje volwassen zeg maar
Om dat de ondervangen had ik een aantal kleine proceduretjes:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| namespace (bedrijfsnaam) { public class GenericTools { public static string MD5HashString(string s) { // stukje code gecopy/pase van OpenNetCF-forums } public static string ReadINIString(string Section, string Key, string DefaultValue, string FileName) { // StreamReader / peek / readline. / if startswith("["+Section) etc etc) } } } |
Notice alle static-statements
Totdat ik me bedacht dat ik moest gaan multithreaden (met name om de UI rsponsive te houden)
Ik heb echter in veel klassen maar 1 aanroep uit de hele tools-collectie nodig. Nu staat er dus een aantal keer
1
2
3
4
5
6
7
| // in CommunicationFactory: (bedrijfsnaam).GenericTools tools = new (bedrijfsnaam).GenericTools(); string comm = tools.ReadINIString("Program", "Send", "TCP", tools.ApplicationDir + "\\TrackTrace.ini"); // in DatabaseFactory: (bedrijfsnaam).GenericTools tools = new (bedrijfsnaam).GenericTools(); string database = tools.ReadINIString("Program", "Save", "SQLCE", tools.ApplicationDir + "\\TrackTrace.ini"); |
GenericTools omdat ik ook nog een SocketTools heb (voor TCP-communicatie met een Delphi/Indy TIdTCPServer) en er misschien nog wel meer komen.
ApplicationDir is een "Path.GetDirectoryName(Assembly.GetExecutingAssembly().GetModules()[0].FullyQualifiedName);" die in de constructor in een string met getter wordt gezet.
Ik weet zo alleen niet welke van de 2 ik het slechtste vind: procedureel programmeren door het allemaal static te maken, of steeds een klasse instantieren om er vervolgens 1 method uit te gebruiken
Ik moet trouwens nog eens een keer een C# coding-convention opsnorren want ik heb eigenlijk geen idee of ik het nu een beetje goed doe, wat dus ook een WTFje is
"Your life is yours alone. Rise up and live it." - Richard Rahl
Rhàshan - Aditu Sunlock
Ook voor multithreading moet het geen probleem zijn zolang je maar niet een hele rij static fields gaat gebruiken.
“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”
Ik kan het mis hebben hoor, en dan hoor ik het graag, maar een static method bestaat slechts 1x. Als ik in 2 threads tegelijk ReadINIString aanroep lijkt me dus de ene (verwijzing naar) StreamReader de andere te overschijven etc?
a: reader = new StreamReader(filename);
a: reader.ReadLine();
a: reader.ReadLine();
<suspend a>
b: reader = new StreamReader(filename);
<suspend b, ga verder met a>
a: reader.blabla <- cursor staat op de verkeerde regel, om het nog maar niet te hebben over de op te zoeken sectie en key?
"Your life is yours alone. Rise up and live it." - Richard Rahl
Rhàshan - Aditu Sunlock
Dat zou wel een beetje tegen het hele static gebeuren ingaan, vind je ook niet?Michali schreef op maandag 13 november 2006 @ 12:11:
Moet je in C# een class instantieren voordat je een static method kan gebruiken?
Hoe zou dit anders ooit werken?
1
2
3
4
5
6
| class MyClass { private MyClass() { /* ... */ } public MyClass Create() { return new MyClass(); } } |
Natuurlijk niet, hoe werken recursieve functies anders goed?Paul Nieuwkamp schreef op maandag 13 november 2006 @ 12:20:
Nee, je hoeft een class niet te instantieren voordat je de static dingen kunt gebruiken.
Ik kan het mis hebben hoor, en dan hoor ik het graag, maar een static method bestaat slechts 1x. Als ik in 2 threads tegelijk ReadINIString aanroep lijkt me dus de ene (verwijzing naar) StreamReader de andere te overschijven etc?
[ Voor 43% gewijzigd door .oisyn op 13-11-2006 12:34 ]
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.
Daar had ik nog niet aan gedacht eigenlijk, aan die recursieve functies..oisyn schreef op maandag 13 november 2006 @ 12:32:
Natuurlijk niet, hoe werken recursieve functies anders goed?Elke functie heeft uiteraard z'n lokale context, en die variabelen bestaan per aanroep van de functie (op de stack). Elke functieaanroep creeert dus z'n eigen StreamReader.
Dan kan ik het dus weer ombouwen naar static functies, scheelt weer een klasse instantieren en is iets duidelijker.
"Your life is yours alone. Rise up and live it." - Richard Rahl
Rhàshan - Aditu Sunlock
1
2
3
4
5
6
7
8
| class Util { public static void DoeIets() { Reader r = new Reader(); r.Read(); } } |
De reader wordt dan gewoon in zijn eigen scope aangemaakt en dat haalt niet uit met multi-threading.
Als je het zo doet gaat het natuurlijk wel fout
1
2
3
4
5
6
7
8
9
10
| class Util { private static Reader r; public static void DoeIets() { r = new Reader(); r.Read(); } } |
In dit geval kunnen meerdere threads tegelijk gebruik proberen te maken van "r" omdat het uit dezelfde context komt
“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”
Enige static class member wordt dan applicationDir, maar die heeft een initialization, geen assignment
[ Voor 4% gewijzigd door Paul op 13-11-2006 13:12 ]
"Your life is yours alone. Rise up and live it." - Richard Rahl
Rhàshan - Aditu Sunlock
Maar dat probleem heb je net zo hard als de methode niet static isMichali schreef op maandag 13 november 2006 @ 16:08:
Het enige wat er zou kunnen gebeuren is dat je bestand gelocked wordt en dat je hem bij de 2de call niet kan lezen. Maar ik denk niet dat hij standaard locked.
“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”
Verwijderd
Dit:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
| // verwijder alles van otherList uit list public void removeAll(MyList otherList) { Object o = new Object(); // fetch een object uit otherList // en sla deze op in een object for (int i = 0; i < otherList.size(); i++) { o = otherList.get(i); // loop het data-array langs voor overeenkomstige objecten for (int j = 0; j < data.length; j++) { // als het object overeenkomt met data[j] if(o.equals(data[j])) { // verwijder het object uit list remove(o); } } } } |
Werd:
1
2
3
4
5
6
7
| public void removeAll(MyList otherList) { for (int i = 0; i < otherList.size(); i++) { remove(otherList.get(i)); } } |
[ Voor 4% gewijzigd door Verwijderd op 23-11-2006 15:26 ]
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.
Verwijderd
Misschien nog even gebruik maken van een Iterator? Een LinkedList implementatie wordt hier niet zo blij van.Verwijderd schreef op donderdag 23 november 2006 @ 15:24:
Java:
1 2 3 4 5 6 7 public void removeAll(MyList otherList) { for (int i = 0; i < otherList.size(); i++) { remove(otherList.get(i)); } }
Verwijderd
Tis overigens geen LinkedList implementatie maar een ArrayList, LinkedList is het volgende hoofdstuk
1
2
3
4
| while (!otherList.IsEmpty) { otherList.Remove(0); } |
"Your life is yours alone. Rise up and live it." - Richard Rahl
Rhàshan - Aditu Sunlock
Verwijderd
hoezo zou een lijst met twee elementen size() == 1 returnen?Ivo schreef op donderdag 23 november 2006 @ 16:47:
Het zou sowieso mis moeten gaan als MyList zich als een normale lijst zou gedragen. Stel je voert de procedure een lijst met twee elementen dan wordt eerst het eerste element verwijderd en vervolgens i met 1 verhoogd. i heeft dan de waarde 1 en otherList.size() ook. De test i < otherList.size() faalt dan en de lijst is niet leeg aan het einde van de aanroep.
voorbeeld, programmeur maakt:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| void iets::watanders() { zowat hBar = m_hMainFrm->GetHandle(); if(hBar.HasObject()) { if(hBar.HasFocus()) { // doe iets } else { // doe iets return; } } else if(m_hMainFrm->HasParent()) { // je snapt het idee, hier kan ook wat gebeuren... } } |
Programmeur 2 krijgt de code, en moet deze uitbreiden... en maakt ervan:
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
| void iets::watanders() { while(true) { zowat hBar = m_hMainFrm->GetHandle(); if(hBar.HasObject()) { if(hBar.HasFocus()) { // doe iets } else { // doe iets break; } } else if(m_hMainFrm->HasParent()) { // je snapt het idee, hier kan ook wat gebeuren... } break; } // uitbreiding functie... } |
Okee, je raad het al... programmeur 3.
Dit komt gewoon voor, als je de returns netjes afvangt met if/else etc. dan hoeft de volgende programmeur niet alles om te coden, of om voor dit soort vieze dingen te kiezen.
Theuno - Da Devil Crew - Een programmeur is iemand die koffie omzet in software...
Nu nog betere koffie...
Ivo schreef op donderdag 23 november 2006 @ 16:47:
Het zou sowieso mis moeten gaan als MyList zich als een normale lijst zou gedragen. Stel je voert de procedure een lijst met twee elementen dan wordt eerst het eerste element verwijderd en vervolgens i met 1 verhoogd. i heeft dan de waarde 1 en otherList.size() ook. De test i < otherList.size() faalt dan en de lijst is niet leeg aan het einde van de aanroep.
Beter kijken, hij laat de originele lijst intactPaul Nieuwkamp schreef op donderdag 23 november 2006 @ 16:53:
Volgens mij verwijdert hij sowieso maar de helft van de items
C#:
1 2 3 4 while (!otherList.IsEmpty) { otherList.Remove(0); }
[ Voor 33% gewijzigd door .oisyn op 23-11-2006 17:05 ]
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.
1
2
3
| public void removeAll(MyList otherList) { otherList.clear(); } |
Vindt ik dit nou als enigste raar, of is 3600sec * 24uur * 30dagen ineens 3650dagen?EdwinG schreef op woensdag 08 november 2006 @ 14:04:
En wat nou als je over 30 jaar verder wilt werken? Geen probleem.
PHP:
1 2 3 4 5 if(!session_id()){ session_start(); } ini_set('session.gc_maxlifetime',3600000*24*30); //lifetime a bit high, irritating otherwise.
Verwijderd
otherList.clear() zou dus de otherList leegmaken wat totaal niet de bedoeling is, sneller leeg ja, gewenst resultaat, nee
Het zijn 3600000 secondes, dus 1.000 uur, dat * 24 * 30 levert 1.000 maanden op.pcmadman schreef op donderdag 23 november 2006 @ 17:25:
[...]
Vindt ik dit nou als enigste raar, of is 3600sec * 24uur * 30dagen ineens 3650dagen?
session.gc_maxlifetime integer
session.gc_maxlifetime specifies the number of seconds after which data will be seen as 'garbage' and cleaned up.
[ Voor 23% gewijzigd door EdwinG op 23-11-2006 17:33 ]
Bezoek eens een willekeurige pagina
Ik vindt returns in functies helemaal niet altijd slecht hoor. Je moet er idd wel erg mee oppassen maar in bijvoorbeeld het volgende voorbeeld is het wel een stuk netter als het alternatief met een grote ifTheuno schreef op donderdag 23 november 2006 @ 17:01:
break, continues en returns halverwege de functie zijn gewoon niet netjes. Ze kunnen misschien prima voldoen, maar onderhoudbaar is het niet meer.
voorbeeld, programmeur maakt:
C++:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 void iets::watanders() { zowat hBar = m_hMainFrm->GetHandle(); if(hBar.HasObject()) { if(hBar.HasFocus()) { // doe iets } else { // doe iets return; } } else if(m_hMainFrm->HasParent()) { // je snapt het idee, hier kan ook wat gebeuren... } }
Programmeur 2 krijgt de code, en moet deze uitbreiden... en maakt ervan:
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 void iets::watanders() { while(true) { zowat hBar = m_hMainFrm->GetHandle(); if(hBar.HasObject()) { if(hBar.HasFocus()) { // doe iets } else { // doe iets break; } } else if(m_hMainFrm->HasParent()) { // je snapt het idee, hier kan ook wat gebeuren... } break; } // uitbreiding functie... }
Okee, je raad het al... programmeur 3.
Dit komt gewoon voor, als je de returns netjes afvangt met if/else etc. dan hoeft de volgende programmeur niet alles om te coden, of om voor dit soort vieze dingen te kiezen.
1
2
3
4
5
6
7
| public void DoSomething() { if( !CheckSomething() ) return; //Hier de rest van je functie } |
“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”
Ik ging er even vanuit dat removeAll (mede door de naam) de clear() _is_EnsconcE schreef op donderdag 23 november 2006 @ 17:11:
Deze gaat toch een stuk sneller:
Java:
1 2 3 public void removeAll(MyList otherList) { otherList.clear(); }
Ik vond het al een rare combinatie van procedureel en OO programmerenVerwijderd schreef op donderdag 23 november 2006 @ 17:27:
De functie removeAll(MyList otherList) verwijdert alleen de elementen die otherList voorkomen uit de originele MyList die, zoals .oisyn al aangaf, gewoon intact blijftt.
otherList.clear() zou dus de otherList leegmaken wat totaal niet de bedoeling is, sneller leeg ja, gewenst resultaat, nee
Ik ben meer Delphi gewend, en daar is om te beginnen de functiedeclaratie (of eigenlijk, daar zou dit de implementatie zijn) een stuk duidelijker. Ook de losse "remove" is redelijk verwarrend
1
2
3
4
5
6
| procedure TMyList.RemoveAll(otherList: TMyList) var i: integer; begin for i := otherList.Size - 1 downto 0 do this.Remove(otherList[i]); end; |
"Your life is yours alone. Rise up and live it." - Richard Rahl
Rhàshan - Aditu Sunlock
Het zal ook niet werken....oisyn schreef op maandag 13 november 2006 @ 12:32:
[...]
Dat zou wel een beetje tegen het hele static gebeuren ingaan, vind je ook niet?
Hoe zou dit anders ooit werken?
C#:
1 2 3 4 5 6 class MyClass { private MyClass() { /* ... */ } public MyClass Create() { return new MyClass(); } }
ASSUME makes an ASS out of U and ME
Ik gok even dat dit de Collection's removeAll is.Paul Nieuwkamp schreef op donderdag 23 november 2006 @ 19:16:
Ik ging er even vanuit dat removeAll (mede door de naam) de clear() _is_
Er zijn 4 bulk operators, die met Sets het beste uitgelegd kunnen worden:
- set1.containsAll(set2) returned of set2 een subset is van set1
- set1.retainAll(set2) zorgt ervoor dat set1 de doorsnede is van set1 en set2
- set1.removeAll(set2) zorgt ervoor dat set1 het verschil is tussen set1 en set2, ook wel set1 - set2
- set1.addAll(set2) zorgt ervoor dat set2 de vereniging is van set1 en set2.
Ik had dat ook niet meteen door dat deze removeAll bedoeld werd, maar deze vier methods kunnen verdomd handig zijn.
More than meets the eye
There is no I in TEAM... but there is ME
system specs
Ik was er al achter dat ik fout zat jaIceManX schreef op donderdag 23 november 2006 @ 20:55:
[...]
Ik gok even dat dit de Collection's removeAll is.
Dat is een typo?- set1.addAll(set2) zorgt ervoor dat set2 de vereniging is van set1 en set2.
Het lijkt me dat al dat soort bulk operators aan set2 niets veranderen, dat je dus in de functiedeclaratie set2 const kunt maken? Anders moet je per functie gaan kijken/onthouden welke set het nu precies aan gaat passen
"Your life is yours alone. Rise up and live it." - Richard Rahl
Rhàshan - Aditu Sunlock
Verwijderd
Als in Java "Object o = new Object();" net zo duur is als TObject.Create in Delphi, kost 't nauwelijks iets, al is 't wel volstrekt overbodig: een paar regels later wordt 'ie toch opnieuw geassigned...
1
2
3
| constructor TObject.Create; begin end; |
JaPaul Nieuwkamp schreef op donderdag 23 november 2006 @ 21:14:
Dat is een typo?
More than meets the eye
There is no I in TEAM... but there is ME
system specs
Waarom niet?
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.
Dit was mijn baksel er voor:
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
| public void Functie() { Random RandomGenerator = new Random(); int BuildingWidth; int BuildingPadding; int Counter = 0; int SizeUsed = 0; Building[] BuildingsTemp = new Building[25]; Boolean MaxBuildingsReached = false; int BuildingSpace = 300; //creating the buildings; Width of a building is 10 - 15; Space between buildings 5-8 while (!MaxBuildingsReached) { BuildingWidth = RandomGenerator.Next(10, 15); BuildingPadding = RandomGenerator.Next(5, 8); if (SizeUsed + BuildingPadding + BuildingWidth > BuildingSpace) MaxBuildingsReached = true; else BuildingsTemp[Counter] = new Building(SizeUsed + BuildingPadding, 2, RandomGenerator.Next(30, 50), BuildingWidth); SizeUsed = SizeUsed + BuildingPadding + BuildingWidth; Counter++; } //Dit is omdat er voor te zorgen dat er geen lege items in de array zitten. //Je maakt een array van 25 met misschien maar 15 items, dit is niet netjes en moet dus even opgelost worden! this.Buildings = new Building[Counter]; for (int I = 0; I < Counter; I++ ) { this.Buildings[I] = BuildingsTemp[I]; } } |
Ernstig fout dus
Overigens vind ik die nietszeggende magic numbers ook erg lelijk. Ik hoop dat je die hebt vervangen door informatieve constanten.
1
2
3
4
5
6
| Queue<String> queue = new Queue<String>(); for(int i=0; i<queue.Count; i++) { String s = queue.Dequeue(); // doe wat met s... } |
(hier zou het ook met een while kunnen idd
[ Voor 10% gewijzigd door user109731 op 24-11-2006 09:50 ]
Ik kan niet in c# programmeren, maar het lijkt me dat de array grootte van te voren niet vast gesteld hoeft te worden?Depress schreef op donderdag 23 november 2006 @ 22:43:
Ik was voor school aan een project je bezig. Nu moest ik een lijst hebben. Maar wist niet hoelang die van te voren is. Dus ik maakt een hele grote array, en maakte toen een nieuwe array van de gewenste grote door de eerste array de gevulde items te tellen.
Dit was mijn baksel er voor:
C#:
1 ...
Ernstig fout dusIk heb toen maar gouw generics gebruikt :-)
Als je je array grootte niet vaststeld, alloceer je ook geen geheugen, en dat gaat dus snel foutEnsconcE schreef op vrijdag 24 november 2006 @ 10:19:
[...]
Ik kan niet in c# programmeren, maar het lijkt me dat de array grootte van te voren niet vast gesteld hoeft te worden?
Ik zie niet in wat generics hier mee te maken hebben.Ernstig fout dusIk heb toen maar gouw generics gebruikt :-)
[ Voor 30% gewijzigd door whoami op 24-11-2006 10:21 ]
https://fgheysels.github.io/
1
2
3
| $var = $_GET['var']; functie($var); |
Het ging om het voorbeeld en generics zijn lijsten die gewoon aangevult kunnen worden. Ik had er net zogoed lijsten neer kunnen zetten.whoami schreef op vrijdag 24 november 2006 @ 10:20:
[...]
Als je je array grootte niet vaststeld, alloceer je ook geen geheugen, en dat gaat dus snel fout
[...]
Ik zie niet in wat generics hier mee te maken hebben.(Je kan het gebruiken, maar is niet noodzakelijk). De oplossing is hier gewoon om een collectie te gebruiken, en als die nu generic is of niet, doet niet ter zake.
Maar om in te gaan @ Hierboven dat arrays zonder lengte gemaakt kunnen worden is onzin. Voor elke variable reserveer je geheugen. Wanneer je dat niet doet is er geen geheugen om naar te schrijven en krijg je errors alla Error at 0x0000 (Delphi), VS vangt dit netjes af en zegt dat je het New statment ergens moet gebruiken met nog enkele andere tips.
De Niets zeggende numbers zijn ook idd weg, leraar vond het wat onduidelijk
@ hieronder dat wist ik niet maar d8 dat ik iets niet helemaal begreep en verkeerd idee had uit bovenstaande post
[ Voor 34% gewijzigd door bat266 op 24-11-2006 11:58 ]
Better to remain silent and be thought a fool then to speak out and remove all doubt.
Daar kun je generics voor gebruiken, maar generics zijn niet beperkt tot alleen gebruik in lijsten.bat266 schreef op vrijdag 24 november 2006 @ 11:54:
generics is toch het principe dat je een generieke lijst specifiek maakt voor een bepaald type ? Of zit ik nu fout
Hoe kom je daar bij? Generics is het principe waarbij je parameteriseerbare classes (en methods) kunt kunt maken, een soort van template classes dus. Dat houdt in dat je pas bij het gebruik van de class een of meer andere classes opgeeft welke binnen die class gebruikt worden. Dit is handig omdat je dan type safe kunt werken, ook als je van te voren het te gebruiken type niet weet. Dat heeft direct helemaal niets met lijsten te maken.Depress schreef op vrijdag 24 november 2006 @ 11:51:
Het ging om het voorbeeld en generics zijn lijsten die gewoon aangevult kunnen worden. Ik had er net zogoed lijsten neer kunnen zetten.
De kracht van generics is niet dat het niet beperkt is tot collections.
Generics zijn dus geen Lijsten. Collections zijn 'lijsten', en Collections en Generics zijn nu ff net even heel iets anders.Het ging om het voorbeeld en generics zijn lijsten die gewoon aangevult kunnen worden. Ik had er net zogoed lijsten neer kunnen zetten.
[ Voor 49% gewijzigd door whoami op 24-11-2006 12:49 ]
https://fgheysels.github.io/
Collections zijn geen 'lijsten'whoami schreef op vrijdag 24 november 2006 @ 12:48:
^^ Wat Michali zegt, en hij zegt ook meteen wat de kracht is van Generics.
De kracht van generics is niet dat het niet beperkt is tot collections.
[...]
Generics zijn dus geen Lijsten. Collections zijn 'lijsten', en Collections en Generics zijn nu ff net even heel iets anders.
“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”
Ach, een verzameling is niet veel meer dan een ongeordende lijst hoor.rwb schreef op vrijdag 24 november 2006 @ 13:31:
[...]
Collections zijn geen 'lijsten'. Collections zijn 'Verzamelingen'
Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info
Ik snap niet hoe je kunt programmeren als je de Nederlandse syntaxis niet eens correct kunt noteren. Programmeersyntaxis is wel wat foutgevoeliger.Depress schreef op donderdag 23 november 2006 @ 22:43:
Ernstig fout dusIk heb toen maar gouw generics gebruikt :-)
Maar even on-topic: Hoe zou je het doen in .NET 1.1?
[ Voor 29% gewijzigd door Mastermind op 25-11-2006 01:39 ]
Certified smart block developer op de agile darkchain stack. PM voor info.
In mijn ogen zijn boomstructuren en grafen geen lijsten, maar wel collecties.Grijze Vos schreef op vrijdag 24 november 2006 @ 13:35:
[...]
Ach, een verzameling is niet veel meer dan een ongeordende lijst hoor.
Een geordende lijst is ook een verzamelingGrijze Vos schreef op vrijdag 24 november 2006 @ 13:35:
[...]
Ach, een verzameling is niet veel meer dan een ongeordende lijst hoor.
“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”
ik zou een arraylist gebruikenMastermind schreef op zaterdag 25 november 2006 @ 01:38:
[...]
Ik snap niet hoe je kunt programmeren als je de Nederlandse syntaxis niet eens correct kunt noteren. Programmeersyntaxis is wel wat foutgevoeliger.
Maar even on-topic: Hoe zou je het doen in .NET 1.1?
1
2
| $string = "test"; echo "$string"; |
Het is sneller om single quotes te gebruiken omdat ie dan geen variabelen parsed... En als je enkel een string gaat echo-en nooit quotes gebruiken.
1
2
3
4
5
6
| $elements = "element1, element2, element3"; $array = explode(",", $elements); $n =count($array); for($i=0; $i < $n; $i++) $array[$i] = trim($array[$i]); |
Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info
1
| $array = array("element1", "element2", "element3"); |
Lijkt mij in het begin van deze code:frickY schreef op zondag 26 november 2006 @ 21:56:
Of
PHP:
1 $array = array("element1", "element2", "element3");
niet overbodig. Het lijkt me zelfs efficienter, of zie ik hier wat over het hoofd?Suepahfly schreef op zondag 26 november 2006 @ 21:06:
PHP:
1 2 3 4 5 6 $elements = "element1, element2, element3"; $array = explode(",", $elements); $n =count($array); for($i=0; $i < $n; $i++) $array[$i] = trim($array[$i]);
Suepahfly, kun je misschien uitleggen wat er mis is met je code?
1
2
3
4
5
6
7
| .... public static void log_error(String error) { System.out.println("Booo!! Fout:" + error); return; //Is dit nodig bij een void? } .... |
Going for adventure, lots of sun and a convertible! | GMT-8
Als laatste statement in een procedure is het wel vrij loos ja
"Your life is yours alone. Rise up and live it." - Richard Rahl
Rhàshan - Aditu Sunlock
Dit snap ik eigelijk niet echt?Paul Nieuwkamp schreef op zondag 26 november 2006 @ 23:09:
...
uit je procedure te springen (bij gebrek aan of ongewenst zijn van exceptions).
...
Going for adventure, lots of sun and a convertible! | GMT-8
Verwijderd
Stel dat je functie een bepaalde input heeft (bijvoorbeeld je error string) en die blijkt niet aan bepaalde eisen te voldoen, dan kan je je de uitvoer van je functie vroegtijdig afbreken ipv tot het einde te wachten:
1
2
3
4
5
6
7
8
9
10
| .... public static void log_error(String error) { if(!goedeString(error)) return; // doe dingen System.out.println("Booo!! Fout:" + error); return; //Is dit nodig bij een void? - hier niet } .... |
1
2
3
4
5
6
7
| //dit is al in de functie try { //iets } catch(SomeError e) { return; } //meer code |
Als het je sommige fatale errors wilt negeren omdat dat niet uitmaakt kun je het gebruiken
Mwoah, als je die input ergens vandaan krijgt kunnen er wellicht ook tabs en newlines in zitten, dan ga ik liever voor de robuustere oplossing met trim erbij.Eskimootje schreef op zondag 26 november 2006 @ 21:54:
Volgens mij kun je gewoon de spatie extra meegeven in de eerste parameter van de explode functie dan hoef je niet nog een keer die te strippen.
Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info
Zoals eerder opgemerkt is meteen een array maken het meest efficienteEnsconcE schreef op zondag 26 november 2006 @ 22:42:
Dit:
[...]
Lijkt mij in het begin van deze code:
[...]
niet overbodig. Het lijkt me zelfs efficienter, of zie ik hier wat over het hoofd?
Suepahfly, kun je misschien uitleggen wat er mis is met je code?
Of
explode (", ", $elements);
Of
str_replace(" ", "", $elements);
Anyway ik kwam dit een keer tegen waar het werd gebruikt om een config var naar een array te zetten. Ik zat nog al te kijken naar de manier waarop de spaties werden verwijderd.
ik moet zeggen dat ik het toch wel eens gebruik... dat eerst van een string een array maken en dan een loop er doorheen (of iets dergelijks)... dit is omdat je een string niet kunt tellen, en als je nu in je database een string hebt met info die gescheiden moet worden... dit kan zijn omdat binnen een record er meerdere van een bepaald iets kunnen zijn, zo niet onbeperkt... in dit geval zou ik bij het uitlezen dan dit gebruiken...EnsconcE schreef op zondag 26 november 2006 @ 22:42:
Dit:
[...]
Lijkt mij in het begin van deze code:
[...]
niet overbodig. Het lijkt me zelfs efficienter, of zie ik hier wat over het hoofd?
Suepahfly, kun je misschien uitleggen wat er mis is met je code?
Ok, maar bij een voorgedefinieerde string kan je dan niet beter dit doen:Tjeemp schreef op maandag 27 november 2006 @ 00:49:
[...]
ik moet zeggen dat ik het toch wel eens gebruik... dat eerst van een string een array maken en dan een loop er doorheen (of iets dergelijks)... dit is omdat je een string niet kunt tellen, en als je nu in je database een string hebt met info die gescheiden moet worden... dit kan zijn omdat binnen een record er meerdere van een bepaald iets kunnen zijn, zo niet onbeperkt... in dit geval zou ik bij het uitlezen dan dit gebruiken...
1
| $array = array(trim("element1"), trim("element2"), trim("element3")); |
Als je iets uit je database moet halen en dat moet je dan nog weer 'exploden' dan denk ik eerder dat er wat mis is met je database ontwerpTjeemp schreef op maandag 27 november 2006 @ 00:49:
[...]
ik moet zeggen dat ik het toch wel eens gebruik... dat eerst van een string een array maken en dan een loop er doorheen (of iets dergelijks)... dit is omdat je een string niet kunt tellen, en als je nu in je database een string hebt met info die gescheiden moet worden... dit kan zijn omdat binnen een record er meerdere van een bepaald iets kunnen zijn, zo niet onbeperkt... in dit geval zou ik bij het uitlezen dan dit gebruiken...
“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”
Dat hoeft helemaal niet. Om peformance te sparen kun je in sommige gevallen best een lijstje met ID's comma separated opslaan in een veld. Niet dat dit vaak voorkomt, maar het kan, als het een bewuste overdachte keuze is, best een goede oplossing zijn.rwb schreef op maandag 27 november 2006 @ 09:49:
[...]
Als je iets uit je database moet halen en dat moet je dan nog weer 'exploden' dan denk ik eerder dat er wat mis is met je database ontwerp
De elementen direct in een array opslaan is natuurlijk de beste methode. Maar ik ga er vanuit dat $elements niet direct zo gevuld wordt. Of je dan een foreach, een for, array_map, preg_split, explode met een spatie, of wat dan ook gebruikt, is niet heel erg van belang. Ik zie het iig niet echt als een voorbeeld van slechte code, in geen enkele van de gevallen.
Een database is er om dubbele data te voorkomen, niet dat je daar aan ontkomt maar je moet dat ten alle tijde voorkomen. Data die je vanuit een database in een database(lees lijst/array) moet stoppen, moet eigenlijk niet vanuit 1 cel komen. Dan ga je tegen het basisprincipe van een database in.Michali schreef op maandag 27 november 2006 @ 10:51:
[...]
Dat hoeft helemaal niet. Om peformance te sparen kun je in sommige gevallen best een lijstje met ID's comma separated opslaan in een veld. Niet dat dit vaak voorkomt, maar het kan, als het een bewuste overdachte keuze is, best een goede oplossing zijn.
De elementen direct in een array opslaan is natuurlijk de beste methode. Maar ik ga er vanuit dat $elements niet direct zo gevuld wordt. Of je dan een foreach, een for, array_map, preg_split, explode met een spatie, of wat dan ook gebruikt, is niet heel erg van belang. Ik zie het iig niet echt als een voorbeeld van slechte code, in geen enkele van de gevallen.
Ironisch genoeg, vond ik je eerste voorbeeld nette code, en bega je met de 'oplossing' een fout. Kijk eens naar de volgende mogelijk waarde:Suepahfly schreef op maandag 27 november 2006 @ 00:38:
[...]
Zoals eerder opgemerkt is meteen een array maken het meest efficiente
Of
explode (", ", $elements);
Of
str_replace(" ", "", $elements);
Anyway ik kwam dit een keer tegen waar het werd gebruikt om een config var naar een array te zetten. Ik zat nog al te kijken naar de manier waarop de spaties werden verwijderd.
1
| $element = "element 1, element2,element 3"; |
Ik vind de oplossing met trim dan nog het netste. Deze is namelijk het gemakkelijkst uit te breiden, en naar mijn idee het duidelijkst.
Daar heb je ook gelijk in. Daarom zeg ik ook dat het niet vaak voorkomt en dat het alleen dient gebruikt te worden als het goed overdacht en een bewuste keuze is. In de meeste gevallen volstaat een associatie tabel beter, ook omdat je dan betere selects kunt doen.EnsconcE schreef op maandag 27 november 2006 @ 10:55:
[...]
Een database is er om dubbele data te voorkomen, niet dat je daar aan ontkomt maar je moet dat ten alle tijde voorkomen. Data die je vanuit een database in een database(lees lijst/array) moet stoppen, moet eigenlijk niet vanuit 1 cel komen. Dan ga je tegen het basisprincipe van een database in.
1
| substr($stringUitDBmetTijdenDatum, 6, 2); |
Aan de andere kant is natuurlijk de vraag, in hoeverre deel je de tijd op in tabellen?
de tijd en datum in ieder geval apart
[ Voor 5% gewijzigd door EnsconcE op 27-11-2006 11:40 ]
Datum = tijd. Of is het na 24 uur opeens geen tijd meer?
Look, runners deal in discomfort. After you get past a certain point, that’s all there really is. There is no finesse here.
kenneth schreef op maandag 27 november 2006 @ 11:46:
[...]
Datum = tijd. Of is het na 24 uur opeens geen tijd meer?
Met uitleg #1 wordt al duidelijk waar de datum niet overgaat, dat noemt men vervolgens de tijd.da·tum (de ~ (m.), data/~s)
1 cijfers of woorden die dag, maand en jaar aangeven => dagtekening
2 dag, tijdstip
@Mithrandir:Hoe laat is het?
De datum is 12:02.
Je hebt gelijk, dat advies had ik idd al eerder gekregen. Vanwege problemen met een eerdere merge heb ik mij nog neit meer begeven op het gladde ijs wat ik complete dbase aanpassing noem. In de toekomst ga ik deze cellen misschien overzetten naar een meer geschikte datatype, op dit moment heb ik het vertrouwen neit en werkt het "prima"
[ Voor 27% gewijzigd door EnsconcE op 27-11-2006 12:05 ]
Dit topic is gesloten.
![]()
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.

Het is hier ook niet het "korte vraagjes" topic. Zie deze post