Неявное преобразование объекта - PullRequest
0 голосов
/ 03 февраля 2010

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

var o = new MyReferenceType();
DoSomeWorkAndPossiblyModifyO(o);
DoYetMoreWorkAndPossiblyFurtherModifyO(o);

//now use o...

Мне кажется, что это неправильно (вряд ли объектно-ориентировано). Это приемлемо?

Ответы [ 3 ]

2 голосов
/ 03 февраля 2010

Исходя из названий ваших методов, я бы сказал, что в преобразовании нет ничего неявного. Этот шаблон будет приемлемым. Если, с другой стороны, ваши методы имеют имена, такие как printO(o) или compareTo(o), но на самом деле изменяют объект o, дизайн будет плохим.

1 голос
/ 03 февраля 2010

Это приемлемый, но обычно плохой стиль. Обычный «хороший» подход:

DoSomeWorkAndModify(&o);  // explicit reference means we will be accepting changes

o = DoSomeWorkAndReturnModified(o); // much more elastic because you often want to keep original.

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

1 голос
/ 03 февраля 2010

Это полностью зависит от того, что на самом деле делают методы, помимо изменения этого объекта.

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

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

Однако!Поскольку я программирую в основном на C # и, следовательно, на .NET, который является полностью объектно-ориентированным языком, я на самом деле написал бы ваш код следующим образом:

var o = new MyReferenceType();
SomeOtherClass.DoSomeWorkAndPossiblyModifyO(o);
SomeOtherClass.DoYetMoreWorkAndPossiblyFurtherModifyO(o);

//now use o...

В этом случае фактическое имя этого другого класса (илиэти другие классы, если в них участвуют 2), дали бы мне большую подсказку о том, что на самом деле происходит и / или о контексте.

Пример:

Person p = new Person();
DatabaseContext.FetchAllLazilyLoadedProperties(p);
DatabaseContext.Save(p); // updates primary key property with new ID
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...