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

18 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. 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
  4. 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
  5. Inspiring writings and I greatly admired what you have to say , I hope you continue to provide new ideas for us all and greetings success always for you.
    Keep update more information..


    Selenium training in bangalore
    Selenium training in Chennai
    Selenium training in Bangalore
    Selenium training in Pune
    Selenium Online training
    Selenium interview questions and answers

    OdpovědětVymazat
  6. Really i appreciate the effort you made to share the knowledge. The topic here i found was really effective...

    Softgen Infotech is the Best SAP HANA Admin Training in Bangalore located in BTM Layout, Bangalore providing quality training with Realtime Trainers and 100% Job Assistance.

    OdpovědětVymazat
  7. Very nice post here and thanks for it .I always like and such a super contents of these post.Excellent and very cool idea and great content of different kinds of the valuable information
    Java training in Chennai

    Java Online training in Chennai

    Java Course in Chennai

    Best JAVA Training Institutes in Chennai

    Java training in Bangalore

    Java training in Hyderabad

    Java Training in Coimbatore

    Java Training

    Java Online Training


    OdpovědětVymazat
  8. Thanks for a marvelous posting! I seriously enjoyed reading it, you are
    a great author.I will be sure to bookmark your blog and will often come back in the future.
    I want to encourage yourself to continue your great job, have a
    nice weekend!
    oracle training in chennai

    oracle training in velachery

    oracle dba training in chennai

    oracle dba training in velachery

    ccna training in chennai

    ccna training in velachery

    seo training in chennai

    seo training in velachery

    OdpovědětVymazat