Meertalig maken van Applicaties

Door sanderev66 op zondag 02 mei 2010 10:34 - Reacties (90)
Categorie: -, Views: 4.674

De dingen die ik je in deze blog uitleg kunnen bereikt worden met verschillende resource bestanden en CultureInfo. Dit hieronder is mijn kijk op zaken, en het werkt gewoon heel goed.

Even iets compleet nieuws op mijn Tweakblog: informatie.
Ik ga jullie nu stapsgewijs uitleggen hoe ik mijn programma's meertalig maak. Hierbij geef ik je stukjes code die ook in het MicroSE Framework voorkomen (ik zal het eenvoudig houden, maar wel bruikbaar) ik schrijf dit alles in C# en werkt op elke versie vanaf .NET 2.0. (Dus geen exclusieve .NET 4.0 trucjes hier) Als je een VB versie wil kan je het proberen zélf te vertalen of door even deze website te kijken: http://www.developerfusion.com/tools/convert/csharp-to-vb/

Oké, voor mijn methode hebben we twee dingen nodig:
1. Een C# klasse, deze noemen we "Languages.cs".
2. Taalbestanden, hier kom ik later op terug.

Start Visual Studio (Express) / #Develop op en maak een class library. Geef deze een interessante naam, zodat je die later makkelijk terug kan vinden. "NaakteDamesLib" mag, maar raad ik wel af :+ anders ga je er nog dingen van verwachten...

Als je dat gedaan hebt, moet je de klasse hernoemen naar "Languages.cs" (Languages is de classname)

C#:
1
2
3
4
public class Languages
{

}


Voeg de volgende usings toe:
using System.IO;
using LngCol = System.Collections.ObjectModel.Collection<string>;

Om te beginnen gaan we een constructor maken. In deze constructor geven we aan in welke map de Applicatie gestart is en in welke map de taalbestanden staan.

C#:
1
public Languages(string appPathstring languagesFolder)

Maak op class-niveau de volgende variabelen aan: _appPath en _languagesFolder, en geef die de waarde: ""; Maak deze variabelen private. Vul de variabelen met de parameters uit de constructor. (zorg ervoor dat AppPath niet op een backslash (\) eindigt)

Nu gaan we controleren of de map met taalbestanden (AppPath\languagesFolder) écht bestaat. Zo niet gooi dan de DirectoryNotFoundException. Als het goed is ziet je constructor er nu zo uit:

C#:
1
2
3
4
5
6
7
8
public Languages(string appPathstring languagesFolder)
{
    //Setting variables.
    _appPath = appPath.EndsWith("\\") ? appPath.Substring(0appPath.LastIndexOf("\\")) : appPath;
    _languagesFolder = languagesFolder;

    if (!Directory.Exists(_appPath + "\\" + languagesFolder)) throw new DirectoryNotFoundException();
}


Maak voor het makkelijk terughalen van de map met taalbestanden de volgende property aan:

C#:
1
2
3
4
5
6
7
public string Folder
{
    get
    {
        return _appPath + "\\" + _languagesFolder;
    }
}


Nu moeten we de map met de taalbestanden gaan doorzoeken op taalbestanden..
Maak de volgende methode aan:

C#:
1
public string[] GetLanguages()

Nu moet je alle taalbestanden in de map returnen. Verzin een extentie die je wil gebruiken (ik gebruik voor dit voorbeeld .lng) en doorzoek de taalmap.

C#:
1
2
3
4
5
6
7
8
9
10
11
public string[] GetLanguages()
{
    //Return all language names
    string[] _tmp = Directory.GetFiles(Folder"*.lng");
    for (int i = 0i <= _tmp.GetUpperBound(0); i++)
    {
        _tmp[i] = _tmp[i].Substring(Folder.Length + 1);
        _tmp[i] = _tmp[i].Substring(0_tmp[i].LastIndexOf(".lng"));
    }
    return _tmp;
}

De GetFiles geeft alle taalbestanden in de map terug, de for-lus haalt de map- en extentie uit de bestandsnamen waardoor alleen de naam van het bestand teruggeven wordt.

Nu gaan we taalbestanden openen, voordat we hier aan toe komen moeten we eerst een class variabel "string _currentFile = "";" maken. Deze stellen we in met een propperty. Ik noem deze "CurrentFile". Met de get return je _currentFile en met de Set controleer je eerst of het bestand bestaat. Als dat zo is koppel je die aan _currentFile.
Maak daaronder alvast plaats voor de LoadFile() methode die we zo gaan maken. Optioneel kan je nu ook een event toevoegen (Noem die LanguageFileChanged) en na LoadFile() aanroepen. CurrentFile ziet er zo uit, ongeveer:

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public string CurrentFile
{
    get
    {
        return _currentFile;
    }
    set
    {
        if (File.Exists(value))
        {
            _currentFile = value;
            //LoadFile();
            if(LanguageFileChanged != null)
                LanguageFileChanged(thisEventArgs.Empty);
        }
    }
}


Nu komen we bij het echte werk, het taalbestand inlezen.
Maak een private methode LoadFile(); en maak de twee Class variabelen:

C#:
1
2
private LngCol _lngKeys;
private LngCol _lngValues;

Initialiseer deze in de Constructor (= new LngCol();)

In LoadFile maak je de collecties weer leeg. (.Clear();) voor wanneer je van taal wisselt. Maak dan een StreamReader die CurrentFile opent en maak een variabel voor een lijn. (string line;) open dan met do { welke je sluit met } while (line != "");

In de do maak je een variabel waarin we de huidige lijn gaan opslitsen (dus string[] current = new string[2];) en lees de volgende regel in uit het bestand (_line = srLanguage.ReadLine();) Hierna open je een try en zet in de catch: line = "";
Nu gaan we in de try detecteren of de regel een commentaar regel is, indien dat het geval is, moet de regel genegeerd worden. Dus (if(line.StartsWith("//")) continue;) Dit doe je ook met inline comments:
C#:
1
if(_line.Contains("//")) _line = _line.Remove(_line.IndexOf("//") - 1);


Nu komt het belangrijkste. We splitsen de regel op en we gebruiken ; als seperator. (CSV standaard)

C#:
1
current = _line.Split(new char[1] { ';' }, 2);

In principe kan je ook ";".ToCharArray() gebruiken, maar ik vind dit netter.

Nu gaan we eerst de sleutels in de _lngKeys collectie zetten. Daarna gaan de waardes in _lngValues.

C#:
1
2
_lngKeys.Add(current[0].ToLower());
_lngValues.Add(current[1]);

Tot slot sluit je na de while(..) de StreamReader. Je moet nu ongeveer dit hebben:

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
private void LoadFile()
{
    _lngKeys.Clear();
    _lngValues.Clear();

    var srLanguage = new StreamReader(CurrentFile);
    string _line;

    do {
        string[] current = new string[2];
        _line = srLanguage.ReadLine();
        try
        {
            if(_line.StartsWith("//")) continue;
            if(_line.Contains("//")) _line = _line.Remove(_line.IndexOf("//") - 1);

            current = _line.Split(new char[1] { ';' }, 2);
            _lngKeys.Add(current[0].ToLower());
            _lngValues.Add(current[1]);

        }
        catch
        {
            _line = "";
        }
    }while (_line != "");

    srLanguage.Close();
}


Voeg nu een simpele methode toe om het taalbestand mbv alleen de taalnaam te openen.

C#:
1
2
3
4
public void FromLanguageName(string name)
{
    CurrentFile = Folder + "\\" + name + ".lng";
}

Vergeet niet LoadFile() in de CurrentFile property in te schakelen!

Nu hebben we alles om het taalbestand in te lezen, nu moeten we het uit deze klasse in onze GUI krijgen. Hiervoor heb ik in het MicroSE Framework vele handige methodes ingebouwd (met o.a. automatisch vervangen) nu doen we het met 2 methodes.. een property en een private functie.


C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public string this[string key]
{
    get
    {
        try
        {
            return getLangString(key);
        }
        catch
        {
            return "%" + key;
        }
    }
}

private string getLangString(string key)
{
    return _lngValues[_lngKeys.IndexOf(key.ToLower())];
}

De getLangString methode haalt de waarde uit _lngValues mbv de index van de key in _lngKeys. Deze wordt door de property teruggeven of %key als de key niet gevonden kan worden.

En dat is alles :+

Ik zal je nog even drie dingen geven:
1. Een taalbestand ziet er ongeveer zo uit:

code:
1
2
3
4
//Taalbestand Nederlands
lanc;NL
file;Bestand
exit;Afsluiten

2. De aanroep in een programma is als volgt:

C#:
1
2
3
4
var lng = new Languages(AppDomain.CurrentDomain.BaseDirectory"Languages");
lng.FromLanguageName("Nederlands");

Button.text = lng["ok"];

Vang het LanguageFileChanged event af om aan je app door te geven dat de taal veranderd.
3. Het voltooide Languages.cs bestand..
http://microse.nl/downloads/bestanden/Languages.7z

That's all!

Volgende: Onderzoekje - Hoeveel geef jij uit aan je muziek? 06-'10 Onderzoekje - Hoeveel geef jij uit aan je muziek?
Volgende: Koninginnedag 2010 04-'10 Koninginnedag 2010

Reacties


Door Tweakers user Denhomer, zondag 02 mei 2010 12:14

Resource files in het .net framework zijn speciaal ontwikkeld om i18n te doen...
Je kan de taal veranderen door de CurrentUICulture te zetten om de culture die je wil, als je dan geen resource files hebt in deze culture, val je terug op de default files.
Voordeel hierbij is natuurlijk dat ook getal en datetime formatters je culture volgen en je dus niet zit met bijvoorbeeld engelse text waar je een komma hebt als decimal separator.
Ik heb hier een sterk gevoel van 'het warm water opnieuw uitvinden'...
Kan je vertellen waarom jou oplossing zoveel beter is dan de oplossing die microsoft standaard voorziet?

Door Tweakers user momania, zondag 02 mei 2010 12:17

Ik kan me niet voorstellen dat .NET geen Locale kent en je de huidige settings daarvan direct kan ophalen via een static method call :?

Voor m'n gevoeld ben je voor zoiets als multi-language ondersteuning (wat elke taal ondertussen standaard heeft) zelf nu het wiel weer aan het uitvinden? :)

Door Tweakers user sanderev66, zondag 02 mei 2010 12:20

Oh er zijn er wel een aantal:
  • Als je CurrentUICulture veranderd moet je je app opnieuw opstarten.
  • Met resource files kan je niet makkelijk een andere taal toevoegen door slechts 1 klein tekstbestandje aan te passen.
  • De standaard resources bieden geen mogelijkheid om makkelijk dingen in de taalteksten aan te passen dmv automatsich vervangen.

Door Tweakers user YopY, zondag 02 mei 2010 12:22

Zit er geen ondersteuning voor meertaligheid in C# dan? Lijkt me zeer sterk.

Ten tweede, mbt je taalbestanden, wat als je een ; in je tekst moet hebben? En wat als je middenin je tekst een variabele wilt plaatsen?

Ten derde, welke character encodings en tekstrichtingen en dergelijke ondersteunt dit? Russisch? Arabisch? Chinees?

* YopY is alleen Java's meertaligheid gewenst met .properties bestanden.

Ik zie (na een snelle zoektocht op Google) dat het redelijk makkelijk moet zijn om met .NET een applicatie meertalig te maken.

overigens,
Dit is allemaal goed en aardig, maar dan zit je met het (niet zo) kleine probleem dat je onmogelijk kan bepalen welke taal de applicatie weergeeft. (Of beter gezegd: heel moeilijk)
lijkt me heeeel onwaarschijnlijk. hiero staat het (bijvoorbeeld) voor UI applicaties, en waarschijnlijk staan er ook wel elders eigenschappen voor het bepalen van de huidige taal.

Tenslotte,
Ik ga nu jullie kleine breintjes verrijken met de kennis van het programmeren. (NOFI ;))
No flame intended is leuk, maar het blijft beledigend, NOFI-knipoog of niet.
Als je CurrentUICulture veranderd moet je je app opnieuw opstarten.
Euh. Hoe vaak (praktisch gezien) zal een gebruiker zijn gekozen taal veranderen, en is het dan praktisch om het wiel opnieuw uit te vinden zodat hij niet opnieuw hoeft op te starten? Lijkt mij overigens ook overbodig - herstarten van je form zou logischer zijn.
Met resource files kan je niet makkelijk een andere taal toevoegen door slechts 1 klein tekstbestandje aan te passen.
Maar wil je dat ook? Een ingebouwde editor, inclusief alle voordelen, lijkt me als vertaler toch handiger dan een tekstbestand aanpassen. Lijkt me ook dat je dynamisch een tekstbestand kunt vertalen naar een language resource bestand.
De standaard resources bieden geen mogelijkheid om makkelijk dingen in de taalteksten aan te passen dmv automatsich vervangen.
Da's dan (waarschijnlijk) wel weer waar. Maar is dat echt de reden om een bestaand en goed uitgewerkt systeem opnieuw uit te vinden?


offtopic:
Ik heb een gevoel dat de comments binnen 10 opmerkingen uit gaan

[Reactie gewijzigd op zondag 02 mei 2010 12:26]


Door Tweakers user Herko_ter_Horst, zondag 02 mei 2010 12:25

Het zal niet voor het eerst zijn, dat Sander het wiel opnieuw uitvindt :)

Ik heb zelf helemaal geen verstand van .Net en de daarvoor beschikbare talen, maar ik had binnen 2 minuten gevonden hoe je de "huidige" taalinstelling van een applicatie/thread kan opvragen (en eventueel wijzigen): Thead.CurrentUICulture. Ik vraag me dus net als de mensen hierboven sterk af, wat dit allemaal toe zou moeten voegen aan de standaardfaciliteiten.

Door Tweakers user Sebazzz, zondag 02 mei 2010 12:25

Ik denk niet dat dat deze hokkie-tokkie oplossing verantwoord ;)
Het voordeel van de Resource file is dat je ze ook strong-typed kan benaderen.
En wat betreft het uitbreiden: Je kan gewoon een extra resource file in een satteliet assembly compileren en bij een geinstalleerde app erbij gooien. En het herstarten na het veranderen van een CurrentCulture of CurrentUICulture lijkt me niet, dat kan je zo veranderen hoor :)

[Reactie gewijzigd op zondag 02 mei 2010 12:27]


Door Tweakers user sanderev66, zondag 02 mei 2010 12:29

YopY schreef op zondag 02 mei 2010 @ 12:22:
Zit er geen ondersteuning voor meertaligheid in C# dan? Lijkt me zeer sterk.
LocaleInfo is er, maar zoals ik al zei moet je dan je app herstarten in een andere localeinfo, ik vind dit niet gebruikersvriendelijk.
Ten tweede, mbt je taalbestanden, wat als je een ; in je tekst moet hebben? En wat als je middenin je tekst een variabele wilt plaatsen?
Hier heb ik AutomatischVervangen methodes voor ontwikkeld. En door de 2 bij de Split zullen ; tekens in de tekst gewoon meegenomen worden.
Ten derde, welke character encodings en tekstrichtingen en dergelijke ondersteunt dit? Russisch? Arabisch? Chinees?
Dit voorbeeld ondersteund de standaard encoding, degene die ik in mn Framework gebouwd heb gebruikt .NETs encoding onderdeel om zo de juiste te kiezen.
flame intended is leuk, maar het blijft beledigend, NOFI-knipoog of niet.
Zulke grapjes zijn dat nou eenmaal. Er wordt verder niks mee bedoeld. Vandaar de NOFI.

Door Tweakers user Herko_ter_Horst, zondag 02 mei 2010 12:32

Als je je app zou moeten herstarten om je LocalInfo of CurrentCulture te wijzigen, hoe doen mutli-lingual websites dat dan, denk je? Die herstarten even de webserver, elke keer als er een bezoeker uit een ander land langskomt?

"NOFI", maar veel van jouw progsels kunnen ofwel naar de DailyWTF, ofwel zorgen voor onnodig veel code, die je allemaal ook nog moet onderhouden.

[Reactie gewijzigd op zondag 02 mei 2010 12:34]


Door Tweakers user BM, zondag 02 mei 2010 12:34

Paar dingetjes vallen me op.

Waarom gebruik je geen DirectoryInfo en FileInfo objecten? Dat is imho duidelijker dan het gebruik van enkel de directorynaam in een string variabele. Dan zou je GetLanguages iets als dit worden:

C#:
1
2
3
4
5
6
7
8
            string Folder = @"C:\bla";
            DirectoryInfo dirInfo = new DirectoryInfo(Folder);
            FileInfo[] fileInfos = dirInfo.GetFiles("*.lng");
            foreach (FileInfo fil in fileInfos)
            {
                string x = fil.Name.Replace(".lng",String.Empty);
                //doe wat je wilt met x
            }


Voor je Folder property zou je Path.Combine kunnen gebruiken, ipv handmatig een string concat te doen. Zal qua snelheid niets uitmaken, maar is (wederom) imho duidelijker.

Verder voelt alsof je toch wel wat .Net features aan het herbouwen bent. Wel leuk dat je dit met ons deelt. Vind het altijd wel leuk om te zien wat andere ontwikkelaars maken.

Vooraaaal doorgaan ;)
[/Barry Stevens]

[Reactie gewijzigd op zondag 02 mei 2010 12:37]


Door Tweakers user sanderev66, zondag 02 mei 2010 12:35

Herko_ter_Horst schreef op zondag 02 mei 2010 @ 12:32:
Als je je app zou moeten herstarten om je LocalInfo of CurrentCulture te wijzigen, hoe doen mutli-lingual websites dat dan, denk je? Die herstarten even de webserver, elke keer als er een bezoeker uit een ander land langskomt?
Mijn website doet dit op een overeenkomstige wijze die ik hierboven beschrijf.
YopY schreef op zondag 02 mei 2010 @ 12:22:
Maar wil je dat ook? Een ingebouwde editor, inclusief alle voordelen, lijkt me als vertaler toch handiger dan een tekstbestand aanpassen. Lijkt me ook dat je dynamisch een tekstbestand kunt vertalen naar een language resource bestand.
Verschil: je wil een programma vertalen, wat heb je nodig: Een duur pakket genaamd Visual Studio óf Kladblok.
BM schreef op zondag 02 mei 2010 @ 12:34:
Paar dingetjes vallen me op.

Waarom gebruik je geen DirectoryInfo en FileInfo objecten? Dat is imho duidelijker dan het gebruik van enkel de directorynaam in een string variabele. Dan zou je GetLanguages iets als dit worden:

code:
1
2
3
4
5
6
7
8
            string Folder = @"C:\bla";
            DirectoryInfo dirInfo = new DirectoryInfo(Folder);
            FileInfo[] fileInfos = dirInfo.GetFiles("*.lng");
            foreach (FileInfo fil in fileInfos)
            {
                string x = fil.Name.Replace(".lng",String.Empty);
                //doe wat je wilt met x
            }


Voor je Folder property zou je Path.Combine kunnen gebruiken, ipv handmatig een string concat te doen. Zal qua snelheid niets uitmaken, maar is (wederom) imho duidelijker.

Verder voelt alsof je toch wel wat .Net features aan het herbouwen bent. Wel leuk dat je dit met ons deelt. Vind het altijd wel leuk om te zien wat andere ontwikkelaars maken.

Vooraaaal doorgaan ;)
[/Barry Stevens]
Het is gebaseerd op een oud voorbeeld, maar je hebt helemaal gelijk ;)

[Reactie gewijzigd op zondag 02 mei 2010 12:36]


Door Tweakers user Sebazzz, zondag 02 mei 2010 12:38

Verschil: je wil een programma vertalen, wat heb je nodig: Een duur pakket genaamd Visual Studio óf Kladblok.
Zeta Resource Editor. Gratis.

Door Tweakers user Herko_ter_Horst, zondag 02 mei 2010 12:41

sanderev66 schreef op zondag 02 mei 2010 @ 12:35:
[...]

Mijn website doet dit op een overeenkomstige wijze die ik hierboven beschrijf.
Dat vroeg ik niet. Jij noemt een aantal zaken die niet zouden kunnen met de standaardfaciliteiten als reden waarom je zelf iets hebt gebouwd. Uit commentaren blijkt, dat wat jij wil, gewoon kan (locale wijzigen zonder opnieuw op te starten, bijvoorbeeld).

Jij bent m.i. een gevaarlijke programmeur: je hebt last van een sterk NIH-syndroom, gekoppeld aan de misplaatste arrogantie dat je het zelf wel even beter kan doen. Voor je hobby-projectjes kan dit gelukkig niet zoveel kwaad, maar ik vraag me af hoeveel geld je je werkgever al gekost hebt met dit soort acties... NOFI, uiteraard.

Door Tweakers user !GN!T!ON, zondag 02 mei 2010 12:45

visual studio express is toch gratis? :S

Door Tweakers user sanderev66, zondag 02 mei 2010 12:55

HA!
HA!

http://www.danielmoth.com/Blog/cultureinfo.aspx
One of the FAQs on the CF newsgroup is regarding changing the Thread.CurrentThread.CurrentCulture. The answer is that it is not supported. Instead, the user must change the language on the device and restart your application for changes to take effect [Not restarting the application is possible by reloading ALL resources but the approach is dirty and is as good as restarting the app anyway, so there is no point going through the hassle to do it - trust me].
IK win.

[Reactie gewijzigd op zondag 02 mei 2010 12:55]


Door Tweakers user Sebazzz, zondag 02 mei 2010 13:00

Yep, representatief, een artikel uit 2004 over het .NET 1.1 framework :')

En daarnaast, er valt hier niets te winnen toch? Of is het een competitie?

[Reactie gewijzigd op zondag 02 mei 2010 13:01]


Door Tweakers user sanderev66, zondag 02 mei 2010 13:04

Hoe oud denk je dat de bovenstaande klasse is? Die stamt uit de tijd dat ik begon met mn geknutsel aan MicroSE Unite en MicroSE Player XP. Toen werkte ik nog met .NET 1.0 en was het geheel in VB. Ik heb nog versie 1.0.7 van de "Talen" klasse hier liggen, dat was de eerste versie die op .NET 1.1 werkte.

Trouwens werkt het óók niet in .NET 2.0
http://social.msdn.micros...ac-4884-9935-0e93b90250b2

Behalve wanneer je al je Resources gaat herladen. Dat is dus hetzelfde als je applicatie herstarten (vind ik) en zeer overbodig.

[Reactie gewijzigd op zondag 02 mei 2010 13:10]


Door Tweakers user Sebazzz, zondag 02 mei 2010 13:16

Die link die je post gaat over het Compact Framework. Dat is behoorlijk gelimiteerder en primitiever dan het .NET desktop framework. Subtiel verschil...
Leesvoer: http://msdn.microsoft.com.../1k15k55d%28VS.80%29.aspx
Behalve wanneer je al je Resources gaat herladen. Dat is dus hetzelfde als je applicatie herstarten (vind ik) en zeer overbodig.
Dat is totaal niet hetzelfde als herstarten. Misschien bij de relatief simpele applicaties die jij maakt, maar herstarten gaat bij complexe applicaties wel om wat meer dan resources herladen.
Ik snap dat je gelijk wil krijgen en dat geef ik je ook, maar je hebt niet altijd gelijk.

[Reactie gewijzigd op zondag 02 mei 2010 13:17]


Door Tweakers user sanderev66, zondag 02 mei 2010 13:20

Methodes die daar genoemd worden werken ook niet in gewoon C# 2.0, heb ik zojuist getest. Als je Thread.CurrentThread.CurrentUICulture = new CultureInfo("nl-NL"); bv doet om een programma in het Nederlands te tonen, gebeurt er in het programma.. helemaal niks.

Door Tweakers user Denhomer, zondag 02 mei 2010 13:20

Waarom ga je issues met het compact framework erbij halen?
In een normale .net omgeving is dit wel degelijk mogelijk.
En hoe kun je nu zeggen dat JIJ wint? Als je al je tijd verspeelt aan het herschrijven van alles wat microsoft je geeft dan kan je toch nooit winnen?
En als je zegt dat je voor je website hetzelfde mechanisme gebruikt vind ik het al helemaal erg, aangezien bij een website je voor elke request de thread culture kan instellen en zo alles dat je uit resource files haalt volgens de ingestelde culture is.

Ik vraag me trouwens af hoe jij met deze oplossing omgaat met het correct weergeven van datums en cijfers?

Ik hoop dat je begrijpt dat iedereen hier je graag wil helpen door je te wijzen op interessante alternatieven.

[Reactie gewijzigd op zondag 02 mei 2010 13:24]


Door Tweakers user Herko_ter_Horst, zondag 02 mei 2010 13:22

Hoe sneu. Je hebt dus liever "gelijk" dan dat je een fatsoenlijke oplossing maakt. En dan met één blogpost van 6 jaar oud over een ander framework komen als bewijs...

Zoals ik al zei: een "gevaarlijke" (want: tijd en geld verspillende) attitude...

Wat hier staat, lijkt mij de standaardoplossing: http://www.dotnetcurry.com/ShowArticle.aspx?ID=174

[Reactie gewijzigd op zondag 02 mei 2010 13:40]


Door Tweakers user sanderev66, zondag 02 mei 2010 13:25

Denhomer schreef op zondag 02 mei 2010 @ 13:20:
Waarom ga je issues met het compact framework erbij halen?
In een normale .net omgeving is dit wel degelijk mogelijk.
En hoe kun je nu zeggen dat JIJ wint? Als je al je tijd verspeelt aan het herschrijven van alles wat microsoft je geeft dan kan je toch nooit winnen?
En als je zegt dat je voor je website hetzelfde mechanisme gebruikt vind ik het al helemaal erg, aangezien bij een website je voor elke request de thread culture kan instellen en zo alles dat je uit resource files volgens de ingestelde culture is.
Dat doe ik ook, alleen werkt php niet met resource files ;) - gelukkig. De browser geeft aan welke taal hij wil hebben en hierop geeft mijn website Nederlands (Standaard) of Engels aan.
Ik vraag me trouwens af hoe jij met deze oplossing omgaat met het correct weergeven van datums en cijfers?
De Culture wordt in het taalbestand opgenomen, en hier wordt deze - ironisch genoeg - omgezet naar een CultureInfo in het programma. De rest is hetzelfde als wanneer je met resources werkt.
Ik hoop dat je begrijpt dat iedereen hier je graag wil helpen door je te wijzen op interessante alternatieven.
Ja, maar zonder mijn alternatief serieus te nemen.
Herko_ter_Horst schreef op zondag 02 mei 2010 @ 13:22:
[...]

Hoe sneu. Je hebt dus liever "gelijk" dan dat je een fatsoenlijke oplossing maakt. En dan met één blogpost van 6 jaar oud over een ander framework komen als bewijs...

Zoals ik al zei: een "gevaarlijke" (want: tijd en geld verspillende) attitude...
Hoe kan het geldverspillend zijn als ik deze code al ruim 5 jaar op de plank heb liggen?

[Reactie gewijzigd op zondag 02 mei 2010 13:31]


Door Tweakers user Ahrnuld, zondag 02 mei 2010 13:33

Meertaligheid is inderdaad wel een beetje een controversieel punt in het .NET framework. Je kunt zelfs excel files genereren voor je vertalers en die vervolgens weer teruglezen dmv. een tooltje van MS, maar bepaalde basisfeatures zoals op een eenvoudige manier je taalbestanden editbaar hebben met kladblok en de taal wijzigen zonder restart lijken inderdaad te ontbreken op de standaard manier.

Sander heeft al lang geleden iets hiervoor gebouwd en werkt hier nog steeds mee. (waarschijnlijk dus in de tijd dat lokalisatie in .NET helemaal niet zo vanzelf sprak als nu, qua documentatie in ieder geval zeker niet). Dat is op zich prima, want: if it ain't broken, don't fix it.

Wat je alleen echt had moeten doen is bovenaan je blogpost even neerzetten wat de officiële manier is, bij voorkeur met een link naar de relevante info op MSDN. Anders draag je namelijk bij aan verwarring bij beginnende developers als zij meertaligheid willen inbouwen in hun gloednieuwe .NET 4.0 applicatie. Dus zet dat er alsjeblieft alsnog even bij.

Dit boek wil ook nog wel eens helpen.

[Reactie gewijzigd op zondag 02 mei 2010 14:16]


Door Tweakers user Herko_ter_Horst, zondag 02 mei 2010 13:36

Zoals ik al zei: voor je eigen projectjes kan het niet zoveel kwaad, maar het kost wel tijd (en in een professionele context dus geld) als je die code moet blijven onderhouden. Op een gegeven moment meegaan met de tijd en een standaardoplossing gebruiken is dan een stuk handiger.

Sowieso zou ik een oplossing van 5 jaar oud nog eens goed bekijken voordat ik zoiets als "les" op internet zou zetten...

Door Tweakers user Sebazzz, zondag 02 mei 2010 13:37

Goed, omdat praten niet helpt, dan maar daden:
http://tools.devdammann.nl/Overige/CultureTest.zip
Wat zei je ook al weer over het niet runtime kunnen veranderen van een taal?

Door Tweakers user mcdronkz, zondag 02 mei 2010 13:37

Dude, je moet alleen dingen aan anderen proberen te leren wanneer:

1) Je in staat bent om stof op een juiste manier over te brengen op een ander (dus geen beledigende 'grapjes')
2) Je het onderwerp tot in de puntjes onder de knie hebt en alle ins en outs weet.

Aan de reacties van anderen te zien, schiet je tekort op beide punten. Ik stel dan ook voor dat je afziet van verdere tijds- en ruimteverspillende blogposts.

Door Tweakers user sanderev66, zondag 02 mei 2010 13:43

Ik heb het ook wel goed bekeken hoor :+ De huidige versie is versie 1.2.7 en heb ik gemaakt met mijn overstap op .NET 4.0. En daarbij heb ik het wel gewoon erg netjes gebouwd, ik kan het uitbreiden als het nodig is, de volledige versie nu is nog net geen 620 regels lang. Wat werkelijk peanuts is vergeleken met een grote applicatie. (Ik zie ze genoeg) Het basisidee blijft hetzelfde, maar ik pas regelmatig dingen aan. Zoals ik met de 2.0 specificatie gedaan heb (nu kan ik een vlag-icoon in het bestand opnemen).

Daarbij onderhoud ik liever iets wat ik met eigen code gemaakt heb dan dat ik met een stuk MS code werk wat na een .NET update misschien wel heel anders kan werken.
Sebazzz schreef op zondag 02 mei 2010 @ 13:37:
Goed, omdat praten niet helpt, dan maar daden:
http://tools.devdammann.nl/Overige/CultureTest.zip
Wat zei je ook al weer over het niet runtime kunnen veranderen van een taal?
Ik zie nog steeds iedere keer dat het hoofdscherm opnieuw geopend moet worden. Gebruikers ervaren dit als een herstart. (Zelf onderzocht voor mn werk) Met mijn oplossing is dat niet nodig

[Reactie gewijzigd op zondag 02 mei 2010 13:45]


Door Tweakers user Sebazzz, zondag 02 mei 2010 13:47

Weet je wat trouwens niet een extra voordeel is bij resource bestanden, je kan cultuurspecifieke afbeeldingen en andere bestanden erin opnemen. Dat zie ik niet gebeuren bij jouw localisatie ;)
Daarbij onderhoud ik liever iets wat ik met eigen code gemaakt heb dan dat ik met een stuk MS code werk wat na een .NET update misschien wel heel anders kan werken.
Dat is juist iets waar Microsoft voor oppast, het hele speerpunt van het .NET framework is backwards compatible zijn!

Door Tweakers user Herko_ter_Horst, zondag 02 mei 2010 13:48

Dat is dus precies de verspillende attitude die ik bedoel.

MS verandert echt niet zomaar van alles en nogwat aan dit soort code, er zijn namelijk naast jou nog een paar miljoen programmeurs van afhankelijk. Bovendien: je kunt sowieso niet zonder die standaard libs. Je gaat toch ook niet je eigen String klasse schrijven omdat Microsoft die wel eens zou kunnen veranderen?

@Sebazz: gebruik jij iets als dit:
code:
1
2
3
4
5
foreach (Control  c in this.Controls)
            {
                ComponentResourceManager resources = new ComponentResourceManager(typeof(Form1));
                resources.ApplyResources(c, c.Name, new CultureInfo(lang));
            }
(gekopieerd van pagina 2 van deze link)
Het lijkt me dat dit geen "restart" gedrag zou moeten opleveren?

[Reactie gewijzigd op zondag 02 mei 2010 13:53]


Door Tweakers user sanderev66, zondag 02 mei 2010 13:56

Ga je daadwerkelijk élke control af om een Resource toe te passen? Echt dat is pas tijdrovend werk. Ik hoor de klanten al roepen "WAT IS DAT TAKKE PROGRAMMA TOCH TRAAG!"

Wat als je programma iets van 500 controls heeft op het hoofdscherm, waarvaan maar 30 met tekst? Als ik 30 controls af wil gaan, ga ik ook 30 controls af. Trouwens is wat jij daar beschrijft ook mogelijk met mijn techniek.

[Reactie gewijzigd op zondag 02 mei 2010 13:58]


Door Tweakers user Herko_ter_Horst, zondag 02 mei 2010 14:03

Tsjongejonge, enig abstractievermogen is jou ook vreemd he? Als je weet welke controls je langs moet, ga je natuurlijk alleen die controls langs (en als volgende improvement ga je ook niet elke keer een nieuwe CultureInfo maken, maar die CultureInfo één keer als standaard instellen via Current(UI)Culture). Maar daar gaat het voorbeeld niet om.

En het gaat er ook niet om wat er met jouw techniek ook kan, het gaat erom dat er een standaardoplossing is waarmee alles kan wat jij wil en waarvoor je dus GEEN EIGEN CODE nodig hebt.

Haal die plaat nou eens voor je kop weg en probeer eens wat te leren...

[Reactie gewijzigd op zondag 02 mei 2010 14:08]


Door Tweakers user Sebazzz, zondag 02 mei 2010 14:05

@Sebazz: gebruik jij iets als dit:

Het lijkt me dat dit geen "restart" gedrag zou moeten opleveren?
Nee, ik verander de UI culture en herlaad het hele form. Maar als ik zoiets doe als jij suggereert krijg je inderdaad dit:
http://tools.devdammann.nl/Overige/CultureTest2.zip
Geen restart gedrag. Maar ik denk dat het restart gedrag wel wenselijk kan zijn.

C#:
1
2
3
4
5
6
private void ReloadResources() {
            foreach (Control c in this.Controls) {
                ComponentResourceManager resources = new ComponentResourceManager(typeof(Form1));
                resources.ApplyResources(cc.NameSystem.Threading.Thread.CurrentThread.CurrentUICulture);
            }
        }
Trouwens is wat jij daar beschrijft ook mogelijk met mijn techniek.
Wat is dan het voordeel van jouw opnieuw uitgevonden wiel?
Wat als je programma iets van 500 controls heeft op het hoofdscherm, waarvaan maar 30 met tekst?
500 controls, ik zie geen programma dat dat heeft. Dat zou dan sowieso een erg traag programma zijn.

[Reactie gewijzigd op zondag 02 mei 2010 14:07]


Door Tweakers user Juicy, zondag 02 mei 2010 14:06

Ik snap inderdaad niet helemaal waarom je niet het standaard resource mechanisme gebruikt, maar daar zal ik me maar verder niet aan branden.
Wat als je programma iets van 500 controls heeft op het hoofdscherm, waarvaan maar 30 met tekst? Als ik 30 controls af wil gaan, ga ik ook 30 controls af. Trouwens is wat jij daar beschrijft ook mogelijk met mijn techniek.
Een programma met 500 controls ?! Dan is er toch echt iets fout met je User Interface ...

Daarnaast:
private string getLangString(string key)
{
return _lngValues[_lngKeys.IndexOf(key.ToLower())];
}
Is een erg rare implementatie om een Dictionary te imiteren.

Door Tweakers user RobIII, zondag 02 mei 2010 14:08

sanderev66 schreef op zondag 02 mei 2010 @ 13:56:
Ga je daadwerkelijk élke control af om een Resource toe te passen? Echt dat is pas tijdrovend werk. Ik hoor de klanten al roepen "WAT IS DAT TAKKE PROGRAMMA TOCH TRAAG!"
Heb je dat getest/gemeten? Op een 486?
sanderev66 schreef op zondag 02 mei 2010 @ 13:56:
Wat als je programma iets van 500 controls heeft op het hoofdscherm
Hmm, daar heb je al een probleem dan, niet je lokalisatie
Dan markeer je die 30 met een tag of leid je je eigen controls af van de standaard controls en itereer je alleen over die 30 :?
sanderev66 schreef op zondag 02 mei 2010 @ 13:56:
Als ik 30 controls af wil gaan, ga ik ook 30 controls af.
Totdat een icoon, een afbeelding of een stuk audio (ik roep maar wat) ook gelokaliseerd moet worden en daar kan jouw NIH klasse dan weer niet tegen op. Je bedoeling is goed; informatie delen en overbrengen op anderen is ook goed. En het is leuk te zien hoe creatief er gedacht wordt over dit soort zaken. Maar, wat eerder gezegd werd, het wiel opnieuw uitvinden is vragen om kritische vragen en als je dan geen heel erg goed antwoord daarop hebt dan ga je. En ik bespeur hier, helaas, toch wel weer een bekende houding van je waar je de kritiek langs je legt zonder mee te (willen) denken.

[Reactie gewijzigd op zondag 02 mei 2010 14:18]


Door Tweakers user sanderev66, zondag 02 mei 2010 14:18

RobIII schreef op zondag 02 mei 2010 @ 14:08:
[...]

Heb je dat getest/gemeten? Op een 486?


[...]

Hmm, daar heb je al een probleem dan, niet je lokalisatie
Ik bedoel gewoon veel meer controls zonder te vertalen tekst dan met.
[...]

Dan markeer je die 30 met een tag of leid je je eigen controls af van de standaard controls en itereer je alleen over die 30 :?
Dan doe je exact hetzelfde als met mijn systeem. Je gaat non-standaard oplossingen kiezen voor iets wat standaard mogelijk is - volgens jullie.
[...]

Totdat een icoon, een afbeelding of een stuk audio (ik roep maar wat) ook gelokaliseerd moet worden en daar kan jouw NIH klasse dan weer niet tegen op. Je bedoeling is goed; informatie delen en overbrengen op anderen is ook goed. En het is leuk te zien hoe creatief er gedacht wordt over dit soort zaken. Maar, wat eerder gezegd werd, het wiel opnieuw uitvinden is vragen om kritische vragen en als je dan geen heel erg goed antwoord daarop hebt dan ga je. En ik bespeur hier, helaas, toch wel weer een bekende houding van je waar je de kritiek langs je legt zonder mee te (willen) denken.
Je kan in principe heel goed een taalnaam.resx bestand er naast zetten. Mijn systeem verbied dat niet. Maar tekst hoort niet in een binair bestand, vind ik.
Oh, en je bent op de hoogte van het feit dat MS al jaren de hungarian notation afraadt? Er zijn "voors" voor hungarian notation, maar dan wel in een heel andere context.
euhm nee.. dat is nieuw voor me.

Door Tweakers user RobIII, zondag 02 mei 2010 14:20

sanderev66 schreef op zondag 02 mei 2010 @ 14:18:
Dan doe je exact hetzelfde als met mijn systeem. Je gaat non-standaard oplossingen kiezen voor iets wat standaard mogelijk is - volgens jullie.
Ik had het over als je dan toch voor een NIH klasse kiest en niet over alle controls heen wil itereren natuurlijk.
sanderev66 schreef op zondag 02 mei 2010 @ 14:18:
Je kan in principe heel goed een taalnaam.resx bestand er naast zetten. Mijn systeem verbied dat niet. Maar tekst hoort niet in een binair bestand, vind ik.
Met een paar regels code schrijf je een eigen resource editor die je zo aan je vertalers kunt verstrekken. (Weer een mooie MicroSE aanvulling? ;) )
sanderev66 schreef op zondag 02 mei 2010 @ 14:18:
euhm nee.. dat is nieuw voor me.
Mja, je naming is ook niet echt "Hungarian", maar dan nog zie ik het nut van die prefixes niet.

[Reactie gewijzigd op zondag 02 mei 2010 14:22]


Door Tweakers user sanderev66, zondag 02 mei 2010 14:23

Ik heb ook even een CultureTest gemaakt, met 100% mijn code.
http://microse.nl/downloads/bestanden/CultureTest.7z
En het werkt net zo goed.

Door Tweakers user Herko_ter_Horst, zondag 02 mei 2010 14:24

Dan doe je exact hetzelfde als met mijn systeem. Je gaat non-standaard oplossingen kiezen voor iets wat standaard mogelijk is - volgens jullie.
Denk nou even na, want je maakt jezelf almaar belachelijker. Het loopen over een paar controls in plaats van alle controls is toch niet te vergelijken met een compleet eigen oplossing voor I18N verzinnen?

De code in het artikel maakt gebruik van de standaardfaciliteiten, in plaats van van een zelfbedacht alternatief. De details van dat loopje zijn verder compleet irrelevant.

En nogmaals: zelfs al had jouw code ALLE (en dan bedoel ik ook echt alle) functionaliteit van de standaardfaciliteiten en werkte het net zo goed en efficient, dan nog was het zonde van de tijd en geld om iets te ontwikkelen wat al bestaat. Zoals jouw code nu is, is het gewoon een slap aftreksel.

[Reactie gewijzigd op zondag 02 mei 2010 14:26]


Door Tweakers user Punkie, zondag 02 mei 2010 14:24

Het warm water opnieuw uitvinden hoeft niet, maar het mag wel. Zelf heb ik ook plezier beleeft aan het zelf schrijven van stringklasses, eigen varianten van de C libs, eigen grafische runtime, ... Daarmee spelen, daarin hacken kan een doel zijn op zich.

NIH is het alleen maar als je het bijna dwangmatig doet. Hij heeft al alternatieven bekeken en heeft aangetoond dat hij daarbij bepaalde problemen had ervaren. Hij heeft ook gedemonstreerd dat een systeem zelf bouwen niet veel werk is en het lijkt mij dat het prima werkt in een eenvoudige context. simpliciteit => efficientie
Me dunkt heeft hij gedaan wat iedere programmeur betracht: gegeven beperkte tijd, risico, kennis en hulpmiddelen een goede oplossing bedenken.

Door Tweakers user sanderev66, zondag 02 mei 2010 14:26

Eindelijk iemand die me snapt :+

Door Tweakers user Sebazzz, zondag 02 mei 2010 14:29

Even een Culturetest met 500+ controls:
http://tools.devdammann.nl/Overige/CultureTest3.zip
Nog best acceptabel. Het zou nog wat geoptimaliseerd kunnen worden door het painten tijdelijk te pauzeren, maar ik vertrouw erop dat ons punt duidelijk is. Geen probleem dus om .resx te gebruiken.
sanderev66 schreef op zondag 02 mei 2010 @ 14:18:
Je kan in principe heel goed een taalnaam.resx bestand er naast zetten. Mijn systeem verbied dat niet. Maar tekst hoort niet in een binair bestand, vind ik.
Dat wordt bij .NET ook niet gedaan. Alles wordt in een binair bestandje gecompileerd. Alleen design time wordt het als base64 in een xml (resx) opgeslagen.

[Reactie gewijzigd op zondag 02 mei 2010 14:30]


Door Tweakers user RobIII, zondag 02 mei 2010 14:29

Punkie schreef op zondag 02 mei 2010 @ 14:24:
Me dunkt heeft hij gedaan wat iedere programmeur betracht: gegeven beperkte tijd, risico, kennis en hulpmiddelen een goede oplossing bedenken.
En het daarna gedeeld op internet waardoor beginnende programmeurs allemaal op 't verkeerde been worden gezet en een verkeerde weg in slaan. Dat is precies heel mijn probleem met het "commentaar" in de PHP manuals; de meuk die je daar aan treft is werkelijk van dusdanig triest niveau dat ik niet snap dat ze het überhaupt laten staan (of niet even modereren vooraf).

Even een linkje naar de "standaard oplossing" met een goed uitgebouwd argument waarom sanderev66 daar niet voor gekozen heeft had die aankomende programmeurs in ieder geval de kans gegeven zelf een afweging te maken. Sanderev zegt op de hoogte te zijn geweest van het "gangbare alternatief" maar zet dat nergens in zijn artikel, evenals argumentatie over waarom hij daarvan afgeweken is. Dat moet uit de comments komen; mooier was geweest als dat meteen in het artikel had gestaan.

[Reactie gewijzigd op maandag 03 mei 2010 00:41]


Door Tweakers user Herko_ter_Horst, zondag 02 mei 2010 14:30

Ik zou dit snappen van een newbie die alles voor het eerst ziet. Maar jij ben "professioneel" programmeur (je verdient er iig je geld me) en je presenteert dit als "les" voor de rest van de wereld. Dan is dit gewoon te triest voor woorden.

@Punkie: hij heeft de alternatieven blijkbaar niet goed genoeg bekeken, want wat hij wil kan al heel lang. Dat het 2004 in het Compact Framework nog niet werkte, doet daar niets aan af. Ik betwijfel of hij het indertijd ook zo goed onderzocht heeft.

Daarnaast geeft hij in zijn hele blogreeks wel degelijk blijk van dwangmatig NIH-syndroom.

[Reactie gewijzigd op zondag 02 mei 2010 14:30]


Door Tweakers user sanderev66, zondag 02 mei 2010 14:30

RobIII schreef op zondag 02 mei 2010 @ 14:20:
[...]

Ik had het over als je dan toch voor een NIH klasse kiest en niet over alle controls heen wil itereren natuurlijk.
Precies, je zoekt een oplossing voor een mogelijk probleem. Dat heb ik ook gedaan, alleen ging mijn oplossing één stapje verder.
[...]

Met een paar regels code schrijf je een eigen resource editor die je zo aan je vertalers kunt verstrekken. (Weer een mooie MicroSE aanvulling? ;) )
Ik heb ooit eens een vertaal progje gemaakt, uiteindelijk vond ik werken met Kladblok gewoon eenvoudiger dus ben ik daar niet mee verder gegaan ;)
[...]

Mja, je naming is ook niet echt "Hungarian", maar dan nog zie ik het nut van die prefixes niet.
Zo heb ik het nou eenmaal geleerd ;)

[Reactie gewijzigd op zondag 02 mei 2010 14:33]


Door Tweakers user Juicy, zondag 02 mei 2010 14:38

RobIII schreef op zondag 02 mei 2010 @ 14:20:
Mja, je naming is ook niet echt "Hungarian", maar dan nog zie ik het nut van die prefixes niet.
Prefixes zijn ideaal om lokaal gedefinieerde variabelen te scheiden van de fields van de class. Daarnaast kun je deze fields dan heel eenvoudig oproepen mbv Intellisense.

Door Tweakers user Sebazzz, zondag 02 mei 2010 14:40

Prefixes zijn ideaal om lokaal gedefinieerde variabelen te scheiden van de fields van de class. Daarnaast kun je deze fields dan heel eenvoudig oproepen mbv Intellisense.
Misschien, maar dat is niet bepaald volgens de .NET coding standaarden hè ;) Je kan beter met zinvolle naamgeving het scheiden.

[Reactie gewijzigd op zondag 02 mei 2010 14:41]


Door Tweakers user Herko_ter_Horst, zondag 02 mei 2010 14:41

Juicy schreef op zondag 02 mei 2010 @ 14:38:
[...]


Prefixes zijn ideaal om lokaal gedefinieerde variabelen te scheiden van de fields van de class. Daarnaast kun je deze fields dan heel eenvoudig oproepen mbv Intellisense.
En ik maar denken dat Visual Studio zo'n geweldige omgeving was, maar kleurcodering van fields zit er niet eens in? (oftewel: ik geloof je niet :))

Door Tweakers user sanderev66, zondag 02 mei 2010 14:43

Mijn leraar programmeren heeft mij daarin 1 hele belangrijke les geleerd:

"zolang je het maar overal zo doet"

Het maakt toch niet zo heel veel uit dat je een prefix gebruikt, toch? Zolang het maar netjes is.

Door Tweakers user Herko_ter_Horst, zondag 02 mei 2010 14:48

Op zich is er niet zoveel op tegen, maar als je het advies van je docent doortrekt, dan snap je waarom je je beter aan de standaard richtlijnen kan houden: dan leest je code ook voor anderen makkelijker.

Door Tweakers user Juicy, zondag 02 mei 2010 14:52

Misschien, maar dat is niet bepaald volgens de .NET coding standaarden hè Je kan beter met zinvolle naamgeving het scheiden.
Bij de MS classes intern wordt de '_' prefix overal gebruikt. Open maar eens een assembly in reflector.
En ik maar denken dat Visual Studio zo'n geweldige omgeving was, maar kleurcodering van fields zit er niet eens in?
Natuurlijk wel. Maar dat helpt nog steeds niet om in een keer alle fields te zien te krijgen. Intypen van de prefix en dan intellisense geeft je het hele lijstje in een keer.

Door Tweakers user Sebazzz, zondag 02 mei 2010 14:54

Bij de MS classes intern wordt de '_' prefix overal gebruikt. Open maar eens een assembly in reflector.
Dat klopt, maar dat zijn de MS classes. Die zijn niet representatief. De .NET framework classes wel (System.*, mscorlib) En daarbij, het verandert niets aan de guidelines.

Door Tweakers user sanderev66, zondag 02 mei 2010 14:55

Het zijn guidelines, het is geen wetboek.

[Reactie gewijzigd op zondag 02 mei 2010 14:55]


Door Tweakers user Sebazzz, zondag 02 mei 2010 15:00

Klopt, maar het getuigt wel van een stuk discipline en respect voor degene die je code moeten lezen of gebruiken als je eraan houdt. warom zo ik moete doe voo me text, julli kunn3 het tog well leze, en in de algemeene vorwaarde staat tog nie dat gode spellin verpligt is

Waarom zou je trouwens threads beschaaft beëindigen, er staat nergens dat je geen Abort() mag callen op een thread. Het wordt afgeraden, maarja, het is geen wet hè :)

[Reactie gewijzigd op zondag 02 mei 2010 15:02]


Door Tweakers user sanderev66, zondag 02 mei 2010 15:01

Net zoals je geen 50 mag rijden in een 30 kilometer zone. O wacht. Regeltjes zijn er om verbroken te worden. Sinds het ontstaan van regels/guidelines/wetten zijn er altijd mensen geweest die zich hiertegen verzetten. Dus dit is echt niets nieuws.

Bij mij krijgen alle fields een "_" prefix. Dat is mijn regel. Dat Bill Gates adviseert dit niet te doen, heeft hij pech. Als hij adviseert dat ik de sloot in moet springen, doe ik dat ook niet. (Fields zijn bij mij altijd private, public fields - oftewel properties - hebben altijd een duidelijke benaming)

[Reactie gewijzigd op zondag 02 mei 2010 15:05]


Door Tweakers user Sebazzz, zondag 02 mei 2010 15:07

Dus, het is dus: Ik verbreek de regels/guidelines/wetten omdat anderen dat altijd hebben kunnen doen of hebben gedaan, en omdat het kan? :F

[Reactie gewijzigd op zondag 02 mei 2010 15:07]


Door Tweakers user sanderev66, zondag 02 mei 2010 15:09

Toch wel heel leuk dat je mijn woorden precies weer zo verdraaid zodat het lijkt dat ik onzin uit. Ik houd me aan de door mijzelf opgezette richtlijnen, ik hoef niet aan Bill Gates te vragen hoe ik mijn variabelen noem.

Door Tweakers user Herko_ter_Horst, zondag 02 mei 2010 15:09

Dude, neem nou eens gewoon wat aan, in plaats van overal maar tegenin te gaan.

Regeltjes zijn er NIET om verbroken te worden, zeker in het programmeren niet. (stijl)Regeltjes zijn er om de leesbaarheid en onderhoudbaarheid van code te verbeteren. Nou is een _ meer of minder niet echt iets om een halszaak van te maken, maar het is in het algemeen wel verstandig je ervan bewust te zijn (wat je blijkbaar niet was).

Niemand zegt dat jij in je eigen code nu alle prefixes weg moet gaan halen. We maken je alleen bewust van het bestaan van het bestaan van die guidelines, zodat je weet waar je het over hebt als je een bepaalde keuze maakt. En zodat je snapt dat anderen die guidelines wel gebruiken, om de hierboven genoemde redenen.

Wat interessant kan zijn, als je code met anderen wilt delen, zoals met collega's, of random lieden op internet...

[Reactie gewijzigd op zondag 02 mei 2010 15:13]


Door Tweakers user sanderev66, zondag 02 mei 2010 15:13

Ik ben me heel goed bewust van de verschillende stylen, alleen de benamingen ken ik anders. EN Hoe kan int _a; slechter leesbaar zijn dan int getalVeldA;? Int A kan niet wat dat is de property, int a kan niet want dat is de variabel voor de constructor. En: this.a = a; vind ik nogal onleesbaar.

[Reactie gewijzigd op zondag 02 mei 2010 15:18]


Door Tweakers user Herko_ter_Horst, zondag 02 mei 2010 15:19

_a is een kutnaam, net als getalVeldA. Gebruik gewoon een naam die goed weergeeft wat het field betekent, binnen de context van de class.

Zoals ik al zei: "Nou is een _ meer of minder niet echt iets om een halszaak van te maken", maar standaarden in het algemeen zijn er om communicatie te vergemakkelijken. Het gaat er niet om of met een underscore beter leesbaar is dan zonder (daar kan je best over twisten), het gaat erom dat het één de standaard is en het ander niet.

Overigens: this.something = something geeft wel het meest duidelijk aan wat er gebeurt (als something een goedgekozen naam is). Dat jij het onleesbaar vindt, komt omdat je het niet gewend bent. Bedenk nu eens wat een ander zou kunnen vinden van _something = something, als die dat niet gewend is. Snap je het nut van die guidelines dan?

[Reactie gewijzigd op zondag 02 mei 2010 15:21]


Door Tweakers user sanderev66, zondag 02 mei 2010 15:20

Richtlijn =/= standaard.


C#:
1
2
3
4
public void sendMessage(string message)
{

}



C#:
1
2
3
4
public void SendMessage(string message)
{

}


Hier hebben we een standaard, bovenste voorbeeld is fout - volgens de standaard, het compiled wel gewoon - In c# beginnen methodes standaard met een hoofdletter. Werk je hier in Java is het andersom. DIT is een standaard en geen richtlijn.

[Reactie gewijzigd op zondag 02 mei 2010 15:23]


Door Tweakers user Herko_ter_Horst, zondag 02 mei 2010 15:22

Vervang standaard door guideline/richtlijn als je wilt: mijn punt blijft precies hetzelfde. En als een richtlijn veel gebruikt wordt, wordt het vanzelf de de-facto standaard.

Sorry, maar de spelling van methodenamen is ook gewoon een richtlijn. Gezemel over de semantiek van 'standaard' vs. 'richtlijn' doet verder niets af aan mijn punt: het gebruik/volgen ervan, helpt de leesbaarheid en onderhoudbaarheid te vergroten.

Hier staan overigens alle guidelines m.b.t. de naamgeving binnen .Net talen: http://msdn.microsoft.com.../xzf533w0%28VS.71%29.aspx

[Reactie gewijzigd op zondag 02 mei 2010 15:32]


Door Tweakers user sanderev66, zondag 02 mei 2010 15:29

Nou ja, we kunnen er eeuwig over discussiëren, we gaan het niet eens worden. Dus laten we het er maar op houden dat iedereen doet wat hem goeddunkt, ok?

Door Tweakers user Sebazzz, zondag 02 mei 2010 15:29

Wat ik nou interessant vind, na al deze discussies bij deze blogpost: Ben je overtuigd?
Met andere woorden, vind je nog steeds dat je eigen methode voor i18n beter is dan dat van .NET? En zie je de waarde van de richtlijnen in?

Door Tweakers user sanderev66, zondag 02 mei 2010 15:33

Ik mijn methode vannochtend in 10 minuten gecodeerd, ben 50 minuten bezig geweest om het op te schrijven - met uitleg en al - en ben 3 uur bezig geweest om er over te discussiëren. Dus ik vind mijn methode al is dat misschien 10 seconde langer duurt het te maken dan "standaard" in het geheel overwoekert is door het gezeik wat ik erop krijg.

Dus ben ik overtuigd dat Standaard beter is? Nee.

[Reactie gewijzigd op zondag 02 mei 2010 15:34]


Door Tweakers user Ahrnuld, zondag 02 mei 2010 15:38

@de meesten hierboven,

Tijdens mijn studie informatica kwam van de dingen die in de posts hierboven als vanzelfsprekend worden beschouwd helemaal niets aan bod. De leraren wisten gewoon echt niets van de praktijk. En uiteindelijk leer je het echte professionele programmeren blijkbaar pas in die praktijk. Of hebben jullie het wel allemaal tijdens de studie geleerd? zoja, dan ben ik best jaloers...

Nu heb ik zelf 't geluk gehad om (lang geleden) direct na mijn studie bij een bedrijf te komen waar mensen zaten die hun werk heel serieus namen. Toen we overgingen op .NET kreeg ik de tijd (en werd ik gestimuleerd!) om me te verdiepen in de MS coding standards, UI guidelines etc.

Of je die dingen beheerst of niet, het zijn vaak geen hoofdzaken maar bijzaken en is het totaal afhankelijk van de omgeving waarin je werkt of je ze nodig hebt. Ik heb voldoende klanten gehad waarbij je achteraf gezien rustig lak kon hebben aan de standaarden. Eenvoudige applicaties, applicaties met een korte levensduur, applicaties die geen onderhoud nodig hebben etc. Waar het natuurlijk om gaat is dat je de klant levert wat de klant wil hebben. Ik ken helaas ook genoeg programmeurs die zich 100% aan de standaarden houden maar niet in staat zijn om te bouwen wat er gebouwd moet worden.

Nu werk ik het liefst samen met programmeurs die goed kunnen (=willen) communiceren, die willen leren en uit zichzelf op een gestructureerde manier werken. Zoals Sander's leraar zegt: "zolang je het maar overal zo doet". Als iemand bijvoorbeeld hungarian notation gebruikt zal ik 'm dan ook snel genoeg vertellen dat zijn/haar code niet klopt met de rest. Ik zou zo iemand echter niet ontslaan of denken dat 'ie achterlijk is. Waarschijnlijk heeft iemand het gewoon nooit gezegd of is het niet nodig geweest.

Ik vind het daarom wel jammer om te zien dat er best wel veel kinderachtige reacties staan. Ook van Sander, maar ja, hoe moet hij anders reageren als mensen zo persoonlijk zijn?

We kunnen toch ook best een discussie hebben over of dit internet-waardig is zonder elkaar te gaan beledigen? We zouden kunnen beginnen met tekstschrijven....ik denk dat er minder boze reacties waren gekomen als je het artikel als volgt had opgebouwd:

1) Verwijs op een goede manier naar wat de officiële manier is

2) Verklaar waarom je voor je eigen manier hebt gekozen, en vooral ook waarom je denkt dat anderen hier wat aan hebben

3) Leg je eigen manier uit

4) Eventueel nog een lijstje pro's/cons t.o.v. de officiële manier, om geen verkeerde verwachtingen te scheppen

5) Geef aan dat je feedback waardeert

Programmeren is nu eenmaal typisch een onderwerp waarbij je artikelen heel secuur geschreven moeten zijn.

[Reactie gewijzigd op zondag 02 mei 2010 15:40]


Door Tweakers user Herko_ter_Horst, zondag 02 mei 2010 15:38

Wat heb je in 10 minuten gemaakt? Dat hele I18N framework van je?

Door Tweakers user Sebazzz, zondag 02 mei 2010 15:40

Dus ik vind mijn methode al is dat misschien 10 seconde langer duurt het te maken dan "standaard" in het geheel overwoekert is door het gezeik wat ik erop krijg.
Dit is dus je probleem, het is geen gezeik maar opbouwende goed beargumenteerde en goed bedoelde kritiek. Niemand hoeft je van je troon af te stoten, maar wel te laten zien waarom iets niet is zoals jij het ziet en hoe het wel is en kan. Jij gaat er tegenin met argumenten die niet waar zijn, waarop dan weer goed bedoelde reacties op komen.
Of hebben jullie het wel allemaal tijdens de studie geleerd? zoja, dan ben ik best jaloers...
Nee, ik ben maar eerstejaars informatica. Alles wat ik tot nu toe heb geleerd is meer reflecteren, kijken naar jezelf en communicatieve vaardigheden, wat eigenlijk heel boeiend is. De rest, alles wat ik weet wat .NET/VS/$insertIetsAndersOverIT is zelfstudie, proberen, lezen, etc.
We kunnen toch ook best een discussie hebben over of dit internet-waardig is zonder elkaar te gaan beledigen?
Ik denk dat de gevoerde discussie behoorlijk internet-waardig is, en zelfs Tweakers waardig. Niemand loopt hier te beledigen. Men loopt hier slechts te argumenteren.

[Reactie gewijzigd op zondag 02 mei 2010 15:45]


Door Tweakers user sanderev66, zondag 02 mei 2010 15:42

Herko_ter_Horst schreef op zondag 02 mei 2010 @ 15:38:
Wat heb je in 10 minuten gemaakt? Dat hele I18N framework van je?
Die klasse die ik in deze blogpost verwerkt heb.
Sebazzz schreef op zondag 02 mei 2010 @ 15:40:
[...]
Dit is dus je probleem, het is geen gezeik maar opbouwende goed beargumenteerde en goed bedoelde kritiek. Niemand hoeft je van je troon af te stoten, maar wel te laten zien waarom iets niet is zoals jij het ziet en hoe het wel is en kan. Jij gaat er tegenin met argumenten die niet waar zijn, waarop dan weer goed bedoelde reacties op komen.
"opbouwende goed beargumenteerde en goed bedoelde kritiek" = gezeik als het 3 uur doorgaat.

Door Tweakers user Herko_ter_Horst, zondag 02 mei 2010 15:46

sanderev66 schreef op zondag 02 mei 2010 @ 15:42:
[...]
Die klasse die ik in deze blogpost verwerkt heb.
Dus het kostte geen 10 seconden extra om te maken, maar 10 seconden + alle tijd die het heeft gekost om het I18N framework te maken. En uiteindelijk heb je qua functionaliteit, betrouwbaarheid en onderhoudbaarheid niets gewonnen t.o.v. de standaardfunctionaliteit.

En dat het 3 uur doorgaat, is omdat jij er op geen enkele manier blijk van geeft dat je iets van het advies aan wilt nemen. Wij blijven dus proberen jouw ononderbouwde argumenten te ontkrachten, zodat je in elk geval snapt dat het ook anders kan. Blijkbaar vergeefs.

[Reactie gewijzigd op zondag 02 mei 2010 15:48]


Door Tweakers user sanderev66, zondag 02 mei 2010 15:51

Mijn "l18N" MicroSE framework heeft helemaal niks met deze klasse te maken. De klasse die hier staat heeft mij 10 minuten gekost. Hetzelfde namaken met Resource files kost mij al een heel stuk meer tijd want dan moet ik eerst gaan uitzoeken hoe die dingen werken.

[Reactie gewijzigd op zondag 02 mei 2010 15:51]


Door Tweakers user Neverwinterx, zondag 02 mei 2010 15:51

Ik heb ook ooit een applicatie gemaakt in Java gemaakt om internationalisatie te leren. In Java heb je de klasse ResourceBundle en daar heb je methodes om de resource van een bepaalde Locale (gelijkaardig met Culture(Info) blijkbaar) op te vragen. Kijkend naar ResourceManager in C# heeft die ook dergelijke methodes zoals GetObject(String,CultureInfo) en GetString(String, CultureInfo).
Kan je het niet oplossen zoals ik destijds heb gedaan: gebruiker duidt een andere taal aan via de GUI, je maakt de bijbehorende CultureInfo hierbij aan, je houdt deze CultureInfo bij en daarmee vraag je dan je Resources op en je herlaadt de GUI. Dan hoef je de app niet te herstarten. Of zijn er nog andere problemen?

En richtlijnen zijn maar richtlijnen. Een hele hoop bedrijven maken hun eigen richtlijnen. Als een andere programmeur bij de applicatie komt zal die wel even moeten wennen, maar dat is ook al. In wezen is er geen verschil, behalve voor de puristen die zonodig moeten whinen.

[Reactie gewijzigd op zondag 02 mei 2010 15:53]


Door Tweakers user Herko_ter_Horst, zondag 02 mei 2010 16:02

@Neverwinterx: het voorbeeld zonder "restart" gedrag is al gegeven.

Over de guidelines is al teveel gezegd. Wat Sander in z'n eigen code doet, moet hij uiteraard helemaal zelf weten. Als hij met anderen wil communiceren over code, is het in mijn optiek handig om je bewust te zijn van de richtlijnen die het meest gebruikt worden. Dat vergemakkelijkt namelijk de communicatie. Als Sander dat niet aan wil nemen: his loss.

Als Sander liever overbodige vervangingen voor standaardfunctionaliteit wil schrijven dan software die iets nieuws toevoegt: his loss.

Als hij die overbodige vervanging presenteert als "les" voor anderen, met verkeerde argumenten waarom het nodig zou zijn, dan kan ie verwachten dat er tegenin gegaan wordt.

[Reactie gewijzigd op zondag 02 mei 2010 16:14]


Door Tweakers user sanderev66, zondag 02 mei 2010 16:15

En als Sander nu geen dingen meer wil uitleggen over hoe hij zijn programma's maakt:
nou niet mijn loss.

Door Tweakers user GOUDSBS, zondag 02 mei 2010 16:42

Het is weer zondag en het is slecht weer buiten. Opent tweakers, leest wat blogs en ziet dat sommige dingen nooit veranderen. Laten we hopen dat het weer wel verandert...

[Reactie gewijzigd op zondag 02 mei 2010 16:46]


Door Tweakers user Mental, zondag 02 mei 2010 17:11

HAHAHAHAHAHAHAHAHAHAHA.
Anyway, je bent wat vergeten in je title:

'- Hoe doen we het niet?'

De code die je aandraagt is echt fail eerste klas, nog eens niet zelf bij elkaar gezet ook aangezien het een directe kopie is van een voorbeeld op internet die zich inderdaad richt op het 2.0 framework en niet op het meest recente framework (waar jij voor progged gezien je trotste blog van een paar weken geleden).
.NET heeft native support voor meertaligheid, dat jij niet snapt hoe het werkt is duidelijk; of bedoelde je wat anders met deze blog?

Ik hoop serieus dat er mensen zijn die je gaan nadoen, voor elke goede programmeur moet er immers ook een slechte zijn die denkt dat ie goed is.

[Reactie gewijzigd op zondag 02 mei 2010 17:12]


Door Tweakers user chrashoverraid, zondag 02 mei 2010 17:29

Kom nou eens op man, zielig gezeik hier altijd.
(Sommige) van jullie komen met feedback en argumenten, sander komt met argumenten terug. Jullie willen beide je gelijk hebben, hou nou toch eens gewoon op.
Sander doet het zo, dus dan moet die dat gewoon doen. Dat sommige dit niet verstandig vinden, mag je hier even vermelden maar ga toch niet de hele tijd zitten zeiken.

Het is in iedergeval duidelijk dat het voor sommige moeilijk is om gewoon te discussiëren.

Door Tweakers user Herko_ter_Horst, zondag 02 mei 2010 17:30

@Mental: Iemand uitlachen en niet met argumenten komen, is een veel grotere fail dan wat dan ook. En als je iemand beschuldigt van plagiaat, moet je wel met de oorspronkelijk bron komen...

[Reactie gewijzigd op zondag 02 mei 2010 17:31]


Door Tweakers user sanderev66, zondag 02 mei 2010 17:36

@Mental: ik heb deze code nu al ruim 5 jaar. Origineel voor .NET 1.0 gemaakt.

[Reactie gewijzigd op zondag 02 mei 2010 17:37]


Door Tweakers user Herko_ter_Horst, zondag 02 mei 2010 17:38

Huh? Je had dit toch vandaag in 10 minuten geschreven?

Door Tweakers user sanderev66, zondag 02 mei 2010 17:42

Herschreven, de originele code zit al een hele tijd in het MicroSE Framework. Dat staat ook gewoon in het item:
Hierbij geef ik je stukjes code die ook in het MicroSE Framework voorkomen (ik zal het eenvoudig houden, maar wel bruikbaar)
Hier de klasse zoals hij in een nu nog bestaand project van de ALLEREERSTE versie van Unite zit :+
http://pastebin.com/yUf7qvwK
Ja, die code is heel oud.

[Reactie gewijzigd op zondag 02 mei 2010 17:46]


Door Tweakers user YopY, zondag 02 mei 2010 19:05

sanderev66 schreef op zondag 02 mei 2010 @ 15:51:
Hetzelfde namaken met Resource files kost mij al een heel stuk meer tijd want dan moet ik eerst gaan uitzoeken hoe die dingen werken.
En nu ben je tijd kwijt met het opnieuw maken van dit. Of, was je tijd kwijt in ieder geval.

Stel dat je een applicatie maakt waar een team van een aantal man mee gaat werken. Wat is dan efficiënter: De bestaande kennis van dat team gebruiken zodat ze gelijk los kunnen met de bestaande standaarden (zowel qua coding als bijvoorbeeld language resource files), of ze eerst leren hoe het geheel werkt (en natuurlijk de daaruit voortvloeiende discussie 'waarom gebruiken we niet de standaard?').

Natuurlijk lijken de applicaties die je privé maakt niet iets dat ooit door meerdere personen aan gewerkt zal worden, maar het is sowieso iets dat je moet onderhouden als je in de grotere projecten gaat werken.

Door Tweakers user Punkie, zondag 02 mei 2010 21:29

Hoewel er heel leerrijke zaken staan in de comments zit er ook een hoop tussen dat je eigenlijk liever niet leest.

Ik blijf bij mijn eerste gedacht "Hmm hiervoor zouden genoeg bestaande faciliteiten moeten zijn maar he, dit ziet er straigth-forward en klein uit. Dus waarschijnlijk genoeg voor 80% van de mensen."

Over code standaarden:
Een goede praktijk die je MOET kennen maar die op tweakers.net door de vocale groep nogal overschat wordt. Uit ervaring: als je met 5 talen(en-we-maken-er-nog-eentje-bij-als-we-het-nodig-vinden), 4 IDE's en 10 mensen werkt dan is geen enkele standaard zonder zwaktes en werkt het aanhangen van een standaard per taal contraproductief voor de leesbaarheid.

Door Tweakers user RobIII, zondag 02 mei 2010 23:47

Punkie schreef op zondag 02 mei 2010 @ 21:29:
Ik blijf bij mijn eerste gedacht "Hmm hiervoor zouden genoeg bestaande faciliteiten moeten zijn maar he, dit ziet er straigth-forward en klein uit. Dus waarschijnlijk genoeg voor 80% van de mensen."
En mijn point in case. Je gaat nu af op een her-uitgevonden wiel wat totaal onnodig is; met de functionaliteit in het .Net framework en de VS IDE (ook de gratis Express editie(s)) heb je 0 regels code nodig (tenzij je at runtime van taal wil switchen wat je hooguit een paar regels kost) en je maakt gewoon gebruik van zaken zoals ze bedoeld zijn; en zoals anderen daar ook bekend mee zijn. Dit ziet er inderdaad straightforward uit (en nogmaals; de bedoeling is goed) maar mensen worden er door op een verkeerd been gezet.

Voor forms: Zet het localizable property op true; selecteer een taal in het Language property veld et voila. Bijkomend voordeel: je kunt voor afwijkende locales ook andere layouts gebruiken of knopjes wat breder/smaller als teksten niet passen etc. Zodoende hebben andere locales geen last van onnodig brede knoppen omdat die verrekte Duitsers overal 18-lettergrepen woorden voor hebben :P

Voor strings die (bijv.) niet op je forms staan: Edit de default resources.resx die in elk project standaard aangemaakt wordt. Geef elke string een naam en een value. En voor een nieuwe locale copy/paste je het bestand met (bijv) een .NL_nl toevoeging et voila. Strings aanpassen (evt. plaatjes/icons en andere zaken uit die resources file) en done. Voor strings waar, zoals sanderev66 aangeeft, zaken "dynamisch" in komen staan (zoals "Hello <gebruikersnaam>, good <timeofday>") gebruik je gewoon string.format met placeholders: Hello {0}, good {1}.

C#:
1
MessageBox.Show(string.format(Properties.Resources.hellostringusernameProperties.Resources.evening));


En daarmee bereik je, zonder (op 't oog/gevoel) "straightforward" classes, precies hetzelfde, maar dan met 0 regels code. En mét alle bijkomende voordelen van dien (Intellisense die je helpt, verschillende formlayouts zoals ik al aangaf, ook compatible met andere resources naast strings, iedereen kent 't, etc.)

En to be clear: Dit is puur ter lering van iedereen die dit leest, ook sanderev66, en niet bedoeld als "gezeik".

[Reactie gewijzigd op maandag 03 mei 2010 00:48]


Door Tweakers user ThaStealth, maandag 03 mei 2010 09:23

Here we go again....

Sander, leer nu eens dat we allemaal hier een redelijk gevoel voor programmeren hebben. Als je dus met een artikel komt om ons iets bij te bregen, zorg dan dat het ook daadwerkelijk iets toevoegd,
Dus niet aan komen zetten met een of andere halfbakken oplossing voor een probleem wat al tig jaren opgelost is, en vervolgens claimen dat het toch maar oude code is. Daar schiet niemand iets mee op.

Ten tweede, je code is nogal crappy geschreven, probeer dit dus echt nietals de oplossing aan te dragen, een paar tips wat je verkeerd doet:
1. Je geeft een exceptie terug op de constructor, dit moet je dus nooit doen, het is gewoon 1 van de grootste bad practices wat je kan doen, het is namelijk mogelijk dat een object wel netjes geconstrueert is door de gebruiker van de code, maar toch NULL is beste wat je kan doen is de opsplitsen
2. FileInfo en DirectoryInfo objecten gebruiken (die waren er al sinds 1.0) ipv zo omslachtig te klooien met strings
3. Waarom gebruik je in hemelsnaam GetUpperBound() ??? .Length en .Count zijn vele male sneller omdat dit speciale calls zijn waarop geen bounds checks op hoeven uitgevoerd te worden (== tijd) Enige verschil is dat je dan < .Length moet doen ipv <= .GetUpperBound()
4. Waarom maak je gebruik van 2 stringlijsten? 1 met keys en 1 met values, je kan veel makkelijker een dictionary gebruiken. Dan houd .NET de paren bij en heb je bijvoorbeeld het volgende issue ook ondervangen:

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
    do {
        string[] current = new string[2];
        _line = "Blaaaat";
        try
        {
            if(_line.StartsWith("//")) continue;
            if(_line.Contains("//")) _line = _line.Remove(_line.IndexOf("//") - 1);

            current = _line.Split(new char[1] { ';' }, 2);
            _lngKeys.Add(current[0].ToLower());
            _lngValues.Add(current[1]);

        }
        catch
        {
            _line = "";
        }
    }while (_line != "");

in _lngKeys zal current[0] (= Blaaaat) toegevoegd worden, maar wat gebeurd er bij de toevoeging aan _lngValues? Een OutOfRangeException! het gevolg is dus dat het inlezen halverwege word afgebroken, en er een halve vertaling is ingelezen.
Bij het uitvoeren van de applicatie zal deze gegarandeerd crashen omdat er verwacht word dat dezelfde index van de key, dezelfde index van de value is. Bij de laatste vertaling is alleen de key aanwezig, maar de value niet....
5. Waarom gebruik je op zo'n lelijke manier gebruik van de catch, je kan ook break; gebruiken, weet je 100% zeker dat er uit de loop gesprongen ord.
6. GEBRUIK GEWOON DE .NET FUNCTIES DIE ER ZIJN, SNELLER, BETER EN HET WERKT!

Door Tweakers user sanderev66, maandag 03 mei 2010 10:39

1. Je hebt gelijk maar in dit geval hoort het wel zo, want anders heb je een object waar je helemaal niks mee kan beginnen. De door jou heilig verklaarde DirectoryInfo klasse doet dat namelijk óók.
2. Tja, het is een mogelijkheid. Ik heb gekozen voor File en Directory. Als het niet had gemogen had MS ze niet in het Framework moeten stoppen...
3. Upperbound is de hoogste index in de waarde, length is het aantal waardes. Zie je het verschil?
4. Het programma kan niet op deze klasse blijven hangen, kijk maar eens naar de this[] property. Als het taalbestand niet goed gevormd is mag het niet ingelezen worden. Punt.
5. Als je naar het VB voorbeeld kijkt zou ik daar "Exit Do" moeten zetten, wat volgens mijn VB-docent "bad practice" is.
6. SNELLER? ECHT MIJN FUNCTIE IS NET ZO SNEL.
BETER? VAST, MAAR GAAT HET DAAR OM?
WERKT? MIJN OPLOSSING WERKT OOK.

[Reactie gewijzigd op maandag 03 mei 2010 10:48]


Door Tweakers user ThaStealth, maandag 03 mei 2010 11:04

1. Ik heb niets heilig verklaard, dan is .NET op dat gebied onjuist
2. Tsja, jouw mogelijkheid heeft een grotere kans op fout gaan. Al eens nagedacht dat die functie voor andere doeleinden bedoeld is?
3. Ik weet heus het verschil wel, dat hoef je me echt niet te vertellen, ik zeg je alleen dat het meer bewerkingen zijn ipv simpel .Count/.Length te gebruiken.
4. Wie zegt iets over hangen? ik zeg iets over crashen
5. VB? je typt overal C#, Het is meestal bad practice om goto te gebruiken ja ;) (en in mindere mate om een return halverwege een methode te doen). Break's om een loop te beeindigen is geen enkel probleem (daar zijn ze juist voor!)
6. Werkt in bepaalde gevallen ja ;) maar heeft ook een hoop gaten...

Voor de rest.....
VB docent :'(

Door Tweakers user sanderev66, maandag 03 mei 2010 11:17

Ik ben nu de Framework versie aan het verbouwen met Path.Combine (en andere verbeteringen), zie ik daar een leuke functie die .NET 4.0 toevoegt: Mogelijkheid om meer dan 2 strings te verbinden :+
http://msdn.microsoft.com...Id=Dev10IDEF1&l=EN-US

[Reactie gewijzigd op maandag 03 mei 2010 11:17]


Door Tweakers user ThaStealth, maandag 03 mei 2010 11:51

Is allang gesupport vanaf .NET 1.0:
http://msdn.microsoft.com...y7a5kt%28v=VS.100%29.aspx

Alleen de overload met 3 & 4 invoerstrings is sinds .NET 4.....

Door Tweakers user sanderev66, maandag 03 mei 2010 12:12

Lees mijn reactie, meer dan 2 parameters is pas vanaf .NET 4 ;) dus dat is met 3, 4 en params[] parameters ;)

[Reactie gewijzigd op maandag 03 mei 2010 12:13]


Door Tweakers user GOUDSBS, maandag 03 mei 2010 12:23

Sander, waarom niet gewoon die oplossing van RobIII gebruiken, nu je toch aan het bouwen bent? Persoonlijk lijkt mij dat mooier, zeker met variabele controls in size.... en zonder code...

Door Tweakers user sanderev66, maandag 03 mei 2010 13:15

Omdat ik dan letterlijk al mijn programma's volledig moet herschrijven en het bied helemaal niks extra's, iig niet iets wat ik nog mis / nodig heb. Indien dat het geval is pas ik mijn code aan zodat ook dat onderdeel aanwezig is.
IK heb gekozen het zo te doen dus doe IK het ook zo. Ik pas 10000x liever ergens een code bestandje aan dan dat ik moet gaan zoeken naar een of ander resource bestand. Ik wil dat het niet nodig is om het programma te hercompilen als ik enkel aanpassingen in de taal maak. En daarbij pas ik de tekst aan op de grootte van de controls, en niet de grote van de controls op de tekst. Het is namelijk de bedoeling dat je controls (buttons) zo veel mogelijk dezelfde grootte maakt. Het staat veel netter als het allemaal 1 strakke lijn is ipv dat button a 100 pixel breed is en button b 400.

En als ik alleen maar MicroSE Controls gebruik kost het me ook geen code, want alle MicroSE Controls kunnen met de MicroSE.MLI klassen praten :+
En voor alle andere objecten heb ik de ILanguagesObject interface :+

[Reactie gewijzigd op maandag 03 mei 2010 13:34]


Reageren is niet meer mogelijk