Fórum Root.cz
Hlavní témata => Vývoj => Téma založeno: bohous 31. 07. 2017, 09:22:27
-
Zdar lidi. Chci se zeptat. Mam 2 ukazky kodu a chci se zeptat, ktera je lepsi:
1.
var connStr = ConfigurationManager.ConnectionStrings["connstr1"].ConnectionString;
if (args.Length == 1)
{
switch (args[0])
{
case "-p":
connStr = ConfigurationManager.ConnectionStrings["connstr2"].ConnectionString;
break;
default:
Console.WriteLine("wrong");
Console.ReadKey();
return;
}
}
2.
string connStr;
switch (args.Length)
{
case 0:
connStr= ConfigurationManager.ConnectionStrings["connStr1"].ConnectionString;
break;
case 1:
switch (args[0])
{
case "-p":
connectionString = ConfigurationManager.ConnectionStrings["connstr2"].ConnectionString;
break;
default:
InvalidArg();
return;
}
break;
default:
InvalidArg();
return;
}
Je jsem delal kod prvni. Nevim kdo, nejspis teamliiidr, to prepsal do tvaru 2.
Co si myslite?
-
Nejspíše dva kandidáti na příspěvek na hovnokod.cz 8).
-
s cim mas konkretne problem debile? umis to zapsat lepe? tak do toho
-
Nelíbí se mi tak úplně ani jeden. Mimochodem není to Length, ale length, takže ta podmínka nebude platit nikdy(pokud to není nějaká custom vlastnost). Druhá varianta je možná o něco lepší v případě, že se očekává rozšiřování o další parametry. Ale to je čistě "tahání za slovíčka", přepsat to z ifu na switch nebo obráceně je myslím ten nejmenší problém a osobně bych to asi řešil, až se tam opravdu budou přidávat parametry. Ale z kousku kódu těžko soudit... Každopádně v návrhu aplikace jsou vždycky podstatnější věci k řešení, než ify a switche...
-
podstata je, ze jde o konzolovou aplikaci, ktera kdyz ma prepinac -p, tak se pouzije nejakej connection string. kdyz se nezada prepinac, tak je pouzitej nejakej default connection string. Ja mam default connectionstring jeste pred podminkou. jine prepinace tam nebudou.
-
Druhej je lepší, teda kromě toho, že má nějaký rozprasený formátování, protože řeší i zadání více argumentů, což je v tomto případě evidentně chyba.
Vzít výchozí hodnotu a vzápětí ji podmíněně změnit mi taky nepřijde úplně hezký - v tomto případě úplně zbytečný a matoucí.
Nicméně bych tak nějak očekával, že parsování argumentů budou mít vývojáři vychytanější a ne že jej budou řešit takhle jednoúčelově.
-
ten 2. je o fous lepsi, protoze je to konzistentenjsi... nicmene je to jedno, protoze je to humus tak jako tak. Pro zpracovani parametru prikazove radky existuje 1000+1 knihoven, neni duvod to psat znovu.
-
Přepsal ti to, protože to máš blbě. Co asi tak ta první varianta udělá, když tu aplikaci zavolám jako?
program -p server -foo
Mimochodem psát si parsování command line je klasický not in house syndrom.
-
1000+1 knihoven, neni duvod to psat znovu.
mam dotahnout kanon na vrabce? jde o jednoucelovou aplikaci, neni duvod resit parsovani parametru jeste pomoci knihovny. Proc bych to proboha delal? Nevim jak to delate vy, asi naprogramujete i to, co se od vas nevyzaduje. vic parametru neni potreba resit. je jenom jeden parametr.
-
mam dotahnout kanon na vrabce? jde o jednoucelovou aplikaci, neni duvod resit parsovani parametru jeste pomoci knihovny. Proc bych to proboha delal? Nevim jak to delate vy, asi naprogramujete i to, co se od vas nevyzaduje. vic parametru neni potreba resit. je jenom jeden parametr.
Protože ta knihovna bude narozdíl od tvého řešení odladěná a bez chyb. Víc parametrů bude potřeba řešit hned v další iteraci, věř tomu. S knihovnou to navíc budeš mít hotové rychleji. Člověk, který to po tobě převezme, tě nebude proklínat, protože pracovat se známou knihovnou je mnohem jednodušší, než se hrabat ve tvém prasokódu.
-
1000+1 knihoven, neni duvod to psat znovu.
mam dotahnout kanon na vrabce? jde o jednoucelovou aplikaci, neni duvod resit parsovani parametru jeste pomoci knihovny. Proc bych to proboha delal? Nevim jak to delate vy, asi naprogramujete i to, co se od vas nevyzaduje. vic parametru neni potreba resit. je jenom jeden parametr.
A kolik parametrů bude potřeba za 3 roky?
-
mam dotahnout kanon na vrabce? jde o jednoucelovou aplikaci, neni duvod resit parsovani parametru jeste pomoci knihovny. Proc bych to proboha delal? Nevim jak to delate vy, asi naprogramujete i to, co se od vas nevyzaduje. vic parametru neni potreba resit. je jenom jeden parametr.
Kanón na vrabce bych nebral, ale vzhledem k tomu, že jsi to na těch 14 řádcích dokázal zprasit, možná by nějaké vyladěné univerzální řešení bylo lepší a ušetřilo by ti starosti.
-
To jako vazne??? Ta aplikace se dal rozsirovat nebude, i ted nema poradne zadnej vyznam. Kdyz si dotahnu na vsechno knihovnu, tak jednoducha aplikace bude mit ne 500kb, ale 5mb nebo vic. A kdyz neni potreba osetrovat vic parametru, co je 100% jisty, tak snad nebudu nad tim uvazovat
-
Novej, ani jeden. Protoze ta aplikace se mozna pouzije ani ne 5x.
-
mam dotahnout kanon na vrabce? jde o jednoucelovou aplikaci, neni duvod resit parsovani parametru jeste pomoci knihovny. Proc bych to proboha delal? Nevim jak to delate vy, asi naprogramujete i to, co se od vas nevyzaduje. vic parametru neni potreba resit. je jenom jeden parametr.
Kanón na vrabce bych nebral, ale vzhledem k tomu, že jsi to na těch 14 řádcích dokázal zprasit, možná by nějaké vyladěné univerzální řešení bylo lepší a ušetřilo by ti starosti.
Zprasit? Proc myslis? Mel jsme pouzit knihovnu? Ne, neni to zapotrebi. Nemel jsem jeste udelat to vic OOP jak je zvykem se na rootu bavit o OOP?
-
podstata je, ze jde o konzolovou aplikaci, ktera kdyz ma prepinac -p, tak se pouzije nejakej connection string. kdyz se nezada prepinac, tak je pouzitej nejakej default connection string.
Zde jsi popsal pravidla pro nastaveni connection stringu. Zatímco tvůj kód:
Ja mam default connectionstring jeste pred podminkou.
Takže tvůj algoritmus je jiný. Při čtení kódu si musím pamatovat, že na začátku už je nastavený default, takže princip je opačný, než jsi to sám vyjádřil vlastními slovy.
Osobně bych to dal do funkce třeba determineConnectionString() a při zjištění connection stringu bych jej rovnou vracel returnem. Ale někdo má rád v metodě jenom jeden return, proč ne.
jine prepinace tam nebudou.
Tipnul bych si, že časem budou. Je to tak snad vždycky.
Jenom pár drobností mimo dotaz:
* Váš systém na správu zdrojáků nepodporuje blame, kde bys rovnou viděl, kdo změnil příslušný kód?
* Pokud je connstr1 klíč k defaultnímu a connstr2 klíč k nějakému speciálnímu connection stringu, proč se klíče nejmenují rovnou "defaultconnstr" a třeba "customconnstr"? Čísla 1 a 2 nemají žádný význam, narozdíl od konkrétního názvu. Zdá se to jako blbost, ale správné významové pojmenování je úplně zásadní a ušetří spoustu chyb.
-
Zprasit? Proc myslis? Mel jsme pouzit knihovnu? Ne, neni to zapotrebi. Nemel jsem jeste udelat to vic OOP jak je zvykem se na rootu bavit o OOP?
Podívej, to tvoje řešení je úplně blbě, to neokecáš. Když zadáš nějaký parametr navíc, tak se -p tiše ignoruje a použije se default. Proto ti to teamleader přepsal. Kdybys použil knihovnu, je menší pravděpodobnost, že to dokážeš takhle doprasit. Trochu sebereflexe by neškodilo.
-
Tak nad tím neuvažuj vůbec a dej tam
string connStr;
if (args.length == 1 && args[0] == "-p")
{
connStr = ConfigurationManager.ConnectionStrings["connstr2"].ConnectionString;
} else {
connStr = ConfigurationManager.ConnectionStrings["connstr1"].ConnectionString;
}
Máš to kratší a ještě víc jednoúčelový.
-
Zprasit? Proc myslis? Mel jsme pouzit knihovnu? Ne, neni to zapotrebi. Nemel jsem jeste udelat to vic OOP jak je zvykem se na rootu bavit o OOP?
Ne, není to o knihovně, je to o tom, že ignoruješ chyby zadání parametrů a to se ti jednoho krásnýho dne vymstí. Není to o téhle jedné aplikaci, které se použije 5x a z toho 3x při jejím testování, je to obecný problém, na který dojedeš. Opravil ti to správně, i když to není žádná krása, aspoň to funguje.
-
no jo mate pravdu. jenomze osobne resit knihovnu mi tady neprijde vhodny. aplikace je urcena jenom jednoucelove, export dat z db do souboru, coz se dalo udelat i pomoci sql a bcp utilitky. ne to nemuzu, mi bylo receno, protoze xp_cmdshell neni povolen. tak jsem spravil tuhle appku.
-
Novej, ani jeden. Protoze ta aplikace se mozna pouzije ani ne 5x.
Pak ale nemá smysl zabývat se optimalitou nebo krásou kódu a použití knihovny je na místě, jak bude výsledek velký je v tomto případě jedno, protože se použije jen 5x a naprogramované to bude rychleji. Přitom se ještě tu knihovnu naučíte, což v budoucnosti jistě zvýší vaši produktivitu.
To, že nemáte standardy na psaní CLI je chyba, ale ne vaše.
Jinak podobné skripty se aplikací pomocí copy&paste šíří jako mor.
-
kdyz najdu knihovnu, vyzkousim ji, tak rychleji je to takle jak to mam naspany.
-
Tak nad tím neuvažuj vůbec a dej tam
string connStr;
if (args.length == 1 && args[0] == "-p")
{
connStr = ConfigurationManager.ConnectionStrings["connstr2"].ConnectionString;
} else {
connStr = ConfigurationManager.ConnectionStrings["connstr1"].ConnectionString;
}
Máš to kratší a ještě víc jednoúčelový.
A úplně neprůstřelné a připravené k rozšíření:
for(var i in args) {
if (args[i] == '-p')
connStr = ConfigurationManager.ConnectionStrings["connstr2"].ConnectionString;
else
connStr = ConfigurationManager.ConnectionStrings["connstr1"].ConnectionString;
}
-
kdyz najdu knihovnu, vyzkousim ji, tak rychleji je to takle jak to mam naspany.
Tak si do toho započítej čas teamleadera, který to musel zbytečně studovat a fixovat. Ve výsledku to bez knihovny není rychlejší.
-
A úplně neprůstřelné a připravené k rozšíření:
for(var i in args) {
if (args[i] == '-p')
connStr = ConfigurationManager.ConnectionStrings["connstr2"].ConnectionString;
else
connStr = ConfigurationManager.ConnectionStrings["connstr1"].ConnectionString;
}
a chybu tam máme oba, do toho ifu patří args[0].equals("-p")
-
kdyz najdu knihovnu, vyzkousim ji, tak rychleji je to takle jak to mam naspany.
Proč se vlastně tady ptáš, když žádná odpověď Ti není dost dobrá. Každé začátky jsou těžké a trocha pokory by chlapče neškodila.
-
zacatky? rofl. ja uz delam nekolik let vyvojare a za ne-maly penize. 8)
-
zacatky? rofl. ja uz delam nekolik let vyvojare a za ne-maly penize. 8)
Pak se Ti hluboce omlouvám, z toho kódu to nebylo poznat.
-
to byl jenom test, kde se ukazalo, jaki kokoti existuji na rootu. se divim, ze jeste nikdo nerekl, nech to udelam v lispu a ze to neni OOP
-
to byl jenom test, kde se ukazalo, jaki kokoti existuji na rootu. se divim, ze jeste nikdo nerekl, nech to udelam v lispu a ze to neni OOP
Tak sem nechoď a bude tu o kokota méně.
-
je vas tu dost.
-
Bože, „Já nejsem blbec, já vás jen tak zkouším“ je snad ještě profláklejší výmluva než „pes mi snědl domácí úkol“
Přestaň už, ztrapňuješ se čím dál tím víc.
-
Tak to prosím předělej do LISPu a objektově, ať se nenudíš, ju?
-
...
A úplně neprůstřelné a připravené k rozšíření:
for(var i in args) {
if (args[i] == '-p')
connStr = ConfigurationManager.ConnectionStrings["connstr2"].ConnectionString;
else
connStr = ConfigurationManager.ConnectionStrings["connstr1"].ConnectionString;
}
Nepriestrelné? Naozaj?
Aký bude výsledný connStr pri tomto volaní:
program -p -o debug
-
Nepriestrelné? Naozaj?
Aký bude výsledný connStr pri tomto volaní:
program -p -o debug
A ty nevíš, že -p musí být poslední parametr neprůstřelného řešení, abys ho neprostřelil? To je snad logický... -p, neboli --poslední_parametr
-
...
A úplně neprůstřelné a připravené k rozšíření:
for(var i in args) {
if (args[i] == '-p')
connStr = ConfigurationManager.ConnectionStrings["connstr2"].ConnectionString;
else
connStr = ConfigurationManager.ConnectionStrings["connstr1"].ConnectionString;
}
Nepriestrelné? Naozaj?
Aký bude výsledný connStr pri tomto volaní:
program -p -o debug
Ano máte pravdu, ještě je tam třeba přidat pravidlo:
var connStr = null;
for(var i in args) {
if (args[i] == '-p')
connStr = ConfigurationManager.ConnectionStrings["connstr2"].ConnectionString;
}
if (connStr == null)
connStr = ConfigurationManager.ConnectionStrings["connstr1"].ConnectionString;
-
Ani jeden, ako pisali iny treba kniznicu na parsovanie.
Ale . . ..
Ano treba pouzit kniznicu.
Druhy sa lahsie cita, ale ano treba pouzit kniznicu.
Napr. https://wiki.apache.org/commons/CLI/dotnet, alebo co sa paci, je politika vo firme, ....
-
Nikdy nepouzivaj third party kniznice na taketo trivialne KOKOTINY. To snad uz medzi nami nie su ziadni programatori, iba lepici? Vsak kazda kniznica ti len nabobtna aplikaciu a zvysuje riziko zanesenia chyby.
var connectionString = ConfigurationManager.ConnectionStrings[new HashSet(args).Contains("-p") ? "connstr2" : "connstr1"].ConnectionString;
-
vzdyt to rikam. jenom tady na rootu ti budou kokoti rikat, ze je lepsi knihovna. a v jinym vlakne budou neco rikat o lopatach a lepicich kodu. proste schizofrenie.
To není schizofrenie. Programátor si to napíše sám rychleji, než vůbec najde tu správnou knihovnu a bude mu to fungovat. Opičák/lepič kódu (ano, mluvím o tobě - to co jsi nám předvedl dokonale odpovídá) by raději měl použít knihovnu, aby nenadělal svým myšlením víc škody, než užitku.
-
Nikdy nepouzivaj third party kniznice na taketo trivialne KOKOTINY. To snad uz medzi nami nie su ziadni programatori, iba lepici? Vsak kazda kniznica ti len nabobtna aplikaciu a zvysuje riziko zanesenia chyby.
var connectionString = ConfigurationManager.ConnectionStrings[new HashSet(args).Contains("-p") ? "connstr2" : "connstr1"].ConnectionString;
A to je pěkné.
-
ted jsi jenom obycejnej lepic webuuu.
-
A jsme doma... takže žádnej teamliiidr, ale učitel ti dal špatnou známku... a oprávněně :D Tak ve škole vyřiď, že by jsi potřeboval ještě trojku z chování, ju?
-
jo a proto me plati 100 000kc mesicne, ty lopato ;)
-
Bohus - precital som si Vase prispevky a myslim ze som Vas celkom pekne identifikoval.
Takze zajtra rano o 9:30 v mojej kancelarii a pohovorime si o tom ako sa prezentujete + celu nasu firmu.
Popravde problem s Vami mame uz nieaky ten piatok a Vas prejav ako aj dosiahnute vysledky nebudeme uz dalej tolerovat. Uz nam je jasne preco menite zamestnanie kazdych 6 mesiacov. Nemyslim si ,ze to bude preto ,ze tak isto ako aj vo vasom byvalom zamestani su vasi kolegovia "kokoti".
Ostatnym sa ospravedlnujem za slovnik naseho "ex-zamestnanca"
S pozdravom TeamLeader
-
Jsem myslel že děti teď mají ve škole prázdniny, hehe ;D.
Ten kód opravený teamleaderm je vlastně v pořádku, bavíme-li se o korporátu. Důležité je že to funguje správně, řeší to problém zákazníka, a navíc jak každý správný projekťák potvrdí: Pokud je hovínko v krabičce, tak nesmrdí!
.
Jestlipak víte, ve které firmě vznikl výše ^^^ uvedený citát? Napovím že mají na svědomí Yui framework... :D.
-
Nikdy nepouzivaj third party kniznice na taketo trivialne KOKOTINY. To snad uz medzi nami nie su ziadni programatori, iba lepici? Vsak kazda kniznica ti len nabobtna aplikaciu a zvysuje riziko zanesenia chyby.
var connectionString = ConfigurationManager.ConnectionStrings[new HashSet(args).Contains("-p") ? "connstr2" : "connstr1"].ConnectionString;
Dobra komedie to tu cist.
Tvuj exampl je prvni normalni a pro jednoucelovou utilitku OK.
Pro program, ktery ma byt dlohodobe udrzovany ale rozhodne nejakou java getopt() variantu.
Do pom.xml pridat dependenci na JCommander a do main class par atributu s @Parameter anotaci.
Tady je exampl z http://jcommander.org/
class Main {
@Parameter(names={"--length", "-l"})
int length;
@Parameter(names={"--pattern", "-p"})
int pattern;
public static void main(String ... argv) {
Main main = new Main();
JCommander.newBuilder()
.addObject(main)
.build()
.parse(argv);
main.run();
}
public void run() {
System.out.printf("%d %d", length, pattern);
}
}
Tohle je reseni nas zoufalych lepicu, nadherne citelny kod rizeny pouze anotacemi.
Este ze na rootu je tolik expertu, clovek zasne a skvele se bavi.
-
Nikdy nepouzivaj third party kniznice na taketo trivialne KOKOTINY. To snad uz medzi nami nie su ziadni programatori, iba lepici? Vsak kazda kniznica ti len nabobtna aplikaciu a zvysuje riziko zanesenia chyby.
var connectionString = ConfigurationManager.ConnectionStrings[new HashSet(args).Contains("-p") ? "connstr2" : "connstr1"].ConnectionString;
Dobra komedie to tu cist.
Ano.
Tvuj exampl je prvni normalni a pro jednoucelovou utilitku OK.
Tak se zkuste oba zamyslet, co to udělá (a co by to mělo udělat), když to spustím jako:
program -p foo -p bar
Pro program, ktery ma byt dlohodobe udrzovany ale rozhodne nejakou java getopt() variantu.
To není Java, ale C# ;)
-
ja to rikal, zadna knihovna, proc pak. tady mrdnici budou doporucovat knihovna, my god!
-
Zdar lidi. Chci se zeptat. Mam 2 ukazky kodu a chci se zeptat, ktera je lepsi:
Je jsem delal kod prvni. Nevim kdo, nejspis teamliiidr, to prepsal do tvaru 2.
Co si myslite?
V tom prvním je logická chyba. Do stringu uložíš nějakou hodnotu a pokud je zadán parametr "-p", přepíšeš ji jinou hodnotou. Pokud je connStr immutable, nebude to fungovat. Druhé řešení je tedy lepší, i když by se dalo zjednodušit a hlavně zpřehlednit nebo alespoň přeformárovat zdroják.
-
jiste ze string je immutable, to je logicke.
-
A jsme doma... takže žádnej teamliiidr, ale učitel ti dal špatnou známku... a oprávněně :D Tak ve škole vyřiď, že by jsi potřeboval ještě trojku z chování, ju?
Ale no tak, retardovaným dětem bychom se neměli posmívat ;)
-
jiste ze string je immutable, to je logicke.
Když je immutable, tak proč se ho snažíš přepsat? Zbytečně generuješ žrádlo pro GC.
-
ja som len taky amater ale nemala by sa urobit aj nejaka kontrola s regexp na ten zadany connectionStr?
-
jiste ze string je immutable, to je logicke.
Když je immutable, tak proč se ho snažíš přepsat? Zbytečně generuješ žrádlo pro GC.
no jo vidis to! diky
-
ja som len taky amater ale nemala by sa urobit aj nejaka kontrola s regexp na ten zadany connectionStr?
To má přece na starosti
ConfigurationManager.ConnectionStrings["connstr1"].ConnectionString
-
ja som len taky amater ale nemala by sa urobit aj nejaka kontrola s regexp na ten zadany connectionStr?
To má přece na starosti
ConfigurationManager.ConnectionStrings["connstr1"].ConnectionString
nerozumiem, kde je tam regexp?
-
skoda ze se na skolach neuci lepe o Leninovy, ktery rikaval: "Ucit se, ucit se, ucit se." Teraz tady mame lopaty, opice a nevzdelance. Prohnitej zapad!!! Reknu Vam, pred 89 to byly casy. Programovani bylo o necem jinym jako ted.
-
ConfigurationManager.ConnectionStrings["connstr1"].ConnectionString
nerozumiem, kde je tam regexp?
Ne, je tam getter.
Ten řádek je sice šílenost, kterou bych takhle určitě nenapsal, ale fukční to zřejmě bude.
-
ja som len taky amater ale nemala by sa urobit aj nejaka kontrola s regexp na ten zadany connectionStr?
... ne - tady uz je na vsechny kontroly pozde ...
-
ConfigurationManager.ConnectionStrings["connstr1"].ConnectionString
nerozumiem, kde je tam regexp?
Ne, je tam getter.
Ten řádek je sice šílenost, kterou bych takhle určitě nenapsal, ale fukční to zřejmě bude.
silenost? vzdyt to je implementace frameworku
-
ConfigurationManager.ConnectionStrings["connstr1"].ConnectionString
nerozumiem, kde je tam regexp?
Ne, je tam getter.
Ten řádek je sice šílenost, kterou bych takhle určitě nenapsal, ale fukční to zřejmě bude.
silenost? vzdyt to je implementace frameworku
ze kteryho blazince si proboha utekl?
-
Ten řádek je sice šílenost, kterou bych takhle určitě nenapsal, ale fukční to zřejmě bude.
silenost? vzdyt to je implementace frameworku
Tak tedy šílenost šíleného frameworku.
-
Už tu chýbal len tento PHP-čkarsky rozumbrada.
-
zboj se omlouva - dnes nedorazi - ztratil se na akademicke půdě
-
zboj se omlouva - dnes nedorazi - ztratil se na akademicke půdě
Neva, kdyby se ztratil ve sklepě, bylo by to horší.
-
... a pak někdo zadá tajnou volbu -6...