Это объяснено в документации Perl .
из-за приоритета оператора Perl оператор анализируется как
($condition ? $a= 2 : $a ) = 3 ;
поскольку?: оператор приводит к присваиваемому результату, 3 присвоен результату условия.
, Когда $condition верен, что это означает ($a=2) =3$a=3 предоставления
, Когда $condition является ложью, это означает ($a) =3$a=3 предоставления
корректный способ записать, что это
$a = ( $condition ? 2 : 3 );
print $a;
, Мы были укушены этим на работе, таким образом, я отправляю здесь надеющихся других, найдет его полезным.
Следует ли мне реализовать классы, используя чистый интерфейсный класс в качестве основы, чтобы упростить создание поддельных тестовых объектов?
- Это заставило бы меня сделать много виртуальных методов. Повлияет ли это на производительность?
Я часто использую обходной путь - создать шаблон класса вместо того, чтобы скрывать его за интерфейсом. Затем я могу передавать тестовые / макетные объекты в качестве параметров шаблона при тестировании, а в противном случае - реальные объекты. Таким образом можно избежать снижения производительности виртуальных функций.
Edit
Хорошо, простой пример:
С ООП и интерфейсами вы можете написать такую функцию, как эта:
void Foo(IBar& someBar) { ... }
Эта функция принимает параметр который реализует интерфейс IBar
и что-то с ним делает. Если вы хотите передать фиктивную фиктивную реализацию, вы просто пишете фиктивный объект, который наследуется от IBar
, и передаете его Foo
. Просто и понятно.
Но вы можете добиться того же с помощью шаблонов:
template <typename BarType>
void Foo(BarType& someBar) { ... }
... и все. Тело Foo
может практически не измениться. Пока тип, переданный функции, предоставляет все необходимые нам члены, он будет работать без формального наследования от интерфейсного класса и без накладных расходов на виртуальные функции и полиморфизм времени выполнения.
Не создавайте слишком много с самого начала, затем напишите тест, затем дайте ему пройти, но не больше чем это. Делайте ваши функции очень краткими. Посмотрите, что вы сделали, и отрефакторизуйте это. Если вы собираетесь написать комментарий, лучше поместите рассматриваемый код в отдельную функцию с хорошим именем.
И не тратьте слишком много времени на размышления о шаблонах, это много науки и мало результата, просто сначала напишите тест и сделайте свой код простым, затем, что удивительно, вам не нужно писать для него тесты, вы уже это сделали. И ваш код работает.
Я думаю, что первоочередной задачей должно быть ...