Expression, Method chaining with Extension methods

2022. 9. 16. 00:00CSharp/Functional Programming

반응형

Expression

Expression 은 상태를 변경하지 않고 값을 생성한다. 

Statements 은 작업을 정의하고 side effect 가 있다. 

 

Functional 에서는 상태를 변경하지 않고 side effect 가 없어야 한다.

그러므로 Statements 보다 Expression 을 선호 한다. 

 

그렇다면 Statements 란 무엇이고 Expression 이란 무엇일까?

 

C# 으로 예를 들어보겠다.

int i; // declaration statement
i = 12; // assignment statement
var increment = () => i + 1; // i + 1 is expression
int[] nums = { 1, 2, 3 };
// foreach statement block with nested selection statement
foreach (int num in nums)
{
    if (num % 2 == 0)
    {
    }
}
public double CheckCustomerPointStatements(double yearlyIncome, bool isSingle= false)
{
    double weight = 1;
    if (isSingle)
        weight = 1.2;

    return yearlyIncome * weight / 100;
}

public double CheckCustomerPointExpression(double yearlyIncome, bool isSingle = false)
{
    double weight = isSingle ? 1.2 : 1;
    return yearlyIncome * weight / 100;
}

 

Expression 의 이점

  • 여러 표현식을 함께 결합하여 더 큰 표현식으로 만들 수 있으므로 모든 것이 표현식이면 모든 것이 구성 가능하다.
  • 명령문은 항상 순서대로 평가되어야 한다. 표현식의 경우 하위 표현식에는 암시적인 실행 순서가 없다.
  • 표현식은 한 번 또는 여러 번 호출할 수 있으며 주어진 입력에 대해 동일한 결과를 생성한다.
  • 표현식은 테스트하기 더 쉽다. 표현식은 여러 번 또는 다른 시간에 호출해도 같은 결과를 생성한다.

 

Method Chaining with Extension Method

Functional Programming 에서는 많은 Pipe Lining 을 본다. 

여러 함수를 연결하여 특정 순서대로 실행하는 것을 말한다. 

C# 에는 Pipe 명령이 따로 존재하지 않으므로 Method Chain 에 의존한다. 

 

StringBuilder 를 이용한 Method Chaining

public string StringBuilderTest(string name)
{
    return new StringBuilder()
        .Append("my name")
        .Append("is")
        .Append($" {name}")
        .ToString();
}

extension method 를 통해 Method Chaining 에 조건을 넣을 수도 있다. 

public static class StringBuilderExtension
{
    public static StringBuilder AppendWhen
        (this StringBuilder sb, string value, bool predicate) =>
                predicate ? sb.Append(value) : sb;
}

...
    public string StringBuilderTest2(string name)
    {
        return new StringBuilder()
            .Append("my name")
            .Append("is")
            .AppendWhen($" {name}", name.Length < 6)
            .ToString();
    }
...

 

 

관련영상

https://youtu.be/LzOwnlVa5po

 

반응형

'CSharp > Functional Programming' 카테고리의 다른 글

Magma  (2) 2022.09.20
순수 함수 (Pure Function)  (0) 2022.09.19
Functors (Map, Filter, Reduce)  (0) 2022.09.15
Higher Order Function  (0) 2022.09.14
Immutable type or object  (0) 2022.09.13