Подтвердить что ты не робот

Зачем приклеиваться, а не car.speed() и car.speed(55) соответственно?

Помимо однозначной ясности, почему мы должны придерживаться:
car.getSpeed() и car.setSpeed(55)
когда это также можно использовать: car.speed() и car.speed(55)

Я знаю, что get() и set() полезны для сохранения любых изменений в элементе данных, управляемых, сохраняя все в одном месте.

Кроме того, я понимаю, что car.speed() и car.speed(55) являются той же функцией, что делает это неправильно, но затем в PHP, а также в Zend Framework, то же действие используется для GET, POST, postbacks.
В VB и С# есть "свойства" и используются многими, к большому отвращению к пуристам, которые я слышал, и есть вещи в Ruby, такие как 5.times и .each, .to_i и т.д.
И у вас есть перегрузка оператора, множественное наследование, виртуальные функции на С++, некоторые комбинации которых могут вызывать любые орехи.

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

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

Если я все еще решил остаться верным, я мог бы использовать car.speed() и car.setSpeed(55).
Это что-то неправильно (просто опустив "get" )?

Спасибо за любые объяснения.

4b9b3361

Ответ 1

Если я позвоню car.speed(), я могу подумать, что я говорю машине, чтобы ускорить, другими словами, чтобы увеличить скорость и прервать ограничение скорости. Это явно не геттер.

Некоторые языки позволяют объявлять объекты const, а затем ограничивать вас только функциями вызова, которые не изменяют данные объекта. Поэтому для выполнения операций модификации и чтения необходимо иметь отдельные функции. Хотя вы можете использовать перегрузки для параметров, чтобы иметь две функции, я думаю, что это будет путать.

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

car.speed()

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

car.getSpeed()

Я читал "для этого автомобиля, скорость"

car.setSpeed(55)

Я прочитал "для этого автомобиля, установил скорость до 55"

Кажется, вы в основном процитировали другие функции языка как сбивающие с толку, а затем использовали это как защиту для того, чтобы сделать геттеры/сеттеры более запутанными? Похоже, это похоже на то, что то, что вы предложили, более сбивает с толку. Эти функции иногда путают из-за того, насколько они универсальны. Иногда абстракции могут быть более запутанными, но, в конце концов, они часто служат цели более многоразового использования. Я думаю, что если вы хотите поспорить в пользу скорости() и скорости (55), вы бы хотели показать, как это может позволить новые возможности для программиста.

С другой стороны, у С# есть что-то вроде того, что вы описываете, поскольку свойства ведут себя по-разному в качестве геттера или сеттера в зависимости от контекста в том, что они используются:

Console.WriteLine(car.Speed); //getter

car.Speed = 55 //setter

Но пока это одно свойство, есть два отдельных раздела кода для реализации получения и настройки, и ясно, что это геттер/сеттер, а не скорость функции, поскольку они опускают свойства() для свойств, Таким образом, car.speed(), очевидно, является функцией, а car.speed - это свойство getter.

Ответ 2

IMHO Стиль С#, имеющий свойства как синтаксический сахар для методов get и set, является наиболее выразительным.

Ответ 3

Я предпочитаю активные объекты, которые инкапсулируют операции, а не геттеры и сеттеры, поэтому вы получаете семантически более богатые объекты.

Например, хотя ADT, а не бизнес-объект, даже vector в С++ имеет сопряженные функции:

size_type capacity() const // how many elements space is reserved for in the vector  
void reserve(size_type n)  // ensure space is reserved for at least n elements 

и

void push_back ( const T& ) // inserts an element at the end
size_type size () const     // the number of elements in the vector

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

Ответ 4

FYI, Objective-C использует car.speed() и car.setSpeed(55) (за исключением другого синтаксиса [car speed] и [car setSpeed:55].

Все о конвенции.

Ответ 5

Нет правильного ответа, это вопрос стиля, и в конечном итоге это не имеет значения. Проведите свои мозговые циклы в другом месте.

FWIW Я предпочитаю class.noun() для getter и class.verb() для сеттера. Иногда глагол просто установленNoun(), но в других случаях нет. Это зависит от существительного. Например:

my_vector.size() 

возвращает размер, а

my_vector.resize(some_size) 

изменяет размер.

Ответ 7

Конечными критериями вашего кода должны быть следующие:

  • Правильно ли он работает?
  • Легко ли исправить, если он ломается?
  • Легко ли добавлять новые функции в будущем?
  • Легко ли кому-то еще войти и исправить/улучшить его?

Если эти 4 точки покрыты, я не могу себе представить, почему у кого-то будет проблема с этим. Большинство "лучших практик" обычно ориентированы на достижение этих 4 баллов.

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

Ответ 8

Это только вопрос согласия. В Smalltalk он сделал то, что вы предлагаете, и я не помню, чтобы кто-либо жаловался на это. Скорость автомобиля car speed, а скорость автомобиля до 55 составляет car speed:55.

Если бы я рискнул догадаться, я бы сказал, что причина, по которой этот стиль не улавливается, - это из-за двух строк, к которым обратились объектно-ориентированное программирование: С++ и Objective-C. В С++ (еще более ранняя история) методы очень тесно связаны с C-функциями, а C-функции условно называются в строках setWhatever() и не имеют перегрузки для разных чисел аргументов, поэтому общий стиль именование было сохранено. Objective-C был в значительной степени сохранен NeXT (который позже стал Apple), и NeXT, как правило, предпочитают многословие в своих API и особенно для различения различных методов - если вы ничего не делаете, а просто получаете доступ к свойству, NeXT хотел глагол чтобы было ясно. Таким образом, это стало соглашением в Cocoa, которое является фактической стандартной библиотекой для Objective-C в эти дни.

Ответ 9

В соглашении Java есть соглашение с геттерами и сеттерами. С# имеет свойства, у python есть общедоступные поля и фреймворки JavaScript, как правило, используют field() для получения и поля (значения) для установки

Ответ 10

Помимо однозначной ясности, почему мы должны придерживаться: car.getSpeed ​​() и car.setSpeed ​​(55) когда это может быть использовано также: car.speed() и car.speed(55)

Потому что во всех встречах, с которыми я столкнулся, car.speed() и car.speed(55) совпадают с точки зрения синтаксиса. Просто глядя на них так, оба могут вернуть значение, что неверно для последнего, если оно предназначено для установки.

Ответ 11

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

Ответ 12

.() означает, что это глагол. no() означает его существительное.

   car.Speed = 50;
   x = car.Speed
   car.Speed.set(30)
   car.setProperty("Speed",30)

но

   car.Speed()

означает, что команда превысит ограничение скорости.