Интерфейсное соглашение о присвоении имен [закрывается]

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

Проблема 2: Это происходит потому, что по умолчанию OpenCV использует цветовое пространство BGR или (Blue, Green, Red). Вы можете изменить цветовое пространство на RGB или (Red, Green, Blue), используя cv2.cvtColor(image, cv2.COLOR_BGR2RGB) перед сохранением.

51
задан Frederick The Fool 27 December 2010 в 19:46
поделиться

16 ответов

Конвенции (и критика против них) у всех есть причина позади них, поэтому давайте бежать по некоторым причинам позади конвенций

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

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

    public class Apple: Fruit

    Без конвенции нельзя было бы знать если Apple наследовался другому названному классу Fruit, или если это была реализация названного интерфейса Fruit, тогда как IFruit сделает это очевидным:

    public class Apple: IFruit

    Принцип наименьшего количества удивления применяется.

  • Не все использование венгерской записи порицается - Раннее использование Венгерской записи показало префикс, который указал на тип объекта и затем сопровождаемый именем переменной или иногда подчеркиванием перед именем переменной. Это было, для определенных сред программирования (думайте Visual Basic 4 - 6), полезный, но поскольку истинное объектно-ориентированное программирование стало еще популярнее, это стало непрактичным и избыточным для определения типа. Это стало особенно проблемой, когда она прибыла в intellisense.

    Сегодня венгерская запись приемлема для различения элементов UI от фактических данных и так же связала элементы UI, например, txtObject для текстового поля, lblObject для маркировки, которая связана с тем текстовым полем, в то время как данные для текстового поля просто Object.

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

76
ответ дан Jon Limjap 7 November 2019 в 09:42
поделиться

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

Мне нравится иметь интерфейс, описывают то, что интерфейс выполняет в максимально универсальном пути, например, Validator. Определенная реализация, которая проверяет конкретную вещь, была бы a ThingValidator, и реализация с некоторой абстрактной функциональностью, совместно использованной Validators был бы AbstractValidator. Я сделал бы это даже если Thing единственное... хорошо... вещь, которую я проверяю, и Validator было бы универсально.

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

0
ответ дан Adam Jaskiewicz 7 November 2019 в 09:42
поделиться

Факт вопроса - то, что все понимают это, и часть написания лучшего кода помогает читать и понять.

0
ответ дан lexx 7 November 2019 в 09:42
поделиться

Это смотрит Hungarianish мне. Венгерский язык обычно считают угрозой на языках со строгим контролем типов.

Так как C# является продуктом Microsoft, и Венгерская запись была изобретением Microsoft, я вижу, где C# мог бы быть восприимчив к своему влиянию.

1
ответ дан Michael Buen 7 November 2019 в 09:42
поделиться

Я знаю, что инструкции Microsoft рекомендуют использовать 'меня' для описания этого как интерфейс. Но это прибывает из соглашений о присвоении имен IBM, если я не, помнят неправильно, инициирование 'я' для интерфейсов и следования *Impl для реализаций.

Однако, по-моему, Соглашения о присвоении имен Java являются лучшим выбором, чем соглашение о присвоении имен IBM (и не только в Java для C# также и любого языка программирования OO). Interfaces описывает то, что объект может смочь сделать, если он реализует интерфейс, и описание должно быть в глагольной форме. Т.е. Выполнимый, сериализуемый, Invoiceable, и т.д. По моему скромному мнению, это - идеальное описание того, что представляет интерфейс.

1
ответ дан Björn 7 November 2019 в 09:42
поделиться

Я не знаю точно, почему они выбрали ту конвенцию, возможно, частично думая о воодушевлении класса с "I" как в "Я являюсь Счетным".

Соглашение о присвоении имен, которое было бы больше в строке остальной части платформы, будет состоять в том, чтобы включить тип в имя, что касается примера xxxAttribute и xxxException классы, делая ее xxxInterface. Это немного длинно, хотя, и после всех интерфейсов что-то отдельное, не только другой набор классов.

2
ответ дан Guffa 7 November 2019 в 09:42
поделиться

Разделить интерфейсы от классов.

Также (это - больше персонального наблюдения, чем продиктованный от на высокий), интерфейсы описывают то, что делает класс. 'Я' предоставляет себя этому (я уверен, что это - конструкция в грамматике, которая была бы большой выкрикнуть прямо сейчас); интерфейс, который описывает классы, которые проверяют, был бы "IValidate". Тот, который описывает поведение при сравнении, был бы "IMatch".

1
ответ дан 7 November 2019 в 09:42
поделиться

Поскольку у Вас обычно есть IThing и Вещь. Таким образом вместо того, чтобы позволить людям идти со своими собственными "конвенциями" для этой повторяющейся ситуации, универсальная единая конвенция была выбрана. Отзываясь эхом, что говорят другие, фактическая стандартность является причиной достаточно для использования его.

3
ответ дан Kurt Schelfthout 7 November 2019 в 09:42
поделиться

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

Инструкция не объясняет, почему необходимо использовать I префикс, но то, что это - теперь установленная конвенция, должен быть причиной достаточно.

Что необходимо получить путем отбрасывания I префикс?

2
ответ дан LukeH 7 November 2019 в 09:42
поделиться

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

8
ответ дан topchef 7 November 2019 в 09:42
поделиться

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

10
ответ дан Otávio Décio 7 November 2019 в 09:42
поделиться

Ну, одно очевидное соображение было бы (очень распространено) IFoo и Foo пара (при абстракции Foo), но в более общем плане часто существенно знать, является ли что-то интерфейсом по сравнению с классом. Да это частично избыточно, но IMO, отличается от вещей как sCustomerName - здесь, само имя (customerName) должен быть достаточно для понимания переменной.

Но с CustomerRepository - это, что класс или абстрактный интерфейс?

Также: ожидание; факт, право или неправильно, именно это ожидают люди. Это - почти причина достаточно.

22
ответ дан Marc Gravell 7 November 2019 в 09:42
поделиться

Это - просто конвенция, это полно решимости, должен предотвратить коллизии имени. C# не позволяет мне иметь класс и интерфейс под названием Клиент, даже если имена файлов являются Клиентом и IClient, соответственно. Я - удобное использование конвенции; если бы я должен был предложить другую конвенцию, то я предложил бы использовать "Контракт" в качестве суффикса, например, ClientContract.

2
ответ дан Jamie Ide 7 November 2019 в 09:42
поделиться

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

23
ответ дан Jon B 7 November 2019 в 09:42
поделиться

Вещь является более читаемым именем, чем IThing . Я придерживаюсь мнения, что мы должны программировать интерфейсы, а не конкретные реализации. Итак, вообще говоря, интерфейсы должны иметь приоритет над реализациями. Я предпочитаю давать более удобочитаемое имя интерфейсу, а не реализации (т. Е. Мои интерфейсы называются без префикса «I»).

19
ответ дан 7 November 2019 в 09:42
поделиться

На мой взгляд, это «я» - всего лишь визуальный шум. IDE должна по-разному отображать имена классов и интерфейсов. К счастью, стандартная библиотека Java не использует это соглашение.

8
ответ дан 7 November 2019 в 09:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: