Skip navigation
2014
ozizka

Keep your Java code flat!

Posted by ozizka Jun 26, 2014

Gone are the times of Pascal and Visual Basic. With Java, you can keep your code, which goes beyond basic algorithmic structure, readable and understandable.

 

Compare these two identical codes:

 

public void setParameterStore(final ParameterStore parent)
{
    for (final Rule rule : config.getRules())
    {
        if( ! (rule instanceof RuleBuilder) )
            continue;

        ParameterizedCallback callback = new ParameterizedCallback()
        {
            @Override
            public void call(Parameterized parameterized)
            {
                Set<String> names = parameterized.getRequiredParameterNames();
                if( ! (rule instanceof RuleBuilder) )
                    return;

                ParameterStore store = ((RuleBuilder) rule).getParameterStore();

                for (Map.Entry<String, Parameter<?>> entry : parent)
                {
                    String name = entry.getKey();
                    Parameter<?> parentParam = entry.getValue();

                    if (!store.contains(name))
                    {
                        store.get(name, parentParam);
                        continue;
                    }

                    Parameter<?> parameter = store.get(name);
                    for (Binding binding : parameter.getBindings())
                    {
                        if (!parentParam.getBindings().contains(binding))
                            throwRedefinitionError(rule, name);
                    }

                    for (Constraint<?> constraint : parameter.getConstraints())
                    {
                        if (!parentParam.getConstraints().contains(constraint))
                            throwRedefinitionError(rule, name);
                    }

                    for (Transposition<?> transposition : parameter.getTranspositions())
                    {
                        if (!parentParam.getTranspositions().contains(transposition))
                            throwRedefinitionError(rule, name);
                    }

                    if (parentParam.getConverter() != null
                                && !parentParam.getConverter().equals(parameter.getConverter()))
                        throwRedefinitionError(rule, name);

                    if (parentParam.getValidator() != null
                                && !parentParam.getValidator().equals(parameter.getValidator()))
                        throwRedefinitionError(rule, name);
                }

                for (String name : names)
                {
                    Parameter<?> parameter = store.get(name, new DefaultParameter(name));
                    if (parameter instanceof ConfigurableParameter<?>)
                        ((ConfigurableParameter<?>) parameter).bindsTo(Evaluation.property(name));
                }
                parameterized.setParameterStore(store);

            }

            private void throwRedefinitionError(Rule rule, String name)
            {
                throw new IllegalStateException("Subset cannot re-configure parameter [" + name
                            + "] that was configured in parent Configuration. Re-definition was attempted at ["
                            + rule + "] ");
            }
        };

        Visitor<Condition> conditionVisitor = new ParameterizedConditionVisitor(callback);
        new ConditionVisit(rule).accept(conditionVisitor);

        Visitor<Operation> operationVisitor = new ParameterizedOperationVisitor(callback);
        new OperationVisit(rule).accept(operationVisitor);
    }
}

and

 

public void setParameterStore(final ParameterStore parent)
{
    for( int i = 0; i < config.getRules().size(); i++ ) {
        Rule rule = config.getRules().get(i);

        if( ! (rule instanceof RuleBuilder) )
            continue;

        ParameterizedCallback callback = new ParameterizedCallbackImpl(rule, parent);
    }
}



private static class ParameterizedCallbackImpl implements ParameterizedCallback {

        parameterized.setParameterStore(store);

    }

 

Which one do you like more? In the first, the logic nests deeper and deeper and it's hard to keep the context in head. The second abstracts the implementation away and keeps just the name of the class, or, a contract.

 

Another example:

 

@SuppressWarnings("unchecked")
public <T extends WindupVertexFrame> T findSingletonVariable(Class<T> type, String name)
{
    Iterable<WindupVertexFrame> frames = findVariable(name);
    T result = null;
    Iterator<WindupVertexFrame> iterator = frames.iterator();
    if (iterator.hasNext())
    {
        Object foundObject = iterator.next();

        // Check the type.
        if (!type.isAssignableFrom(foundObject.getClass()))
        {
            throw new IllegalTypeArgumentException(name, type, foundObject.getClass());
        }
        result = (T) foundObject;

        // Check if there's just 1.
        if (iterator.hasNext())
        {
            throw new WindupException("findSingleton called for variable \"" + name
                        + "\", but more than one result is present.");
        }
    }
    return result;
}

 

and

 

@SuppressWarnings("unchecked")
public <T extends WindupVertexFrame> T findSingletonVariable(Class<T> type, String name)
{
    Iterable<WindupVertexFrame> frames = findVariable(name);
    if( null == frames )
        throw new WindupException("Variable not found: " + name);

    Iterator<WindupVertexFrame> iterator = frames.iterator();
    if( ! iterator.hasNext() )
        return null;

    Object obj = iterator.next();

    // Check if there's just 1.
    if( iterator.hasNext() )
        throw new WindupException("More than one frame present "
                + "under presumed singleton variable: " + name);

    // Check the type.
    if( ! type.isAssignableFrom(obj.getClass()) )
        throw new IllegalTypeArgumentException(name, type, obj.getClass());

    return (T) obj;
}

 

Obviously, the second example's logic is clearer and eaiser to follow. The conditions, which can result in returning a special (null) value or throw an exception, are handled as soon as possible, and do not clutter the actual logic of the main task.

 

Conclusion:

For the sake of readability, try to keep your code flat, in the sense of not nesting loops and conditions too much.

Navštívil jsem pracovně Charlotte v Severní Karolíně, a protože většinu nákladů tvoří letenka, trochu jsem si to prodloužil.

 

Co tedy v Charlotte dělat v pracovním čase a co o víkendu?

 

Základní info

 

Když se řekne Charlotte, většina našinců si bude myslet buď že to je městečko ve Francii, nebo nějaká vesnice na středozápadě. Omyl, je to 17. největší město USA Kolem 1,7 milionu obyvatel, s aglomerací přes 2,3. Je to hodně smíšené město, co se týká, řekněme, výrazných vzhledových odlišností. (Naplno se tady o takových odlišnostech nemluví, s výjimkou hraní "cards against humanity"). Ve srovnání s jinými městy USA je tu celkem levně, mimo centrum stojí potraviny cca o polovinu víc než v ČR. Prakticky všechno se tu dá platit kartou, včetně taxi a stánků na letišti. Já za celou dobu nepoužil hotovost (ani jsem ji nevezl )

 

Město vzniklo na křižovatce dvou velkých indiánských cest, čemuž vděčilo za svůj prvotní rozvoj, a možná i za budoucí určení - je to druhé největší centrum bankovního sektoru USA (po New Yorku). Je to vidět i v centru - většinu mrakodrapů tu vlastní a používají banky.

 

Není to vyloženě turistický cíl. Opravdu tu prakticky není co vidět. Ani v okolí žádné extra parky či cokoliv nenajdete. Památky žádné. Když jsem se ptal na aquapark, což byste ve městě s průměrnou denní letní teplotou kolem 36 stupňů čekali, místní se zamysleli a říkali - jooo, jeden bazén támhle někde na jihu má vlastně jednu skluzavku. Mno...

A pokud čekáte, že to nic aspoň uvidíte z výšky, tak taky vedle: Banky totiž po 9/11 znepřístupnily nejen střechy, ale prakticky celé budovy. Takže z otvíráku na flašky, aka Duke Energy tower, se nepodíváte. Jediné místo, kde snad je někdy možné shlédnout Charlotte z poloviční výšky, je restaurace Bentley v 27. patře - bentleyson27.com - ale ta v neděli asi nepremává, takže já neviděl.

Sami místní shrnují, že Charlotte skutečně moc co nabídnout nemá, ale že je celkem fajn pro život - poklidné relativně bezpečné čisté město s fungující infrastrukturou.

 

 

Struktura města

 

Struktura Charlotte je celkem jednoduchá:

Rušné cca obdélníkové centrum s mrakodrapy, obehnané dálničním okruhem, velké asi 1,5 x 2,5 km.

A kolem toho mraky parcel s rodinnými domky, které jsou sice každý jiný, ale styl je víceméně na jedno brdo.

Jihovýchod města je bohatší, bezpečný, klidný, bílý, prorostlý zelení.

Severozápad je potom chudší, nevím jak moc nebezpečný, ale kolegové mi tam nedoporučovali chodit, zejména ne v noci; rušnější (ve smyslu brněnského Cejlu) a vyprahlejší (kdo by platil za vodu na zalévání).

Hranicí mezi těmito dvěma je plus mínus Tyron Street.

 

Doprava

 

Ve městě je slušná MHD. Místní říkají, že je pomalá a neefektivní. Vyzkoušel jsem, a je rychlá zhruba jako u nás. Ale doprava je tu celkově klidná a plynulá, takže ve srovnání s auty je skutečně tak 4x pomalejší - na rozdíl např. od Prahy, kde je metro skoro vždy bezkonkurenčně rychlejší.

Centrem zhruba podél Tyron Street prochází vláček. Lístek je za 2 dolary. Moc rychle se neposunuje, v rámci centra ani nemá cenu do něj nastupovat.

Dále jsou tu autobusy, celkem v pohodě, ale staví co pár metrů. Cesta z letiště do centra je tak na hodinu, autem ani ne 20 minut.

Za 8 dolarů si můžete půjčit kolo ze stojanů, které je první půlhodinu zdarma, a za každou další platíte $4. To má motivovat lidi ke krátkým popojížďkám. Když už v tom budete, podívejte se určitě na stezku Little Sugar Gree Way, která vede korytem podle potůčku na jihu kolem několika parků.

Taxi mají taxametr, je to drahé asi jako v Praze bez taxametru. Z letiště opravdu doporučuju vzít taxík. Telefon na ně je tu 444-4444, nebo tak nějak.

Je tu také jakési neoficiální taxi, které funguje přes aplikaci v mobilu, TODO: Zjistit.

Parkování je řešeno parkovacími domy, obvykle kolem $6 od osmi do tří.

No a nakonec, pěšky se tu chodí celkem dobře, po centru asi ani nemá cenu řešit něco jiného.

 

Bydlení

Sehnat bydlení doporučuju na AirBnB.com, pokud hledáte něco levnějšího, kolem $50 - tam lidi pronajímají svoje domácí pokoje.

Dále lze zkusit Couchsurfing.com, ale přišlo by mi blbý někomu okupovat stůl a tak, to je vyloženě na přespání. Navíc to tu moc nefrčí.

Další možností je hotwire.com, což je takový slevomat pro hotely. Já sehnal za $66 v Holiday Inn, což je prý dobrá cena. Na pokoji lednička, mikrovlnka, samozřejmě záchod, sprcha a nepraktické umyvadlo, a rychlá, ale nestabilní wifi. Je lepší jít s noťasem blíž k routru, který je někde na chodbě. Vidím tu i ethernetovou (RJ) zásuvku, ale nemám síťový kabel, takže netuším, jestli je živá. Jméno a heslo dostanete automaticky zdarma k pobytu.

 

Jídlo

Americká kuchyně je asi víceméně stejk. Vše ostatní jsou různé další světové. Jsou tu tendence sdružovat podniky jednoho druhu do jednoho místa, takže v jednom domě najdete italskou Mama's, Etiopian Cousine, Chinese food, French restaurant a další. Osobně nedoporučuju zkoušet fancy restaurace a dávat si medium rare steaky nebo sushi - aspoň můj středoevropský trávicí trakt se s tím nevyrovnal.

 

Noční život

Jak už jsem psal, je zde tendence shlukovat podniky podobného rázu do jednoho místa. V případě klubů je to The Epicentre. Je to takové "klubový obchoďák" (jak to trefně označila Hanka). Je to asi 5patrový barák o velikosti bloku, ve kterém je asi 15 klubů, a pár obchodů. Do většiny se neplatí vstupné. Pivo je kolem 6 dolarů, dýško se tu dává cca. 10 %.

 

Barmani jsou ochotní, rádi vám vyberou pivo, ale točí se celou dobu jak čamrdy, takže na nějaké velké vybavování to není. To je škoda. protože tu obvykle úplně chybí nápojové lístky. Ale aspoň máte záminku pokecat s místníma, co si dát Na pokec tu slouží střešní stage, které jsou podstatně méně hlučné než ty vnitřní.

 

Ještě ochotnější jsou sekuriťáci. Ti vám rádi poradí, který klub co hraje, kde najít jakou sortu lidí. Například, pokud jako já hledáte electro, house, trance, chillout, tak to máte smůlu. Na to musíte do jednoho ze dvou dalších center: NoDa nebo The Music Factory Boulevard. Zkusil jsem jít do The Vault, což je venkovní stage, kde se hraje černošská muzika, a podle toho vypadá osazenstvo - byl jsem tam jediný odlišný, jinak samí "brothas". Ale jsou v pohodě, nekoukaj na vás jak když u nás vlezete do cikánské hospody. Akorát u baru je dost tlačenice, obvykle jsou hodně velcí a silní.

 

Pouliční ruch končí v 11, kromě těch výše uvedených center si tedy hospody stáhnou lidi z ulic dovnitř.

Vše potom úplně zavírá ve dvě. To je celostátní zákon. Poté už jedou jen strip cluby, kde jsem nebyl, ale údajně celkem draho a nuda - nalití mladí bankéři balí striptérky a snaží se být vtipní.

 

Závěr, Red Hat office

 

Já jel pracovně, tedy do RH office. Vzhledem k tomu, že místní pobočka je pro konzultanty, jako asi většina v US, je celkem malá - je to v podstatě jedna větší místnost a k ní dvě zasedačky. Nečekejte tu nic než 6 stolů a 8 židlí. Obvykle tu sedí tak 2-3 lidi. Narazíte tu na Matyáše, Brada, Lincolna, Josh, a další. Kuchyňka je společná pro celé patro, kde je asi 20 firem.

Kancelář je v 10. patře budovy Regus, která patří nějaké bance, která zabírá spodní patra až do 8. Celkem fajn výhled, ale lepší získáte např. ze střechy Holiday Inn. Jinak nějaký velký výhled asi nenajdete - mrakodrapy patří bankám, a ty nemají moc potřebu pouštět na svou střechu turisty (kterých tu beztak moc není).

 

Na závěr snad už jen dodám, že jsem ještě nikdy neviděl tolik veverek. Na jihovýchodě, kde je hodně zeleně, a v parcích, jsou tisíce veverek. Když se ubytujete v nějakém domečku, budou fám ráno čumět do okna

 

Klíčová slova: Czechs in Charlotte, North Carolina.

 

Kdyby někoho něco zajímalo, dejte vědět.

Další štace: Raleigh, možná New York. Škoda že propásnu Charlestone.

Filter Blog

By date:
By tag: