neděle 16. července 2017

Funkcionální programování potřetí

Výsledný kód programu, využívajícího funkcionální přístup ke zpracování CSV souboru v předešlém příspěvku, byl trochu kostrbatý a špatně čitelný. Obsahoval příliš mnoho podmínek if.


Těm se lze vyhnout, pokud použijeme takzvaný railway přístup k zápisu kódu. Při tomto přístupu se na funkci díváme jako na kus kolejiště s výhybkou a na spuštěný kód jako na vláček, který po sestaveném kolejišti jede.


Pokud je funkce vykonána v pořádku, pokračuje vláček, tedy náš kód, rovně. Pokud dojde k chybě, přehodí se výhybka a vláček pokračuje po vedlejší koleji a už se nikdy nemůže vrátit na původní směr.

Zjednodušený pohled na funkci je pak takovýto:


A celkový běh programu pak lze graficky vyjádřit takto:

Abychom byli schopni toto přenést do kódu, je nutné doplnit metodu onsuccess - stavem onfailure se nebudu zabývat, ale implementace by byla analogická a více informací a tipů naleznete v odkazech v první části tohoto miniseriálu - obvykle se implementují ještě metody OnFailure and OnBoth.


public static class ResultExtensions
{
    public static Result<TOut> OnSuccess<T, TOut>(this Result<T> result, Func<T, Result<TOut>> func)
    {
 
        if (result.IsFailure)
        {
            return Result.Fail<TOut>(result.Error);
        }
 
        return func(result.Value);
    }
 
    public static Result OnSuccess<T>(this Result<T> result, Func<T, Result> func)
    {
 
        if (result.IsFailure)
        {
            return Result.Fail(result.Error);
        }
 
        return func(result.Value);
    }
}
A původní funkci můžeme přepsat na:



public Result ProcessLine(int number, string content)
{
    return headerInfoAction.Execute(number, content).OnSuccess(
                    headerInfo =>
                    {
                        return parser.ParseToDictionary(headerInfo, content).OnSuccess(
                            parsedLine =>
                            {
                                return lineIdProvider.GetLineId(parsedLine).OnSuccess(
                                    id =>
                                    {
                                        return duplicateChecker.CanProcessLine(id, number);
                                    });
                            });
                    });
}
Kód je kratší a lépe čitelný.  Na závěr ještě jednou seznam odkazů na více informací:

https://app.pluralsight.com/library/courses/csharp-applying-functional-principles
http://enterprisecraftsmanship.com/
https://github.com/vkhorikovhttps://www.nuget.org/packages/CSharpFunctionalExtensions

9 komentářů:

  1. Osobně si myslím, že je to zajímavý způsob zápisu, ale nepřijde mi o moc víc čitelnější (jen tak v rychlosti z fleku, když si to pozorně přečtu tak je jasné že to na sebe navazuje s tím OnSuccess) než s podmínkami :) Ještě přemýšlím jestli je jasné, že výsledek funkce je Fail když se něco zvorá anebo by to člověk co takovýto kód dostane, nevěděl (v té implementaci se právě (aspoň zatím) neřeší, co se stane když by se to nepovedlo, ale předpokládám že právě z tohoto důvodu se implementuje i OnFailure, který jste v rámci příkladu přeskočil :))

    OdpovědětVymazat
  2. OnFailure se neřeší, neboť není nutná žádná akce v případě neúspěchu - výsledek, tedy objekt Result se následně vyhodnotí a uživateli se zobrazí i případná příčina chyby - viz předešlý díl.
    OnFailure se použivá, pokud je potřeba provést nějaký rollback apod. - více informací lze nalézt v odkazech.

    OdpovědětVymazat
  3. This is an imposing post.Really very informative and creative contents. These concept is a good way to enhance the knowledge.I like it and help me to development very well.Thank you for this brief explanation and very nice information.

    Bigdata Training in Chennai

    OdpovědětVymazat
  4. THANKS YOU SO MUCH FOR THIS INFORMATIVE BLOG MAKE ME TO GET MORE STUFF.....
    IM GONNA SHARE THIS WITH MY FRIENDS.....


    Transportation Consulting Chennai
    civil engineering consultants
    Office Interiors in Chennai
    Rainwater harvesting chennai

    OdpovědětVymazat
  5. I appreciate your efforts because it conveys the message of what you are trying to say. It's a great skill to make even the person who doesn't know about the subject could able to understand the subject . Your blogs are understandable and also elaborately described. I hope to read more and more interesting articles from your blog. All the best.

    Stormwater Consulting Chennai
    Transportation Consulting Chennai
    Civil Engineering Consultants
    Office Interiors in Chennai
    Rainwater Harvesting chennai

    OdpovědětVymazat
  6. Learn about other Apache projects that are part of the Hadoop ecosystem, including Pig, Hive, HBase, ZooKeeper, Oozie, Sqoop, Flume, among others. Big Data University provides separate courses on these other projects, but we recommend you start here.

    Bigdata training in Chennai OMR

    OdpovědětVymazat
  7. SQream Technologies provides you with a state of the art software which combines modern GPU technology (Graphic Processing Units) with the best practices in today’s Big Data platforms, providing up to 100x faster insights from data.
    Bigdata Training in Chennai OMR

    OdpovědětVymazat