Необходимо ли использовать свойства средства доступа из класса, или только от за пределами класса? [дубликат]

Попробуйте эту ссылку: https://www.learnopencv.com/head-pose-estima-using-opencv-and-dlib/

Короче говоря, вы необходимо знать трехмерные координаты некоторых точек человека и его 2D-проекции на плоскости датчика камеры, а затем использовать алгоритм PnP (Perspective-n-Point) для оценки положения камеры относительно человека. Лучше знать калибровку камеры, но вы можете использовать алгоритм DLT (прямое линейное преобразование), если у вас нет этих данных.

9
задан Alex Baranosky 24 January 2009 в 14:29
поделиться

9 ответов

Я соглашаюсь с krosenvold и хочу обобщить его совет немного:

Не используйте методы считывания Свойства и методы set для дорогих операций, как чтение файла или доступ к сети. Явная функция использования призывает к дорогим операциям.

Обычно пользователи класса не будут ожидать, что простое извлечение свойства или присвоение могут занять много времени.

Это также рекомендуется в Руководстве по проектированию Платформы Microsoft.;

Действительно используйте метод, а не свойство, в следующих ситуациях.

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

6
ответ дан 4 December 2019 в 09:38
поделиться

Я думаю, что это - хорошая идея всегда использовать средства доступа. Затем при необходимости в какой-либо специальной логике при получении или установке свойства Вы знаете, что все выполняет ту логику.

Можно ли отправить метод считывания и метод set для одного из этих свойств? Возможно, мы можем помочь отладить его.

5
ответ дан 4 December 2019 в 09:38
поделиться

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

Явная конструкция является намного лучшим решением, чем все виды ленивых-init методов считывания. Это может быть, потому что я использую платформы DI, которые дают мне все это как часть стандартных шаблонов использования. Я действительно пытаюсь рассматривать логику конструкции максимально отчетливо и не скрыться слишком много, она делает код легче понять.

4
ответ дан 4 December 2019 в 09:38
поделиться

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

Eric Lippert, недавно занесенный в блог на этом предмете в нескольких сообщениях:-

automatic-vs-explicit-properties
future-proofing-a-design

2
ответ дан 4 December 2019 в 09:38
поделиться

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

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

0
ответ дан 4 December 2019 в 09:38
поделиться

Если использование Получить метода приводит к этому виду ошибки, необходимо получить доступ к значению непосредственно. Иначе это - хорошая практика для использования средств доступа. Если необходимо изменить или метод считывания или метод set для принятия определенных мер в будущем, Вы повредите свой объект, если Вы не будете использовать тот путь.

1
ответ дан 4 December 2019 в 09:38
поделиться

Нет. Я не полагаю, что Вы должны, причина: удобный в сопровождении код.

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

Это не было должно, потому что команды обслуживания должны полностью понять то, что они пытаются изменить, но они часто смотрят на другую проблему или ошибку, и инкапсулированное свойство часто выходит из них. Я имею, видят это много и поэтому никогда не используют свойства внутренне.

Они могут также быть пожирателем ресурсов производительности, что должно быть простым поиском, может разозлиться, если кто-то помещает код базы данных в свойства - и я видел, что люди делают это также!

Принцип KISS все еще допустим после всех этих лет...!

2
ответ дан 4 December 2019 в 09:38
поделиться

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

1
ответ дан 4 December 2019 в 09:38
поделиться

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

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

private MyData _data = null;

public MyData Data
{
  get
  {
    if (_data == null)
      _data = LoadDataFromFile();
    return _data;
  }
}

private MyData LoadDataFromFile()
{
  // ...
}

Другими словами:

  • не реализуйте метод set
  • всегда используйте свойство для доступа к данным (никогда не используют поле непосредственно),
1
ответ дан 4 December 2019 в 09:38
поделиться