함수형 프로그래밍으로 C#에서 Null 제거

이것은 Option 클래스가 기능적 프로그래밍 개념을 C# 코드베이스에 가져오고 null 참조 예외를 방지하는 방법을 보여주는 짧고도 좋은 기사입니다.

이 기사에서는 매우 인기 있는 language-ext 라이브러리를 객체 지향 언어(F# 제외)용으로 빌드된 가장 인기 있는 .NET 기능 프로그래밍 라이브러리로 사용합니다.

Language-Ext 라이브러리 설치



language-ext 라이브러리로 작업하려면 add a NuGet reference to the package 이 필요합니다. 이 작업은 Visual Studio의 NuGet 패키지 관리자를 통해 수행하거나 패키지 관리자 콘솔에서 Install-Package LanguageExt.Core을 실행하여 수행할 수 있습니다.

옵션이란 무엇입니까?



옵션은 일부 값을 포함하거나 전혀 포함하지 않는 참조 유형입니다. 예를 들어 사전을 검색하고 그로부터 값을 반환하는 다음 메서드를 살펴보세요.

public Option<ResumeKeyword> GetKeyword(
   IDictionary<string, ResumeKeyword> keywords, 
   string word) { 

  // Ensure we're searching for a lower-cased non-null word
  string key = word ?? word.ToLowerInvariant() : string.Empty;

  // If the keyword is present, return it
  if (keywords.ContainsKey(key)) {
    return keywords[key]; // Implicitly converted to Some<ResumeKeyword>
  }

  // No keyword found
  return Option<ResumeKeyword>.None;
}

이 메서드에서 반환 유형은 Option<ResumeKeyword> 이므로 반환 유형은 Some<ResumeKeyword> 또는 None 입니다. 결과는 명시적으로 null이 아니므로 호출자는 null 값에 대해 걱정할 필요가 없습니다.

컴파일러는 표준 값을 Some 값으로 변환할 수 있지만 None 반환 유형의 구문은 Option 작업의 복잡성이 추가되는 것을 볼 수 있으므로 이상적이지 않습니다.

고맙게도 파일 맨 위에 using static LanguageExt.Option<ResumeKeyword>;을 사용하여 다음을 추가하면 반환 유형을 단순화할 수 있습니다.

이를 통해 훨씬 더 잘 읽히는 return None;을 수행하는 대신 단순히 return Option<ResumeKeyword>.None;을 수행할 수 있습니다.

옵션 작업



이제 Option 이 있으므로 작업할 수 있기를 원합니다. 여기에서 Option의 매력이 작용하기 시작합니다. 우리는 Option으로 작업하고 있기 때문에 컴파일러는 다음과 같이 잠재적으로 버그가 있는 코드를 만들 수 없습니다.

// Give a bump for various words in the title
foreach (var word in job.Title.Split())
{
    var keyword = FindKeyword(keywordBonuses, key);
    jobScore += keyword.Value; // Does not compile
}

이 코드는 keywordOption<ResumeKeyword>이 아닌 ResumeKeyword이므로 ResumeKeyword의 멤버에 직접 액세스할 수 없기 때문에 컴파일되지 않습니다. FindKeyword 이 때때로 일치하는 키워드를 찾을 수 없다는 것을 알고 있기 때문에 이 불편함은 실제로 좋은 것입니다. 그러면 NullReferenceException 을 확인하는 것을 잊은 경우 표준 애플리케이션에서 null 이 됩니다.

대신 다음과 같이 작성합니다.

// Give a bump for various words in the title
foreach (var word in job.Title.Split())
{
    var keyword = FindKeyword(keywordBonuses, key);
    jobScore += keyword.Some(k => k.Value)
                       .None(0);
}

여기서 우리는 Some 키워드가 있는 경우 ValueResumeKeyword만큼 점수를 높이고 None이 있는 경우 단어를 0 또는 필러로 점수를 매기고 싶다고 말합니다.

컴파일러의 유형 검사는 이러한 규칙을 시행하고 올바른 유형에 도달했는지 확인하여 값이 존재하는지 여부에 대해 생각하고 그에 따라 행동하도록 합니다.

값이 있거나 없거나 실제 값이 필요하지 않은 경우에만 작업을 수행하려는 시나리오의 경우 IsSome 또는 IsNone 속성을 확인할 수 있습니다. 예를 들어:

if (keyword.IsNone) {
   Console.WriteLine($"No value defined for keyword '{word}');
}

nullable 형식은 어떻습니까?



.NET은 Nullable<T>(종종 T? myVar 으로 코딩됨)을 통해 잠시 동안 nullable types 개념을 가졌습니다.

nullable 형식은 값 형식을 nullable 개체로 나타내는 방법입니다. 이것은 다음과 같은 이유로 옵션과 다릅니다.
  • 옵션은 참조 유형과 값 유형 모두에서 작동합니다.
  • Nullable<T>HasValueValue 멤버를 제공하지만 Option<T>은 위에서 본 것처럼 Some 또는 None 조건에 특정 방식으로 반응하는 편리한 방법을 제공합니다.

  • 요약



    Language-Ext's Option class은 지능적인 결정을 내리고 잠재적으로 누락된 값을 안전한 방식으로 사용하도록 합니다.

    이것의 단점은 코드를 읽고 쓰는 데 복잡성이 추가된다는 것입니다. 그러나 코드베이스의 품질이 중요한 측면이나 null 값이 자주 가능한 영역에서는 Option<T>을 코드에 통합하는 것이 좋습니다.

    또한 Option<T>은 Language-Ext에서 제공하는 기능의 일부일 뿐이라는 점을 명심하십시오. 자세한 내용을 보려면 전체 라이브러리를 확인하거나 향후 게시물에 대한 알림을 받으려면 저를 팔로우하세요.

    전체 결함 클래스를 제거하는 더 많은 방법에 대해 궁금한 경우 를 확인하십시오.


    좋은 웹페이지 즐겨찾기