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

16 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
  8. Well somehow I got to read lots of articles on your blog. It’s amazing how interesting it is for me to visit you very often.
    python interview questions and answers
    python tutorials
    python course institute in electronic city

    OdpovědětVymazat
  9. Excellent blog, I wish to share your post with my folks circle. It’s really helped me a lot, so keep sharing post like this
    Devops Training courses
    Devops Training in Bangalore
    Best Devops Training in pune
    Devops interview questions and answers

    OdpovědětVymazat
  10. Greetings. I know this is somewhat off-topic, but I was wondering if you knew where I could get a captcha plugin for my comment form? I’m using the same blog platform like yours, and I’m having difficulty finding one? Thanks a lot.

    AWS Online Training |Best Online AWS Certification Course
    AWS Training in Chennai | Advanced Amazon Web Services Training Institute in Chennai
    AWS Training in Bangalore |Best AWS Training Institute in Bangalore

    OdpovědětVymazat