Приватные методы против локальных функций - PullRequest
4 голосов
/ 09 февраля 2020

Насколько я понимаю, как локальные функции, так и частные методы служат лишь деталями реализации - помощниками для методов c. Почему я хотел бы выбрать одно из другого?

При использовании частного метода я создаю отношение semanti c между объектом и методом (хотя и не видимым снаружи), что не всегда оправданный. Вот почему мой первый инстинкт заключается в том, что локальные функции - это путь к go , если только более одного метода publi c не использует его , и в этом случае я бы go использовал частные методы.

Но есть ли объективные причины отдать предпочтение одному из них? Есть ли ситуации, когда одно предпочтительнее другого? Каковы плюсы и минусы использования любого из них?

Ответы [ 2 ]

6 голосов
/ 09 февраля 2020

Все дело в читабельности кода. Глядя на мотивацию локальной функции

Локальные функции проясняют цель вашего кода. Любой, кто читает ваш код, может увидеть, что метод не вызывается, кроме как с помощью содержащего метода. Для командных проектов они также делают невозможным для другого разработчика ошибочно вызывать метод непосредственно из другого места в классе или структуре.

главная причина для локальной функции - дать намерение: Этот код только для этого метода; не используйте его из других мест. Иначе говоря: частные методы сигнализируют о своем потенциальном повторном использовании из других методов класса.

Есть еще несколько вариантов использования этой языковой функции, как обсуждено в Roslyn-Rep здесь .:

  • Очень часто пишут вспомогательный метод, который используется только из одного места, но он делает код менее понятным для читателя, потому что связь между вспомогательной функцией и тем, что она помогает, не является явный. Локальные функции делают ассоциацию частью синтаксиса.
  • Метод итератора, который проверяет свои аргументы (напишите функцию без итератора для проверки аргументов, а затем верните результат вызова локальной функции итератора)
  • Метод возврата задач, который не имеет асинхронного механизма c в общем случае, когда ему не нужно "go asyn c"
  • Вы пишете метод, который возвращает массив, но требуется syntacti c удобство синтаксиса метода итератора (yield return).

Эти варианты использования описаны в блоге https://devblogs.microsoft.com/premier-developer/dissecting-the-local-functions-in-c-7/

2 голосов
/ 09 февраля 2020

Иногда logi c огромен и содержит много повторений, например ...

public void ValidateCustomer(Customer customer){

  if( string.IsNullOrEmpty( customer.FirstName )){
       string error = "Firstname cannot be empty";
       customer.ValidationErrors.Add(error);
       ErrorLogger.Log(error);
       throw new ValidationError(error);
  }

  if( string.IsNullOrEmpty( customer.LastName )){
       string error = "Lastname cannot be empty";
       customer.ValidationErrors.Add(error);
       ErrorLogger.Log(error);
       throw new ValidationError(error);
  }

  ... on  and on... 
}

Такое повторение можно заменить локальной функцией,

  public void ValidateCustomer(Customer customer){

      void _validate(string value, string error){
           if(!string.IsNullOrWhitespace(value)){

              // i can easily reference customer here
              customer.ValidationErrors.Add(error);

              ErrorLogger.Log(error);
              throw new ValidationError(error);                   
           }
      }

      _validate(customer.FirstName, "Firstname cannot be empty");
      _validate(customer.LastName, "Lastname cannot be empty");
      ... on  and on... 
  }

Если вы посмотрите В общем, вам не нужно передавать параметры в локальную функцию, поскольку они могут ссылаться на все, что находится во включающей функции, вы должны только передавать измененные параметры. Если вы пишете приватные методы, вам нужно будет передать много параметров.

...