<?xml version='1.0' encoding="utf-8"?>
      <rss version='2.0'>
      <channel>
      <title>Форум на Исходниках.RU</title>
      <link>https://forum.sources.ru</link>
      <description>Форум на Исходниках.RU</description>
      <generator>Форум на Исходниках.RU</generator>
  	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808844</guid>
        <pubDate>Fri, 30 Aug 2019 18:36:15 +0000</pubDate>
        <title>Rust vs C++</title>
        <link>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808844</link>
        <description><![CDATA[Qraizer: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413186&view=findpost&p=3808694'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>OpenGL &#064; <time class="tag-quote__quoted-time" datetime="2019-08-29T22:09:28+03:00">29.08.19, 19:09</time></span><div class='quote '>Тогда как конкретно это делать?</div></div>Простейше? Тебе – и не только – вряд ли понравится: подменять можно лишь реализацию. Соответственно заголовки должны быть &quot;боевыми&quot;.]]></description>
        <author>Qraizer</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808843</guid>
        <pubDate>Fri, 30 Aug 2019 18:31:02 +0000</pubDate>
        <title>Rust vs C++</title>
        <link>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808843</link>
        <description><![CDATA[JoeUser: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413186&view=findpost&p=3808840'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>korvin &#064; <time class="tag-quote__quoted-time" datetime="2019-08-30T17:06:45+00:00">30.08.19, 17:06</time></span><div class='quote '>Например, что значит «не более одного мока на тест»?</div></div><br>
Зачем вырывать из контекста? Написано же &quot;... также <strong class='tag-b'><span class="tag-color tag-color-named" data-value="red" style="color: red">лучше</span></strong> использовать ...&quot;. Иными словами, если есть выбор. <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2019-08-30T18:34:09+00:00">30.08.19, 18:34</time></span></span><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413186&view=findpost&p=3808842'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Qraizer &#064; <time class="tag-quote__quoted-time" datetime="2019-08-30T18:30:23+00:00">30.08.19, 18:30</time></span><div class='quote '>Никакой мок (стаб0 не должен нарушать инварианты, описанные в документаци.</div></div><br>
Хм, а где в тексте ты узрел нарушение моками или стабами инвариантов, описанных в документации?  :blink:]]></description>
        <author>JoeUser</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808842</guid>
        <pubDate>Fri, 30 Aug 2019 18:30:23 +0000</pubDate>
        <title>Rust vs C++</title>
        <link>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808842</link>
        <description><![CDATA[Qraizer: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413186&view=findpost&p=3808826'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Wound &#064; <time class="tag-quote__quoted-time" datetime="2019-08-30T14:01:08+00:00">30.08.19, 14:01</time></span><div class='quote '>Я же и пишу, в итоге получится так, что тебе придется мокать вообще все.</div></div>Как бы да, на разве не в этом суть?<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413186&view=findpost&p=3808826'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Wound &#064; <time class="tag-quote__quoted-time" datetime="2019-08-30T14:01:08+00:00">30.08.19, 14:01</time></span><div class='quote '>а уже внутри из контекста - конструируются какие то типы, например с сервис локатора, или внутренней фабрики, либо на основе имеющихся данных, которые были получены путем других телодвижений.</div></div><br>
<strong class='tag-b'>JoeUser</strong>, ты привёл классные ссылки, но мимо. Никакой мок (стаб) не должен нарушать инварианты, описанные  в документаци.]]></description>
        <author>Qraizer</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808840</guid>
        <pubDate>Fri, 30 Aug 2019 17:06:45 +0000</pubDate>
        <title>Rust vs C++</title>
        <link>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808840</link>
        <description><![CDATA[korvin: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413186&view=findpost&p=3808834'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>JoeUser &#064; <time class="tag-quote__quoted-time" datetime="2019-08-30T15:53:03+00:00">30.08.19, 15:53</time></span><div class='quote '>Народ пишет про это:</div></div><br>
Народ немного странные вещи пишет. Например, что значит «не более одного мока на тест»? У тестируемого метода может быть больше одной внешней зависимости.<br>
<br>
Стабы используются в основном при функциональном тестировании, чтобы подменить внешние сторонние сервисы. В юнит-тестировании же стаб репозитория, например, вынужден будет реализовывать всю логику настоящего репозитория и может точно так же сломать тест, как и мок.]]></description>
        <author>korvin</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808834</guid>
        <pubDate>Fri, 30 Aug 2019 15:53:03 +0000</pubDate>
        <title>Rust vs C++</title>
        <link>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808834</link>
        <description><![CDATA[JoeUser: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413186&view=findpost&p=3808826'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Wound &#064; <time class="tag-quote__quoted-time" datetime="2019-08-30T14:01:08+00:00">30.08.19, 14:01</time></span><div class='quote '>Так а если для получения результата внутритого метода есть еще логика, со своими типами и классами? </div></div><br>
<strong class='tag-b'>Народ пишет про это:</strong><br>
<br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>Очень часто наш код (функция, модуль) имеют внешние зависимости. Внешняя зависимость — это все, что делает ваши тесты не правдивыми и сложно-поддерживаемыми. Файловая система — зависимость: структура каталогов может быть другой на другой машине. База данных — зависимость, ее может не быть на другой машине. Веб-сервис — зависимость: может не быть интернета или может присутствовать фаервол и.т.д<br>
<br>
Если на вопрос: «будет ли этот компонент вести себя так же на другой машине?» вы отвечаете нет, то его необходимо “подменить” и тут вам на помощь как раз придут стабы и моки. Но есть и другая сторона медали, когда разработчик начинает увлекаться и приходит к тому, что подменяет вообще все. Соответственно тесты перестают проверять само приложение и начинают тестировать стабы, моки. Это в корне не верно. Если «живых» реализаций в тесте нет, то этот тест не тестирует ничего.<br>
<br>
Иногда эти термины stubs и mock путают: разница в том, что стаб ничего не проверяет, а лишь имитирует заданное состояние. А мок — это объект, у которого есть ожидания. Например, что данный метод класса должен быть вызван определенное число раз. Иными словами, ваш тест никогда не сломается из-за «стаба», а вот из-за мока может.<br>
<br>
<img class='tag-img' src='https://i86.fastpic.ru/big/2019/0830/f3/c7dbcd8ba67ca9be5fdbdb3e11fe22f3.png' alt='user posted image'><br>
<br>
С технической точки зрения это значит, что, используя стабы, мы проверяем состояние тестируемого класса или результат выполненного метода. При использовании мока мы проверяем, соответствуют ли ожидания мока поведению тестируемого класса. Также лучше использовать не более одного мока на тест. Иначе с высокой вероятностью вы нарушите принцип «тестировать только одну вещь». При этом, в одном тесте может быть сколько угодно стабов или же мок и стабы.<br>
</div></div>]]></description>
        <author>JoeUser</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808831</guid>
        <pubDate>Fri, 30 Aug 2019 15:37:43 +0000</pubDate>
        <title>Rust vs C++</title>
        <link>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808831</link>
        <description><![CDATA[korvin: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413186&view=findpost&p=3808826'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Wound &#064; <time class="tag-quote__quoted-time" datetime="2019-08-30T14:01:08+00:00">30.08.19, 14:01</time></span><div class='quote '>Так а если для получения результата внутритого метода есть еще логика, со своими типами и классами? Их тоже замокать? Я же и пишу, в итоге получится так, что тебе придется мокать вообще все.</div></div><br>
Мокать нужно то, что инжектится как зависимость. Все внешние ресурсы (БД и т.п.) должны инжектиться или передаваться аргументами в метод, а следовательно мокаться.<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413186&view=findpost&p=3808826'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Wound &#064; <time class="tag-quote__quoted-time" datetime="2019-08-30T14:01:08+00:00">30.08.19, 14:01</time></span><div class='quote '>а уже внутри из контекста - конструируются какие то типы, например с сервис локатора</div></div><br>
Эти сервисы должны быть функциональными (т.е. получать внешние ресурсы в параметрах своих методов, а не хранить их в приватных полях), тогда их не нужно мокать, либо инжектиться и мокаться.]]></description>
        <author>korvin</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808826</guid>
        <pubDate>Fri, 30 Aug 2019 14:01:08 +0000</pubDate>
        <title>Rust vs C++</title>
        <link>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808826</link>
        <description><![CDATA[Wound: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413186&view=findpost&p=3808825'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>korvin &#064; <time class="tag-quote__quoted-time" datetime="2019-08-30T13:41:00+00:00">30.08.19, 13:41</time></span><div class='quote '>Вообще-то вместо вызова этого метода, ты должен был замокать UserAccountRepository или откуда там у тебя тестируемый метод данные берёт.</div></div><br>
Так а если для получения результата внутритого метода есть еще логика, со своими типами и классами? Их тоже замокать? Я же и пишу, в итоге получится так, что тебе придется мокать вообще все. Да и не всегда прокидывают интерфейсы в метод. Бывает есть у тебя метод какой нибудь, который принимает контекст, а уже внутри из контекста - конструируются какие то типы, например с сервис локатора, или внутренней фабрики, либо на основе имеющихся данных, которые были получены путем других телодвижений.]]></description>
        <author>Wound</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808825</guid>
        <pubDate>Fri, 30 Aug 2019 13:41:00 +0000</pubDate>
        <title>Rust vs C++</title>
        <link>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808825</link>
        <description><![CDATA[korvin: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413186&view=findpost&p=3808739'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Wound &#064; <time class="tag-quote__quoted-time" datetime="2019-08-30T07:27:42+00:00">30.08.19, 07:27</time></span><div class='quote '>Видишь там вызов метода CreateUserAccountPersonage ? Под ним как раз и подразумевалось что у тебя чтобы например что то переместить, нужно выполнить реальный метод, а не моковый.</div></div><br>
Вообще-то вместо вызова этого метода, ты должен был замокать UserAccountRepository или откуда там у тебя тестируемый метод данные берёт.]]></description>
        <author>korvin</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808739</guid>
        <pubDate>Fri, 30 Aug 2019 07:27:42 +0000</pubDate>
        <title>Rust vs C++</title>
        <link>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808739</link>
        <description><![CDATA[Wound: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413186&view=findpost&p=3808683'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>D_KEY &#064; <time class="tag-quote__quoted-time" datetime="2019-08-29T17:37:31+00:00">29.08.19, 17:37</time></span><div class='quote '>Но ты именно такой пример и приводил. У тебя было два интерфейса, но ты туда хотел подпихивать конкретные сущности.</div></div><br>
Не правда. Да у меня был пример с двумя интерфейсами, но упор я делал на то, что внутри метода, есть какой то вызываемый функционал, который ты не можешь съимиторовать через мок, вот мой пример:<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413186&view=findpost&p=3808495'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Wound &#064; <time class="tag-quote__quoted-time" datetime="2019-08-28T19:08:48+00:00">28.08.19, 19:08</time></span><div class='quote '>void testLinkToContainer()<br>
{<br>
    /*Тут, вместо new даже может быть Mock, который будет делать все тоже самое, кроме физического создания контейнера в системе, например как в примере создавать эксземпляр класса, напихивать в него данные, возвращать его, но не сохранять в системе*/<br>
    IContainer* pContainer = new COrgUnit(CN, DN, Location,...);<br>
 <br>
    /*Тут ровно тоже самое, создается либо через mock, либо напрямую нужный класс, забивается данными*/<br>
    IPrincipal* pPrincipal = new Personage(CN, DN, Location,...);<br>
 <br>
    //&#33; Допустим через интерфейс создаем юзер аккаунт, который нужен будет для линковки<br>
    pPrincipal-&gt;CreateUserAccountPersonage();<br>
 <br>
    EntityLinker* linker = new EntiryLinker(...);<br>
 <br>
    //&#33; Дальше тут какие то проверки, что все засетаплено честно.<br>
 <br>
    //&#33; Дальше собственно выполняем нашу линковку:<br>
    linker-&gt;LinkToContainer(pContainer, pPrincipal);<br>
 <br>
   /*Дальше идет тестирование результатов линковки*/<br>
}</div></div><br>
Видишь там вызов метода CreateUserAccountPersonage ? Под ним как раз и подразумевалось что у тебя чтобы например что то переместить, нужно выполнить реальный метод, а не моковый. Да, возможно я криво выразился, потому что не получается у меня сейчас сидеть думать как тебе написать чтоб ты понял, приходится в перерывах отвлекатся, но имелось ввиду то, что у тебя метод может содержать не просто какой то несвязанный функционал, а некую логику, которую ты не подсунешь в сам тестируемый метод. И дальше я тебе об этом писал:<br>
<div class="tag-spoiler spoiler closed"><div class="spoiler_header" onclick="openCloseParent(this)">Скрытый текст</div><div class="body"><div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413186&view=findpost&p=3808594'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Wound &#064; <time class="tag-quote__quoted-time" datetime="2019-08-29T10:36:17+00:00">29.08.19, 10:36</time></span><div class='quote '>Кого они проверяют? Я тебе говорю, что для какой то операции, необходимо вызвать какой то метод из этих классов явно/неявно.</div></div><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413186&view=findpost&p=3808594'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Wound &#064; <time class="tag-quote__quoted-time" datetime="2019-08-29T10:36:17+00:00">29.08.19, 10:36</time></span><div class='quote '>Могут, и чего? Я тебе пишу про то, что ты можешь в моке не учесть, какую то вещь, которая есть в используемом классе.<br>
Я не знаю, то о чем ты пишешь, больше напоминает тестирование несвязанного между собой функционала, например библиотечные функции какие нибудь. На практике же, довольно часто приходится работать с довольно связанными сущностями. </div></div><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413186&view=findpost&p=3808655'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Wound &#064; <time class="tag-quote__quoted-time" datetime="2019-08-29T12:47:36+00:00">29.08.19, 12:47</time></span><div class='quote '>У меня одна картина в голове стоит, у тебя вторая. Поэтому не понимаем друг друга. Ты мне пишешь про тестирование каких то несвязанных вещей, я напротив больше сталкивался с взаимосвязанными системами.<br>
Когда например у тебя один класс, инкапсулирует в себе кучу логики, которая инкапсулирует в себе другую кучу логики, которая инкапсулирует в себе еще какую то кучу логики. <br>
Я не знаю, может быть ты рассказываешь с философской точки зрения. Но хотел бы я посмотреть как ты все это тестировал бы.</div></div><br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413186&view=findpost&p=3808662'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Wound &#064; <time class="tag-quote__quoted-time" datetime="2019-08-29T13:30:15+00:00">29.08.19, 13:30</time></span><div class='quote '>Но когда речь идет о какой то хитрой логике(не все же методы возвращают сумму двух чисел или например константную строку), то тут тебе придется мочить все сущности, которые используются в тестируемом алгоритме, а если вдруг какая то сущность внутри получается из другой сущности, или просто живет там, конструируясь на каких то данных, то придется в придачу еще и переписывать всю систему, то тут уж, извиняйте, но я понять не могу.</div></div><br>
</div></div><br>
Ты же мне, рассказываешь как я понял какую то философию программирования.]]></description>
        <author>Wound</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808694</guid>
        <pubDate>Thu, 29 Aug 2019 19:09:28 +0000</pubDate>
        <title>Rust vs C++</title>
        <link>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808694</link>
        <description><![CDATA[OpenGL: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413186&view=findpost&p=3808684'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Qraizer &#064; <time class="tag-quote__quoted-time" datetime="2019-08-29T17:45:03+00:00">29.08.19, 17:45</time></span><div class='quote '>Если очень кратко, то да. Но вообще-то нет. Это как-то слишком искусственно и неудобно.</div></div><br>
Тогда как конкретно это делать?]]></description>
        <author>OpenGL</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808684</guid>
        <pubDate>Thu, 29 Aug 2019 17:45:03 +0000</pubDate>
        <title>Rust vs C++</title>
        <link>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808684</link>
        <description><![CDATA[Qraizer: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413186&view=findpost&p=3808678'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>OpenGL &#064; <time class="tag-quote__quoted-time" datetime="2019-08-29T16:46:40+00:00">29.08.19, 16:46</time></span><div class='quote '>И просто юзать в приложении &quot;официальный&quot; bar.cpp, а в тестах bar_mocked.cpp?</div></div>Если очень кратко, то да. Но вообще-то нет. Это как-то слишком искусственно и неудобно.]]></description>
        <author>Qraizer</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808683</guid>
        <pubDate>Thu, 29 Aug 2019 17:37:31 +0000</pubDate>
        <title>Rust vs C++</title>
        <link>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808683</link>
        <description><![CDATA[D_KEY: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413186&view=findpost&p=3808681'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Wound &#064; <time class="tag-quote__quoted-time" datetime="2019-08-29T16:59:18+00:00">29.08.19, 16:59</time></span><div class='quote '>А когда у тебя есть метод, который принимает два интерфейса, и использует исключительно только их - тогда конечно тут проблем не возникает.</div></div><br>
Но ты именно такой пример и приводил. У тебя было два интерфейса, но ты туда хотел подпихивать конкретные сущности.]]></description>
        <author>D_KEY</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808681</guid>
        <pubDate>Thu, 29 Aug 2019 16:59:18 +0000</pubDate>
        <title>Rust vs C++</title>
        <link>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808681</link>
        <description><![CDATA[Wound: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413186&view=findpost&p=3808673'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>D_KEY &#064; <time class="tag-quote__quoted-time" datetime="2019-08-29T16:05:18+00:00">29.08.19, 16:05</time></span><div class='quote '>Речь шла про внешние зависимости для класса, причем такие, которые уже через интерфейсы работают. Киля предлагает в тестах использовать конкретные классы системы, реализующие эти интерфейсы. Я предлагаю замокать.<br>
</div></div><br>
Эээ, про какие внешние зависимости? Речь шла про функционал. Я тебе пишу, что ты можешь встретить метод, который юзает другие сущности. Как это мокать, я не совсем понимаю. Придется просто сильно много мокать. А когда у тебя есть метод, который принимает два интерфейса, и использует исключительно только их - тогда конечно тут проблем не возникает.]]></description>
        <author>Wound</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808678</guid>
        <pubDate>Thu, 29 Aug 2019 16:46:40 +0000</pubDate>
        <title>Rust vs C++</title>
        <link>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808678</link>
        <description><![CDATA[OpenGL: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413186&view=findpost&p=3808675'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Qraizer &#064; <time class="tag-quote__quoted-time" datetime="2019-08-29T16:17:40+00:00">29.08.19, 16:17</time></span><div class='quote '>Можно даже не работать с сырцами при этом, достаточно готовых .jar или там .obj, которые вполне подходят для линковки с тестом. </div></div><br>
Я правильно понял, что ты предлагаешь что-то такое:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">// foo.h</div><div class="code_line">&nbsp;</div><div class="code_line">#include &quot;bar.h&quot;</div><div class="code_line">// Это тестируемый класс</div><div class="code_line">class Foo</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;Bar bar;</div><div class="code_line">};</div><div class="code_line">&nbsp;</div><div class="code_line">// bar.h</div><div class="code_line">class Bar</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;// Методы должны быть реализованы в cpp, т.е. шаблонный класс не катит</div><div class="code_line">&nbsp;&nbsp; &nbsp;void method();</div><div class="code_line">};</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script><br>
И просто юзать в приложении &quot;официальный&quot; bar.cpp, а в тестах bar_mocked.cpp?]]></description>
        <author>OpenGL</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808675</guid>
        <pubDate>Thu, 29 Aug 2019 16:17:40 +0000</pubDate>
        <title>Rust vs C++</title>
        <link>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808675</link>
        <description><![CDATA[Qraizer: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413186&view=findpost&p=3808663'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>korvin &#064; <time class="tag-quote__quoted-time" datetime="2019-08-29T13:55:57+00:00">29.08.19, 13:55</time></span><div class='quote '>Нет, не следует, метод может быть переопределён.</div></div>Если ты имеешь в виду &quot;перекрыт&quot;, подразумевая полиморфное поведение, то унаследованный метод вообще не при делах. Он либо просто исключается из логики поведения производного, либо на его наличие производный всё-таки рассчитывает, и тогда задача сводится к последующей. Которая вот она: если же ты подразумеваешь, что это новый метод, то у производного класса будет в итоге будет два метода... ну и ты уже понял: новый метод тестится новый тестом, унаследованный, как я и отметил ранее, покрыт гарантиями языка и своим, уже написанным, тестом.<br>
В любом случае, выбор между вариантами определяется бизнес-логикой и архитектурой, а не правилами &quot;как правильно тестировать&quot;. Следовательно тестировать унаследованные методы в тестах на производные классы не требуется, если так или иначе показан факт наличия этой родственной связи между классами. Если что-то где-то когда-то пойдёт не так на рефакторинге, какой-нибудь тест да упадёт, так что ложных пассов не будет. <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2019-08-29T16:36:12+00:00">29.08.19, 16:36</time></span></span><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413186&view=findpost&p=3808662'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Wound &#064; <time class="tag-quote__quoted-time" datetime="2019-08-29T13:30:15+00:00">29.08.19, 13:30</time></span><div class='quote '>Но когда речь идет о какой то хитрой логике(не все же методы возвращают сумму двух чисел или например константную строку), то тут тебе придется мочить все сущности, которые используются в тестируемом алгоритме, а если вдруг какая то сущность внутри получается из другой сущности, или просто живет там, конструируясь на каких то данных, то придется в придачу еще и переписывать всю систему, то тут уж, извиняйте, но я понять не могу.</div></div>Не придётся. Берётся минимально возможная единица декомпозиции, в Джаве это класс, например, на Сях/Плюсах единица трансляции, и вокруг него строится каркас их моков. Можно даже не работать с сырцами при этом, достаточно готовых .jar или там .obj, которые вполне подходят для линковки с тестом. Фактически тест и является приложением, а тестируемая сущность его небольшая составная часть, лишь бы она осталась неизменной по сравнению с продашновой. Один раз сделал такой каркас, что может занять не так уж мало времени, но технически реализуется несложно, и готов писать тесты на всё из этой единицы декомпозиции уже без ресурсозатрат. Для другой единицы декомпозиции основной каркас уже есть, нужно лишь исключить её моки и добавить ещё комплект, стабирующий вон ту, с предыдущего этапа. С этого момента у тебя есть всё для всего.<br>
Заметь, на этапе компонентного тестирования от тестового окружения не требуется каких-либо релеваций с описанным в документации поведением системы. Нужны экземпляры тестируемых классов – ну и создавай их как тебе удобно. Нужны внешние связи, пиши простейшие стабы, откликающиеся на них удобным тебе образом. Из документации на ПО требуется только описательная часть интерфейсов и архитектуры. Из поведения не требуется ничего. Естественно кроме того самого маленького фрагмента, который собственно тестируется. То, что ты описываешь в своих примерах, это уже другой уровень тестирования. Возможно интеграционный, на котором (если, конечно, тестами низкого уровня действительно показана корректность реализации каждого элемента декомпозиции) заостряться на поведении каждой сущности просто уже нет необходимости, достаточно ограничиться лишь их связями по данным и управлению.]]></description>
        <author>Qraizer</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808674</guid>
        <pubDate>Thu, 29 Aug 2019 16:12:31 +0000</pubDate>
        <title>Rust vs C++</title>
        <link>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808674</link>
        <description><![CDATA[OpenGL: А, не, если там уже интерфейс, то лучше замокать, естественно. Причём если тесты нужны побыстрее и ещё вчера, можно поначалу за ним вообще реальный объект спрятать  :D]]></description>
        <author>OpenGL</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808673</guid>
        <pubDate>Thu, 29 Aug 2019 16:05:18 +0000</pubDate>
        <title>Rust vs C++</title>
        <link>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808673</link>
        <description><![CDATA[D_KEY: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413186&view=findpost&p=3808672'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>OpenGL &#064; <time class="tag-quote__quoted-time" datetime="2019-08-29T15:58:44+00:00">29.08.19, 15:58</time></span><div class='quote '>Да любой контейнер со своими итераторами</div></div><br>
Ну я не уверен, что стал бы тестить отдельно. Это же не внешняя зависимость для контейнера. <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2019-08-29T16:07:15+00:00">29.08.19, 16:07</time></span></span><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413186&view=findpost&p=3808672'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>OpenGL &#064; <time class="tag-quote__quoted-time" datetime="2019-08-29T15:58:44+00:00">29.08.19, 15:58</time></span><div class='quote '>Так что по факту и контейнер, и эта сущность, и все типы итераторов это один-единственный класс, и поэтому тестировать их отдельно друг от друга это, фактически, совмещение неприятного с бесполезным.</div></div><br>
Тогда и не надо так делать :-? <br>
<br>
Речь шла про внешние зависимости для класса, причем такие, которые уже через интерфейсы работают. Киля предлагает в тестах использовать конкретные классы системы, реализующие эти интерфейсы. Я предлагаю замокать. <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2019-08-29T16:12:14+00:00">29.08.19, 16:12</time></span></span><br>
<strong class='tag-b'>OpenGL</strong>, вот если бы у тебя был какой-то Iterator, который мог бы работать с любыем IContainer, то я бы в тестах Iterator&#39;а замокал IContainer, а не тащил бы какую-то из его реализаций в тест.]]></description>
        <author>D_KEY</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808672</guid>
        <pubDate>Thu, 29 Aug 2019 15:58:44 +0000</pubDate>
        <title>Rust vs C++</title>
        <link>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808672</link>
        <description><![CDATA[OpenGL: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413186&view=findpost&p=3808670'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>D_KEY &#064; <time class="tag-quote__quoted-time" datetime="2019-08-29T15:40:17+00:00">29.08.19, 15:40</time></span><div class='quote '>А ты сможешь привести пример?</div></div><br>
Пример чего? Связанных сущностей? Да любой контейнер со своими итераторами, в общем-то - если это не тупо вектор, а какая-либо более-менее нетривиальная структура данных, то с большой вероятностью они друг с другом будут связанными.  Недавно вообще вот такое писал:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">for(auto x : my_container.indexer().set_param_1().set_param_2()){}</div></ol></div></div></div></div><br>
Т.е. чтобы можно было настраивать итерирование по этому контейнеру. Сущность, возвращаемая методом indexer() оказывается тоже сильно связанной с контейнером, как и итераторы. У меня вообще получилось, что она является friend-ом для него. Так что по факту и контейнер, и эта сущность, и все типы итераторов это один-единственный класс, и поэтому тестировать их отдельно друг от друга это, фактически, совмещение неприятного с бесполезным.]]></description>
        <author>OpenGL</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808670</guid>
        <pubDate>Thu, 29 Aug 2019 15:40:17 +0000</pubDate>
        <title>Rust vs C++</title>
        <link>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808670</link>
        <description><![CDATA[D_KEY: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413186&view=findpost&p=3808662'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Wound &#064; <time class="tag-quote__quoted-time" datetime="2019-08-29T13:30:15+00:00">29.08.19, 13:30</time></span><div class='quote '>Но когда речь идет о какой то хитрой логике(не все же методы возвращают сумму двух чисел или например константную строку), то тут тебе придется  мочить все сущности, которые используются в тестируемом алгоритме, а если вдруг какая то сущность внутри получается из другой сущности, или просто живет там, конструируясь на каких то данных, то придется в придачу еще и переписывать всю систему, то тут уж, извиняйте, но я понять не могу.</div></div><br>
А можешь привести такой пример? Было бы интересно рассмотреть. <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2019-08-29T15:41:18+00:00">29.08.19, 15:41</time></span></span><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413186&view=findpost&p=3808669'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>OpenGL &#064; <time class="tag-quote__quoted-time" datetime="2019-08-29T15:30:38+00:00">29.08.19, 15:30</time></span><div class='quote '>А то я тоже слабо представляю, что делать, если сущности оказываются сильно связанными.</div></div><br>
А ты сможешь привести пример?]]></description>
        <author>D_KEY</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808669</guid>
        <pubDate>Thu, 29 Aug 2019 15:30:38 +0000</pubDate>
        <title>Rust vs C++</title>
        <link>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808669</link>
        <description><![CDATA[OpenGL: Вклинюсь тут. А никто не поделится ссылкой на какой-нибудь более-менее крупный проект (желательно на плюсах), где тестирование делается как раз вот так, как тут описано - с активным mock-анием всего кроме тестируемой сущности? А то я тоже слабо представляю, что делать, если сущности оказываются сильно связанными.]]></description>
        <author>OpenGL</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808663</guid>
        <pubDate>Thu, 29 Aug 2019 13:55:57 +0000</pubDate>
        <title>Rust vs C++</title>
        <link>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808663</link>
        <description><![CDATA[korvin: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413186&view=findpost&p=3808648'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Qraizer &#064; <time class="tag-quote__quoted-time" datetime="2019-08-29T11:51:16+00:00">29.08.19, 11:51</time></span><div class='quote '>Ещё одно хорошее &quot;зачем&quot;: разве не достаточно тестом показать факт наследования тестируемого класса от интересующего нас базового? Разве не следует из гарантий языка программирования заранее известный (однозначно предсказываемый) итог запуска тестов на наследуемых методах?</div></div><br>
Нет, не следует, метод может быть переопределён.]]></description>
        <author>korvin</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808662</guid>
        <pubDate>Thu, 29 Aug 2019 13:30:15 +0000</pubDate>
        <title>Rust vs C++</title>
        <link>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808662</link>
        <description><![CDATA[Wound: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413186&view=findpost&p=3808661'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Qraizer &#064; <time class="tag-quote__quoted-time" datetime="2019-08-29T13:13:04+00:00">29.08.19, 13:13</time></span><div class='quote '>Нет, он тебе рассказывает о технологии тестирования связанных систем по отдельности. Элементарнейший пример – функция вызывает функцию с параметрами: ты можешь написать отдельный тест на вызываемую функцию, которую прочекаешь по полной программе, по всем диапазонам классов эквивалентности всех её входов, не исключая параметры, и убедишься, что она ведёт себя полностью в рамках её модели поведения, описываемой документацией; затем ты пишешь другой тест, на этот раз на вызывающую функцию, соблюдая те же принципы и опираясь на её модель поведения. При создании второго теста ты вполне имеешь право застабить вызываемую, и пусть она ведёт себя не по её задокументированной модели, это уже неважно. Важно, что её поведение тесту известно, и его не надо тестировать, ведь по сути она его составная часть, и это поведение значительно проще, и им можно легко управлять из теста. При этом достаточно лишь прочекать, что вызывающая (тестируемая на данном этапе) функция правильно выставляет входы для мока и правильно потребляет результаты её работы.</div></div><br>
Ну когда речь идет об элементарнейших вещах, я это могу понять. Но когда речь идет о какой то хитрой логике(не все же методы возвращают сумму двух чисел или например константную строку), то тут тебе придется  мочить все сущности, которые используются в тестируемом алгоритме, а если вдруг какая то сущность внутри получается из другой сущности, или просто живет там, конструируясь на каких то данных, то придется в придачу еще и переписывать всю систему, то тут уж, извиняйте, но я понять не могу. Если речь идет о какой то философии совершенного кода - ну тогда так и говорите. Я как бы исхожу из реальности, а не из каких то там аксиом и теоретических совершенностях.]]></description>
        <author>Wound</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808661</guid>
        <pubDate>Thu, 29 Aug 2019 13:13:04 +0000</pubDate>
        <title>Rust vs C++</title>
        <link>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808661</link>
        <description><![CDATA[Qraizer: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413186&view=findpost&p=3808655'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Wound &#064; <time class="tag-quote__quoted-time" datetime="2019-08-29T12:47:36+00:00">29.08.19, 12:47</time></span><div class='quote '>Ты мне пишешь про тестирование каких то несвязанных вещей, я напротив больше сталкивался с взаимосвязанными системами.</div></div>Нет, он тебе рассказывает о технологии тестирования связанных систем по отдельности.<br>
Элементарнейший пример – функция вызывает функцию с параметрами: ты можешь написать отдельный тест на вызываемую функцию, которую прочекаешь по полной программе, по всем диапазонам классов эквивалентности всех её входов, не исключая параметры, и убедишься, что она ведёт себя полностью в рамках её модели поведения, описываемой документацией; затем ты пишешь другой тест, на этот раз на вызывающую функцию, соблюдая те же принципы и опираясь на её модель поведения.<br>
При создании второго теста ты вполне имеешь право застабить вызываемую, и пусть она ведёт себя не по её задокументированной модели, это уже неважно. Важно, что её поведение тесту известно, и его не надо тестировать, ведь по сути она его составная часть, и это поведение значительно проще, и им можно легко управлять из теста. При этом вместо того, чтобы учитывать модель поведения вызываемой функции, этому тесту достаточно лишь прочекать, что вызывающая (тестируемая на данном этапе) функция правильно выставляет входы для мока и правильно потребляет результаты его работы.<br>
Т.к. предыдущий тест чекает модель замоканой функции на любой общий случай, способы взаимодействия вызывающей с исходной вызываемой будут лишь какими-то частными их случаями, покрываемыми предыдущим тестом, и на основании результатов этих двух тестов можно сделать экспертный вывод о корректности связки обоих функций. Если экспертного вывода по какой-то причине недостаточно, такое редко, но бывает, то взаимодействие этих двух функций может быть покрыто третьим тестом, но его сферой ответственности будет лишь потоки данных и управления, но не модели управления целиком.]]></description>
        <author>Qraizer</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808655</guid>
        <pubDate>Thu, 29 Aug 2019 12:47:36 +0000</pubDate>
        <title>Rust vs C++</title>
        <link>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808655</link>
        <description><![CDATA[Wound: <strong class='tag-b'>D_KEY</strong>, мне кажется мы о разном говорим.<br>
У меня одна картина в голове стоит, у тебя вторая. Поэтому не понимаем друг друга. Ты мне пишешь про тестирование каких то несвязанных вещей, я напротив больше сталкивался с взаимосвязанными системами.<br>
Когда например у тебя один класс, инкапсулирует в себе кучу логики, которая инкапсулирует в себе другую кучу логики, которая инкапсулирует в себе еще какую то кучу логики. <br>
Я не знаю, может быть ты рассказываешь с философской точки зрения. Но хотел бы я посмотреть как ты все это тестировал бы.<br>
<br>
Например была такая система на позапрошлой работе, сервер Unix, клиент Windows. Есть продукт со своей логикой, к этой логике вешается требование, что клиент не зависит от версии сервера в принципе. Ну и архитектор налабал там систему классов по примеру Java Beans, т.е. чтоб написать одну сущность, тебе нужно сразу писать 4-5 классов. 1 класс - интерфейс, 2 класс - имплементация, 3 класс - фабрика, 4 класс - хендл, который в себе все это скрывает через 5 класс прокси объект. Все это завязано на каком то жестком контексте, который я разгребал пол года, чтобы понять из чего он состоит. Просто тупо целая куча самых разный мелких типов, персистентные объекты, какие то там еще объекты, это все еще обернуто впридачу высокоуровневыми шаблонами, десятиэтажное наследование. Ты пишешь какой нибудь класс WorkstationRedirection, который оперирует не вот этими классами A и B, а целыми объектами, потому что по другому ты не протестируешь, на все это есть ЮТ. Вот я бы посмотрел сколько бы ты писал свои моки для одного ЮТ, когда тебе нужно протестировать логику перемещения спесимена из одной рабочей станции на другую, где чтобы съимитировать объекты на моках, пришлось бы городить хренову тучу кода и тратить примерно столько же времени, сколько на разработку самого функционала. И моки там были, только нужны они были для замены сервера/клиента/БД/файлвой системы/ит.д. не более.<br>
<br>
А ты мне рассказываешь про какую то философию программирования.]]></description>
        <author>Wound</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808648</guid>
        <pubDate>Thu, 29 Aug 2019 11:51:16 +0000</pubDate>
        <title>Rust vs C++</title>
        <link>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808648</link>
        <description><![CDATA[Qraizer: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413186&view=findpost&p=3808519'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>korvin &#064; <time class="tag-quote__quoted-time" datetime="2019-08-28T21:45:10+00:00">28.08.19, 21:45</time></span><div class='quote '>Да, я, видимо, неточно выразился. Я имел в виду, что для класса нужно прогонять не только тесты для его собственных методов, но и тесты для всех методов, унаследованных от родительских классов.</div></div>Ещё одно хорошее &quot;зачем&quot;: разве не достаточно тестом показать факт наследования тестируемого класса от интересующего нас базового? Разве не следует из гарантий языка программирования заранее известный (однозначно предсказываемый) итог запуска тестов на наследуемых методах?]]></description>
        <author>Qraizer</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808633</guid>
        <pubDate>Thu, 29 Aug 2019 11:15:36 +0000</pubDate>
        <title>Rust vs C++</title>
        <link>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808633</link>
        <description><![CDATA[D_KEY: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413186&view=findpost&p=3808594'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Wound &#064; <time class="tag-quote__quoted-time" datetime="2019-08-29T10:36:17+00:00">29.08.19, 10:36</time></span><div class='quote '>Я тебе говорю, что для какой то операции, необходимо вызвать какой то метод из этих классов явно/неявно.</div></div><br>
В линковщике? Ну ты же их через интерфейс используешь? Вот и замокай его в тесте линковщика. В чем проблема?<br>
<br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>Почему бы не использовать конкретные объекты, вместо моков?</div></div><br>
Потому, что тест линковщика, который использует интерфейсы, а не конкретные объекты, не должен иметь зависимость от конкретных реализаций интерфейсов. Ему это не нужно.<br>
<br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>Ты на все зависимые сущности моки пишешь?</div></div><br>
Если работа идет через интерфейсы, то да. Не могу вспомнить контрпример.<br>
<br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>Не всей системы, а только той части, которая тестируется.</div></div><br>
Так тестируется только конкретный модуль. И ничего больше. Мы же о ЮТ говорим.<br>
<br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>Я тебе пишу про то, что ты можешь в моке не учесть, какую то вещь, которая есть в используемом классе.</div></div><br>
Так у тебя этих конкретных классов может быть 100500. У них свои тесты есть. Понимаешь?<br>
<br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>На практике же, довольно часто приходится работать с довольно связанными сущностями. </div></div><br>
Это хреновая декомпозиция системы. Я тебя не зря спросил про IoC. Хотя лучше про dependency inversion principle сказать.<br>
<br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>Так все верно. У тебя есть три модуля, первый это Пользовател, второй Контейнер, трейти Линковщик.</div></div><br>
Может другой пример?]]></description>
        <author>D_KEY</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808594</guid>
        <pubDate>Thu, 29 Aug 2019 10:36:17 +0000</pubDate>
        <title>Rust vs C++</title>
        <link>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808594</link>
        <description><![CDATA[Wound: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413186&view=findpost&p=3808566'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>D_KEY &#064; <time class="tag-quote__quoted-time" datetime="2019-08-29T08:08:27+00:00">29.08.19, 08:08</time></span><div class='quote '>Почему не будет-то? У них есть свои тесты, они проверяют. Ты похоже не понимаешь, что такое ЮТ.</div></div><br>
Кого они проверяют? Я тебе говорю, что для какой то операции, необходимо вызвать какой то метод из этих классов явно/неявно.<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413186&view=findpost&p=3808566'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>D_KEY &#064; <time class="tag-quote__quoted-time" datetime="2019-08-29T08:08:27+00:00">29.08.19, 08:08</time></span><div class='quote '>Вот есть у тебя класс. Он использует какие-то объекты через интерфейсы.<br>
Зачем в его тесте использовать какие-то конкретные объекты, а не моки? Тем более, что их вообще может не быть у тебя(например, клиент предоставляет) или они на другом уровне системы.<br>
</div></div><br>
Смотря какие объекты в нем используются. Почему бы не использовать конкретные объекты, вместо моков? Ты на все зависимые сущности моки пишешь?<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413186&view=findpost&p=3808566'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>D_KEY &#064; <time class="tag-quote__quoted-time" datetime="2019-08-29T08:08:27+00:00">29.08.19, 08:08</time></span><div class='quote '>ЮТ и не должны(да и не могут) учитывать поведение всей системы, для этого есть другие тесты.</div></div><br>
Не всей системы, а только той части, которая тестируется.<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413186&view=findpost&p=3808566'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>D_KEY &#064; <time class="tag-quote__quoted-time" datetime="2019-08-29T08:08:27+00:00">29.08.19, 08:08</time></span><div class='quote '>Моки могут быть довольно сложными.</div></div><br>
Могут, и чего? Я тебе пишу про то, что ты можешь в моке не учесть, какую то вещь, которая есть в используемом классе.<br>
<br>
Я не знаю, то о чем ты пишешь, больше напоминает тестирование несвязанного между собой функционала, например библиотечные функции какие нибудь. На практике же, довольно часто приходится работать с довольно связанными сущностями. <br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413186&view=findpost&p=3808566'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>D_KEY &#064; <time class="tag-quote__quoted-time" datetime="2019-08-29T08:08:27+00:00">29.08.19, 08:08</time></span><div class='quote '>Этот модуль.</div></div><br>
А функционал работы/взаимодействия, не?<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413186&view=findpost&p=3808566'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>D_KEY &#064; <time class="tag-quote__quoted-time" datetime="2019-08-29T08:08:27+00:00">29.08.19, 08:08</time></span><div class='quote '>ЮТ и не должны этим заниматься. Они проверяют работу конкретных модулей. Потому они так и называются, внезапно.<br>
</div></div><br>
Так все верно. У тебя есть три модуля, первый это Пользовател, второй Контейнер, трейти Линковщик. И буду у тебя три модульных теста. Первый у тебя протестирует пользователя, второй Контейнер, а третий Линковку пользователя и контейнера. В итоге ты протестировал функционал своей системы. Я лично понимаю это так.]]></description>
        <author>Wound</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808569</guid>
        <pubDate>Thu, 29 Aug 2019 08:33:31 +0000</pubDate>
        <title>Rust vs C++</title>
        <link>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808569</link>
        <description><![CDATA[Астарот: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413186&view=findpost&p=3808566'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>D_KEY &#064; <time class="tag-quote__quoted-time" datetime="2019-08-29T08:08:27+00:00">29.08.19, 08:08</time></span><div class='quote '><br>
Давай какой-то пример рассмотрим? Я покажу на нем. </div></div><br>
- У вас есть книги по садомазохизму?<br>
- Да.<br>
- Бросьте мне одну в лицо&#33;<br>
 :facepalm:]]></description>
        <author>Астарот</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808566</guid>
        <pubDate>Thu, 29 Aug 2019 08:08:27 +0000</pubDate>
        <title>Rust vs C++</title>
        <link>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808566</link>
        <description><![CDATA[D_KEY: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413186&view=findpost&p=3808558'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Wound &#064; <time class="tag-quote__quoted-time" datetime="2019-08-29T07:33:21+00:00">29.08.19, 07:33</time></span><div class='quote '>Ну напишешь ты - у тебя с моком будет работать, а в каком нибудь CUser/COrgUnit не будет работать</div></div><br>
Почему не будет-то? У них есть свои тесты, они проверяют. Ты похоже не понимаешь, что такое ЮТ.<br>
<br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>что писать паралельно какие то моки на все подряд - это излишняя, бесполезная работа?<br>
</div></div><br>
Не понимаю, о чем ты.<br>
Вот есть у тебя класс. Он использует какие-то объекты через интерфейсы.<br>
Зачем в его тесте использовать какие-то конкретные объекты, а не моки? Тем более, что их вообще может не быть у тебя(например, клиент предоставляет) или они на другом уровне системы.<br>
<br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>Я если честно вот вообще не понимаю, что ты мне рассказываешь. </div></div><br>
Взаимно.<br>
<br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>У тебя получается что я тестирую исключительно то, что написано в методе, не учитывая совершенно поведение системы в целом</div></div><br>
ЮТ и не должны(да и не могут) учитывать поведение всей системы, для этого есть другие тесты.<br>
<br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>Т.е. у меня ожидаются два каких то класса на входе, с двумя каким то методами, которые нужно вызвать, я беру мочу эти два класса у тебя в ЮТ, делая их методы пустыми, ну или возвращающими константы, и потом эти классы передаю в функцию тестирования функционала</div></div><br>
Моки могут быть довольно сложными.<br>
<br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>У меня оно как то отрабатывает, но в итоге, что я протестил то? </div></div><br>
Этот модуль.<br>
<br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>А потом в проде, у тебя хренак, и поплыли баги со всех щелей, потому что у тебя тесты и близко не имитируют то, как работает программа.</div></div><br>
ЮТ и не должны этим заниматься. Они проверяют работу конкретных модулей. Потому они так и называются, внезапно.<br>
<br>
Давай какой-то пример рассмотрим? Я покажу на нем.]]></description>
        <author>D_KEY</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808558</guid>
        <pubDate>Thu, 29 Aug 2019 07:33:21 +0000</pubDate>
        <title>Rust vs C++</title>
        <link>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808558</link>
        <description><![CDATA[Wound: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413186&view=findpost&p=3808543'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>D_KEY &#064; <time class="tag-quote__quoted-time" datetime="2019-08-29T06:30:02+00:00">29.08.19, 06:30</time></span><div class='quote '>Работу линкера, это же его ЮТ. </div></div><br>
Та ка нахрен мне тестировать его в отрыве от сущностей, которыми он манипулирует? Ты ж собрался мок наследовать от IContainer/IPrincipal и писать там свой функционал паралельно. Ну напишешь ты - у тебя с моком будет работать, а в каком нибудь CUser/COrgUnit не будет работать, потому что из класса выше, кто то по ошибке убрал твой override. И все, приплыли? Да и тебе не кажется, что писать паралельно какие то моки на все подряд - это излишняя, бесполезная работа?<br>
Я все равно не понимаю зачем так делать  :-?  Никогда такого не видел, ни в С++, ни в C#, ни где то еще.<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413186&view=findpost&p=3808543'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>D_KEY &#064; <time class="tag-quote__quoted-time" datetime="2019-08-29T06:30:02+00:00">29.08.19, 06:30</time></span><div class='quote '>Их будут использовать через интерфейсы. И те, кто их использует, ничего о них не знает, потому в тестах нет никакого смысла использовать эти конкретные реализации. У них есть свои ЮТ, которые проверяют корректность их работы. </div></div><br>
Так ты же выше написал что в ЮТ тоже будешь юзать интерфейсы, тогда какие проблемы? Я если честно вот вообще не понимаю, что ты мне рассказываешь. <br>
<br>
У тебя получается что я тестирую исключительно то, что написано в методе, не учитывая совершенно поведение системы в целом. Т.е. у меня ожидаются два каких то класса на входе, с двумя каким то методами, которые нужно вызвать, я беру мочу эти два класса у тебя в ЮТ, делая их методы пустыми, ну или возвращающими константы, и потом эти классы передаю в функцию тестирования функционала. У меня оно как то отрабатывает, но в итоге, что я протестил то?  :D  Что 2 + 2 = 4 ? Не, ну круто, че. А потом в проде, у тебя хренак, и поплыли баги со всех щелей, потому что у тебя тесты и близко не имитируют то, как работает программа.<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413186&view=findpost&p=3808543'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>D_KEY &#064; <time class="tag-quote__quoted-time" datetime="2019-08-29T06:30:02+00:00">29.08.19, 06:30</time></span><div class='quote '>Wound, видел я такие ЮТ, какие ты хочешь, которые пол системы поднимают для тестов одного модуля  </div></div><br>
В смысле пол системы? Поднимаетя ровно то, что нужно для тестирования функционала. Что то тяжелое, громоздкое, не нужное, и нужное например только как константы - мочится. <br>
В целом все тесты у тебя тестируют разные части твоей системы, проходя в идеале все сценарии, на которые расчитана программа, с приближенными на сколько это возможно к реальности данными.<br>
<br>
Используя моки ты как раз отдаляешься от реальности, но в конкретном случае, этой реальностью можно пренебречь, поэтому ты и будешь юзать вот тут мок.]]></description>
        <author>Wound</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808550</guid>
        <pubDate>Thu, 29 Aug 2019 07:15:03 +0000</pubDate>
        <title>Rust vs C++</title>
        <link>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808550</link>
        <description><![CDATA[Астарот: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413186&view=findpost&p=3808523'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>korvin &#064; <time class="tag-quote__quoted-time" datetime="2019-08-28T23:12:27+00:00">28.08.19, 23:12</time></span><div class='quote '>Я ж уже писал, что Java&#39;вские IDE и так прекрасно показывают, что метод пререопределяет родительский, без аннотации @Override. Точно также IDE это видит и при рефакторинге, если тебе хочется, чтобы она это учитывала. Так зачем явно писать override? </div></div><br>
То, что видит IDE - это фактическое состояние дел, а писать @Override  явно - это декларация твоих намерений. Слегка разные назначения, как мне кажется.]]></description>
        <author>Астарот</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808543</guid>
        <pubDate>Thu, 29 Aug 2019 06:30:02 +0000</pubDate>
        <title>Rust vs C++</title>
        <link>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808543</link>
        <description><![CDATA[D_KEY: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413186&view=findpost&p=3808542'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Wound &#064; <time class="tag-quote__quoted-time" datetime="2019-08-29T06:27:19+00:00">29.08.19, 06:27</time></span><div class='quote '><div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413186&view=findpost&p=3808539'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>D_KEY &#064; <time class="tag-quote__quoted-time" datetime="2019-08-29T06:16:55+00:00">29.08.19, 06:16</time></span><div class='quote '>Ну допустим твой линкер должен дёрнуть такой-то метод одного интерфейса и такой-то другого. Ты создаешь мок-реализации интерфейсов и проверяешь, что эти вызовы были сделаны нужное число раз и с заданными параметрами. </div></div><br>
А тестирую я что? Что у меня будет в Expected и Actual ? Количество вызовов? Тогда я не совсем понимаю, что я тестирую.</div></div><br>
Работу линкера, это же его ЮТ. <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2019-08-29T06:33:32+00:00">29.08.19, 06:33</time></span></span><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413186&view=findpost&p=3808540'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Wound &#064; <time class="tag-quote__quoted-time" datetime="2019-08-29T06:24:42+00:00">29.08.19, 06:24</time></span><div class='quote '>Ты их будешь как то использовать? Скорее будешь. Вот и напишешь соответствующие ЮТ на их использование.</div></div><br>
Их будут использовать через интерфейсы. И те, кто их использует, ничего о них не знает, потому в тестах нет никакого смысла использовать эти конкретные реализации. У них есть свои ЮТ, которые проверяют корректность их работы. <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2019-08-29T06:34:32+00:00">29.08.19, 06:34</time></span></span><br>
<strong class='tag-b'>Wound</strong>, видел я такие ЮТ, какие ты хочешь, которые пол системы поднимают для тестов одного модуля :crazy: <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2019-08-29T06:34:54+00:00">29.08.19, 06:34</time></span></span><br>
Или я тебя не понял.<br>
<br>
Давай другой пример рассмотрим. <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2019-08-29T06:38:46+00:00">29.08.19, 06:38</time></span></span><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413186&view=findpost&p=3808523'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>korvin &#064; <time class="tag-quote__quoted-time" datetime="2019-08-28T23:12:27+00:00">28.08.19, 23:12</time></span><div class='quote '>Если их убрать, то в чём пример? Приведи пример кода без тестов.</div></div><br>
Так просто убери их и все. Пример был просто про то, что без override у тебя компиляция молча пройдет, поскольку в наследнике просто появится новый метод с точки зрения языка. С override же ты явно пишешь, что вот этот метод должен был быть перекрыт, соответственно у компилятора появляется возможность указать тебе, что ничего ты не перекрываешь и тут, вероятно, ошибка. Еще на стадии компиляции, не доходя до тестов и рантайма. <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2019-08-29T06:48:29+00:00">29.08.19, 06:48</time></span></span><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413186&view=findpost&p=3808525'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>korvin &#064; <time class="tag-quote__quoted-time" datetime="2019-08-29T00:11:04+00:00">29.08.19, 00:11</time></span><div class='quote '><strong class='tag-b'>D_KEY</strong>, вот смотри</div></div><br>
Да, можно написать тесты, которые это отловят, но не факт, что именно такие тесты были написаны. И не факт, что ты можешь написать такой обобщенный тест в случае конкретного метода (в данном случае ты смог вычислить нужное значение в тесте, а если бы там не было привязки к типу?)<br>
Т.е. может быть ситуация, когда контракт базового класса или интерфейса не накладывает строгих ограничений на значение, но это не мешает написать тест на этот метод для каждой конкретной реализации, если ты знаешь, как он должен формироваться. И даже если ты не станешь это тестить, то от проблемы никак не уйдешь.<br>
Кроме того, с override ты это отловишь на этапе компиляции. Мне казалось, что ты всегда за это. Кроме того, ты смешиваешь в одну кучу язык, тесты, IDE и процессы :) <br>
Написать override там, где ты хотел перекрыть метод - очень просто. Как и отследить это при ревью кода.]]></description>
        <author>D_KEY</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808542</guid>
        <pubDate>Thu, 29 Aug 2019 06:27:19 +0000</pubDate>
        <title>Rust vs C++</title>
        <link>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808542</link>
        <description><![CDATA[Wound: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413186&view=findpost&p=3808539'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>D_KEY &#064; <time class="tag-quote__quoted-time" datetime="2019-08-29T06:16:55+00:00">29.08.19, 06:16</time></span><div class='quote '>Ну допустим твой линкер должен дёрнуть такой-то метод одного интерфейса и такой-то другого. Ты создаешь мок-реализации интерфейсов и проверяешь, что эти вызовы были сделаны нужное число раз и с заданными параметрами. </div></div><br>
А тестирую я что? Что у меня будет в Expected и Actual ? Количество вызовов? Тогда я не совсем понимаю, что я тестирую.]]></description>
        <author>Wound</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808541</guid>
        <pubDate>Thu, 29 Aug 2019 06:26:52 +0000</pubDate>
        <title>Rust vs C++</title>
        <link>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808541</link>
        <description><![CDATA[D_KEY: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413186&view=findpost&p=3808523'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>korvin &#064; <time class="tag-quote__quoted-time" datetime="2019-08-28T23:12:27+00:00">28.08.19, 23:12</time></span><div class='quote '>Дерьмовые классы, нарушающие LSP. Или дерьмовая спецификация (а значит и тесты), не учитывающие эту динамику.</div></div><br>
Ты предлагаешь не тестить конкретные реализации? Ещё раз, вот иерархия ошибок. Метод string message(). Он должен возвращать у всех классов в иерархии одно и то же? :crazy: <br>
Почему это нарушение контакта? Или ты предлагаешь не тестить конкретные реализации? Почему?]]></description>
        <author>D_KEY</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808540</guid>
        <pubDate>Thu, 29 Aug 2019 06:24:42 +0000</pubDate>
        <title>Rust vs C++</title>
        <link>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808540</link>
        <description><![CDATA[Wound: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413186&view=findpost&p=3808539'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>D_KEY &#064; <time class="tag-quote__quoted-time" datetime="2019-08-29T06:16:55+00:00">29.08.19, 06:16</time></span><div class='quote '>В ЮТ ты проверяешь работу своего модуля, а не всего подряд.</div></div><br>
Конечно. Я так понял классы эти - А и B ты написал, и на этом работа с ними закончена? Ты их будешь как то использовать? Скорее будешь. Вот и напишешь соответствующие ЮТ на их использование. Это уже будет тестирование другого модуля, которые в идеале и должен выявить ошибку в твоем рефакторинге.<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413186&view=findpost&p=3808539'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>D_KEY &#064; <time class="tag-quote__quoted-time" datetime="2019-08-29T06:16:55+00:00">29.08.19, 06:16</time></span><div class='quote '>Так оно и будет протестировано. Для каждой реализации будет свой ЮТ.<br>
Зачем тестить все реализации в тесте линкера? Он же работает через интерфейсы. В его ЮТ нужно тестить его работу. </div></div><br>
Ну потому что у тебя есть разные сущности. Например ты протестировал связь CUser с OrgUnit, а связь OrgUnit с OrgUnit не будет выполнятся, потому как для нее нужно сделать больше телодвижений. Ок, возьми не Link, может там эта не совсем очевидно. Возьми например перемещение. <br>
Можно перемещать как User, так и OrgUnit в другой OrgUnit, но разница в работе будет очевидна. Когда ты перемещаешь User - тебе нужно просто взять его и переместить, а когда перемещаешь OrgUnit то нужно сделать больше проверок и работы. Например нужно убедится что у тебя OrgUnit не перемещается в тот же самый, нужно как то разорвать связь в дереве OrgUnitov где был старый и обновить новое. <br>
Как ты будешь это тестировать? Передашь OrgUnit и CUser - работает, и флаг ему в руки, работу перемещения я протестировал?]]></description>
        <author>Wound</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808539</guid>
        <pubDate>Thu, 29 Aug 2019 06:16:55 +0000</pubDate>
        <title>Rust vs C++</title>
        <link>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808539</link>
        <description><![CDATA[D_KEY: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413186&view=findpost&p=3808538'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Wound &#064; <time class="tag-quote__quoted-time" datetime="2019-08-29T06:12:28+00:00">29.08.19, 06:12</time></span><div class='quote '>Как зачем? А как проверять работу? Моки чтоли тестировать? Так это просто заглушки, для имитации того, что ты не можешь получить в ЮТ.</div></div><br>
В ЮТ ты проверяешь работу своего модуля, а не всего подряд.<br>
<br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>Если у тебя несколько реализаций - обычно все нужно тестировать</div></div><br>
Так оно и будет протестировано. Для каждой реализации будет свой ЮТ.<br>
Зачем тестить все реализации в тесте линкера? Он же работает через интерфейсы. В его ЮТ нужно тестить его работу. <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2019-08-29T06:20:31+00:00">29.08.19, 06:20</time></span></span><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413186&view=findpost&p=3808538'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Wound &#064; <time class="tag-quote__quoted-time" datetime="2019-08-29T06:12:28+00:00">29.08.19, 06:12</time></span><div class='quote '>Где проверять? И зачем проверять сколько раз ты что там дернул? Я не совсем понял.</div></div><br>
Ну допустим твой линкер должен дёрнуть такой-то метод одного интерфейса и такой-то другого. Ты создаешь мок-реализации интерфейсов и проверяешь, что эти вызовы были сделаны нужное число раз и с заданными параметрами. <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2019-08-29T06:21:13+00:00">29.08.19, 06:21</time></span></span><br>
Чуть позже могу показать на gmock&#39;е]]></description>
        <author>D_KEY</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808538</guid>
        <pubDate>Thu, 29 Aug 2019 06:12:28 +0000</pubDate>
        <title>Rust vs C++</title>
        <link>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808538</link>
        <description><![CDATA[Wound: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413186&view=findpost&p=3808504'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>D_KEY &#064; <time class="tag-quote__quoted-time" datetime="2019-08-28T19:44:55+00:00">28.08.19, 19:44</time></span><div class='quote '>В первом случае идет речь о тесте самого класса. Я, наверное, никогда не видел, чтобы в тесте класса перед вызовами унаследованных функций объект явно кастили к базовому(а только это спасло бы помимо override в моем примере).<br>
</div></div><br>
Ну и? Сам функционал же ты будешь тестировать? Ты же у себя в программе написал не просто A a; a.foo, а через фабрику эти сущности создаешь. А в тестах у тебя этого нет. Я тебе на это и указал в самом начале. <br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413186&view=findpost&p=3808504'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>D_KEY &#064; <time class="tag-quote__quoted-time" datetime="2019-08-28T19:44:55+00:00">28.08.19, 19:44</time></span><div class='quote '>Ну я уже написал, например, проверять, что дернул нужные методы нужное число раз с соответствующими аргументами.<br>
</div></div><br>
Где проверять? И зачем проверять сколько раз ты что там дернул? Я не совсем понял.<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413186&view=findpost&p=3808504'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>D_KEY &#064; <time class="tag-quote__quoted-time" datetime="2019-08-28T19:44:55+00:00">28.08.19, 19:44</time></span><div class='quote '>А зачем использовать существующие классы? У них свои тесты есть. Это же модульное тестирование. Кроме того, реализаций обычно несколько, какую выбрать? Моки обычно позволяют сделать дополнительные проверки. </div></div><br>
Как зачем? А как проверять работу? Моки чтоли тестировать? Так это просто заглушки, для имитации того, что ты не можешь получить в ЮТ. Если у тебя несколько реализаций - обычно все нужно тестировать. В идеале. Чтоб у тебя всевозможные сценарии отрабатывали. На практике правда, это не всегда достижимо.]]></description>
        <author>Wound</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808525</guid>
        <pubDate>Thu, 29 Aug 2019 00:11:04 +0000</pubDate>
        <title>Rust vs C++</title>
        <link>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808525</link>
        <description><![CDATA[korvin: <strong class='tag-b'>D_KEY</strong>, вот смотри <a class='tag-url' href='http://ideone.com/TQEm3p' target='_blank'>до рефакторинга</a>, <a class='tag-url' href='http://ideone.com/I0dOgd' target='_blank'>после рефакторинга</a> и <a class='tag-url' href='http://ideone.com/zuuxfP' target='_blank'>после фикса спецификации</a>. Если бы спецификация изначально была бы корректная, то не пришлось бы её фиксить. В твоём же рабочем процессе (автоматический апдейт дочерних сигнатур или просто ошибки на неуместный оверрайд) девелопер просто будет молча убирать оверрайд / подгонять тело метода под новую сигнатуру (или просто игнорировать новый параметр), совершенно не задумываясь, поменялась ли спецификация родительского класса или нет. В общем, просто уборка мусора под ковёр.]]></description>
        <author>korvin</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808523</guid>
        <pubDate>Wed, 28 Aug 2019 23:12:27 +0000</pubDate>
        <title>Rust vs C++</title>
        <link>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808523</link>
        <description><![CDATA[korvin: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413186&view=findpost&p=3808520'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>D_KEY &#064; <time class="tag-quote__quoted-time" datetime="2019-08-28T22:12:58+00:00">28.08.19, 22:12</time></span><div class='quote '>Пусть это будет метод, возвращающий некое описание класса, например.</div></div><br>
Что значит «некое описание класса»? Если оно «некое», динамическое, для каждого наследника A разное, то нельзя в тесте для A этого не учитывать и хардкодить expected как просто &quot;A&quot;, т.к. тест testA не пройдёт для наследников A, как у тебя не пройдёт даже до рефакторинга для B, а должен, потому что B — субтип A и должен следовать LSP и спецификации супертипа (A) соответственно.<br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2019-08-28T23:19:27+00:00">28.08.19, 23:19</time></span></span><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413186&view=findpost&p=3808522'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>D_KEY &#064; <time class="tag-quote__quoted-time" datetime="2019-08-28T22:55:02+00:00">28.08.19, 22:55</time></span><div class='quote '>Я тебе привел пример, когда такой код не будет нарушением контракта.</div></div><br>
Где? Я пропустил, видимо. Понапишут своих портянок, а потом коды не замечают =)<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413186&view=findpost&p=3808522'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>D_KEY &#064; <time class="tag-quote__quoted-time" datetime="2019-08-28T22:55:02+00:00">28.08.19, 22:55</time></span><div class='quote '>У разных классов будут разные значения.</div></div><br>
Дерьмовые классы, нарушающие LSP. Или дерьмовая спецификация (а значит и тесты), не учитывающие эту динамику.<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413186&view=findpost&p=3808522'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>D_KEY &#064; <time class="tag-quote__quoted-time" datetime="2019-08-28T22:55:02+00:00">28.08.19, 22:55</time></span><div class='quote '>И, повторяю еще раз. Тесты не имеют отношения к моему примеру. Их можно вообще убрать.</div></div><br>
Если их убрать, то в чём пример? Приведи пример кода без тестов.<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413186&view=findpost&p=3808522'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>D_KEY &#064; <time class="tag-quote__quoted-time" datetime="2019-08-28T22:55:02+00:00">28.08.19, 22:55</time></span><div class='quote '>А пример о том, что изменение сигнатуры метода в базовом классе может пройти незаметно без override, а это может являться ошибкой.</div></div><br>
А может и не являться. И может пройти заметно без override, если IDE не тупая как пробка и видит методы с той же сигнатурой. Я ж уже писал, что Java&#39;вские IDE и так прекрасно показывают, что метод пререопределяет родительский, без аннотации @Override. Точно также IDE это видит и при рефакторинге, если тебе хочется, чтобы она это учитывала. Так зачем явно писать override?]]></description>
        <author>korvin</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808522</guid>
        <pubDate>Wed, 28 Aug 2019 22:55:02 +0000</pubDate>
        <title>Rust vs C++</title>
        <link>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808522</link>
        <description><![CDATA[D_KEY: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413186&view=findpost&p=3808521'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>korvin &#064; <time class="tag-quote__quoted-time" datetime="2019-08-28T22:22:41+00:00">28.08.19, 22:22</time></span><div class='quote '>С того, что он описан в тесте. Тесты существуют, чтобы описывать контракты, невыразимые языковыми средствами</div></div><br>
Я тебе привел пример, когда такой код не будет нарушением контракта.<br>
Еще пример - класс исключений и метод, возвращающий сообщение об ошибке. У разных классов будут разные значения. Тесты можно не писать на это дело, а можно и написать.<br>
Контракт это нарушать не будет. <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2019-08-28T22:58:50+00:00">28.08.19, 22:58</time></span></span><br>
И, повторяю еще раз. Тесты не имеют отношения к моему примеру. Их можно вообще убрать.<br>
А пример о том, что изменение сигнатуры метода в базовом классе может пройти незаметно без override, а это может являться ошибкой.]]></description>
        <author>D_KEY</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808521</guid>
        <pubDate>Wed, 28 Aug 2019 22:22:41 +0000</pubDate>
        <title>Rust vs C++</title>
        <link>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808521</link>
        <description><![CDATA[korvin: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413186&view=findpost&p=3808438'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>D_KEY &#064; <time class="tag-quote__quoted-time" datetime="2019-08-28T12:21:39+00:00">28.08.19, 12:21</time></span><div class='quote '>Я правильно понимаю, что это все потребует нового языка?</div></div><br>
Не обязательно, существующие могут постепенно эволюционировать. «Внешние» интерфейсы (которые у меня названы protocol) есть в некоторых языках, например, OCaml и Go. Что-то похожее вроде было в Objective-C, возможно, есть и в Swift. Думаю, такие интерфейсы постепенно приобретут широкую популярность и будут постепенно добавлены во все мейнстримные языки. Лямбды ж добавили в консервативную Java =). В некоторм смысле и шаблоны C++ являются таковыми, только compile-time.<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413186&view=findpost&p=3808438'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>D_KEY &#064; <time class="tag-quote__quoted-time" datetime="2019-08-28T12:21:39+00:00">28.08.19, 12:21</time></span><div class='quote '>Вот тут не понял. Зачем тебе goшные интерфейсый в java?</div></div><br>
Затем, что если тупые разработчики какой-нибудь библиотеки не предусмотрели общие интерфейсы для sibling-классов, то приходится приседать с бубном, чтобы написать обощённый код. Например, Eclipse&#39;овский SWT: у многих виджетов есть методы `String getText()` и `void setText(String text)`, но при этом они не реализуют какой-нибудь общий интерфейс `HasTextProperty { String getText(); void setText(String) }` и написать какой-нибудь обобщённый код для них просто так нельзя. На выбор такие костыли:<br>
<br>
– написать свои классы, которые наследую SWT&#39;шные и имплементируют нужные интерфейсы, например:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">public class MyLabel extends swt.Label implements HasText {}</div></ol></div></div></div></div><br>
слава б-гу не нужно явно перечислять методы и писать @Override (ха-ха). Теперь нужно везде использовать эти свои классы, писать свои фабрики вместо тех, что уже есть в самом swt и т.п.<br>
<br>
– воспользоваться рефлексией и написать тройку вспомогательных статических методов где-нибудь в своём UIUtil классе или типа того:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">boolean hasText(swt.Widget w) { ... }</div><div class="code_line">String getText(swt.Widget w) { ... }</div><div class="code_line">void setText(swt.Widget w, String newText) { ... }</div></ol></div></div></div></div><br>
как ты понимаешь, ООП и статическая типизация тут идут лесом.<br>
<br>
В Go же мне было бы достаточно определить в своём коде<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">type HasText interface {</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;GetText() String</div><div class="code_line">&nbsp;&nbsp; &nbsp;SetText(String)</div><div class="code_line">}</div></ol></div></div></div></div><br>
<br>
и всё. Все классы с такими методами автоматически годились бы для использования в коде, ожидающем объекты такого интерфейсного типа.<br>
<br>
То же самое и с объектными типами в OCaml.<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413186&view=findpost&p=3808438'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>D_KEY &#064; <time class="tag-quote__quoted-time" datetime="2019-08-28T12:21:39+00:00">28.08.19, 12:21</time></span><div class='quote '>Это будет ближе к практике?</div></div><br>
А до этого что, далековато было? Оба указанных варианта применения интерфейсов выведены исключительно из практических применений. И предложение по их явному разделению продиктовано в том числе и практическими соображениями, а не только тем, что это «концептуально чище». <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2019-08-28T22:23:48+00:00">28.08.19, 22:23</time></span></span><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413186&view=findpost&p=3808520'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>D_KEY &#064; <time class="tag-quote__quoted-time" datetime="2019-08-28T22:12:58+00:00">28.08.19, 22:12</time></span><div class='quote '>С чего ты взял, что у него такой контракт? </div></div><br>
С того, что он описан в тесте. Тесты существуют, чтобы описывать контракты, невыразимые языковыми средствами. Т.е. поведенческие контракты. <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2019-08-28T22:26:35+00:00">28.08.19, 22:26</time></span></span><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413186&view=findpost&p=3808520'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>D_KEY &#064; <time class="tag-quote__quoted-time" datetime="2019-08-28T22:12:58+00:00">28.08.19, 22:12</time></span><div class='quote '>Да не реализует он другой контракт. Ты, по-моему, на ходу выдумываешь.</div></div><br>
Ты, по-моему, совсем забыл про LSP, например. И про то, что далеко не во всех языках можно описать полноценно контракт чисто системой типов, поэтому она дополняется применяется тестированием. <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2019-08-28T22:27:35+00:00">28.08.19, 22:27</time></span></span><br>
<strong class='tag-b'>D_KEY</strong>, может, мы по-разному понимаем слово «контракт»? «Спецификация» тебя больше устроит? Не знаю, «набор инвариантов»?]]></description>
        <author>korvin</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808520</guid>
        <pubDate>Wed, 28 Aug 2019 22:12:58 +0000</pubDate>
        <title>Rust vs C++</title>
        <link>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808520</link>
        <description><![CDATA[D_KEY: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413186&view=findpost&p=3808519'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>korvin &#064; <time class="tag-quote__quoted-time" datetime="2019-08-28T21:45:10+00:00">28.08.19, 21:45</time></span><div class='quote '>Тестовый набор для B не должен был включать в себя тесты для родительского метода foo(). В твоём случае такое перекрытие foo в B нарушает контракт (описанный в тесте для A.foo) родительского класса, который гласит, что метод foo() должен возвращать &quot;A&quot;.</div></div><br>
С чего ты взял, что у него такой контракт? Пусть это будет метод, возвращающий некое описание класса, например.<br>
<br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>либо класс B не является наследником класса A, т.к. реализует другой контракт, либо контракт в тесте описан некорректно.</div></div><br>
Да не реализует он другой контракт. Ты, по-моему, на ходу выдумываешь.<br>
<br>
Ну ок, давай уберем тест foo для B. Мой пример остается валидным. Без override код молча скомпилируется при изменении сигнатуры.]]></description>
        <author>D_KEY</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808519</guid>
        <pubDate>Wed, 28 Aug 2019 21:45:10 +0000</pubDate>
        <title>Rust vs C++</title>
        <link>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808519</link>
        <description><![CDATA[korvin: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413186&view=findpost&p=3808316'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Qraizer &#064; <time class="tag-quote__quoted-time" datetime="2019-08-27T23:38:03+00:00">27.08.19, 23:38</time></span><div class='quote '>Зачем? На эти методы можно натравить имеющиеся тесты. </div></div><br>
Да, я, видимо, неточно выразился. Я имел в виду, что для класса нужно прогонять не только тесты для его собственных методов, но и тесты для всех методов, унаследованных от родительских классов. <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2019-08-28T21:55:04+00:00">28.08.19, 21:55</time></span></span><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413186&view=findpost&p=3808438'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>D_KEY &#064; <time class="tag-quote__quoted-time" datetime="2019-08-28T12:21:39+00:00">28.08.19, 12:21</time></span><div class='quote '>В результате, теперь в случае экземпляра B, выводиться будет A.</div></div><br>
Так у тебя тесты неправильные, вот ты сам себе и выстрелил в ногу. Тестовый набор для B не должен был включать в себя тесты для родительского метода foo(). В твоём случае такое перекрытие foo в B нарушает контракт (описанный в тесте для A.foo) родительского класса, который гласит, что метод foo() должен возвращать &quot;A&quot;. А ты взял и в наследнике нарушил этот контракт. Тесты нельзя оверрайдить. Если ты вдруг это сделал (как в этом примере), тебе стоит тут же ударить себя по рукам, остановиться, подумать и решить: либо класс B не является наследником класса A, т.к. реализует другой контракт, либо контракт в тесте описан некорректно.]]></description>
        <author>korvin</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808504</guid>
        <pubDate>Wed, 28 Aug 2019 19:44:55 +0000</pubDate>
        <title>Rust vs C++</title>
        <link>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808504</link>
        <description><![CDATA[D_KEY: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413186&view=findpost&p=3808501'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Wound &#064; <time class="tag-quote__quoted-time" datetime="2019-08-28T19:39:34+00:00">28.08.19, 19:39</time></span><div class='quote '><div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413186&view=findpost&p=3808500'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>D_KEY &#064; <time class="tag-quote__quoted-time" datetime="2019-08-28T19:34:06+00:00">28.08.19, 19:34</time></span><div class='quote '>Зачем их там создавать, если можно и нужно работать через интерфейсы? </div></div><br>
Вот теперь я тебя вообще перестал понимать. Ты до этого писал:<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413186&view=findpost&p=3808469'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>D_KEY &#064; <time class="tag-quote__quoted-time" datetime="2019-08-28T16:31:10+00:00">28.08.19, 16:31</time></span><div class='quote '>А ты часто видишь, чтобы кто-то явно кастил к базовому классу?<br>
</div></div><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413186&view=findpost&p=3808455'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>D_KEY &#064; <time class="tag-quote__quoted-time" datetime="2019-08-28T14:44:22+00:00">28.08.19, 14:44</time></span><div class='quote '>Во-вторых, я мало видел тестов, где бы кастили к базовому классу. Возможно, все кастят, а мне попадалось говно. Но это ничего на самом деле не меняет. </div></div><br>
Теперь ты уже пишешь совершенно противоположное.  :-?</div></div><br>
В первом случае идет речь о тесте самого класса. Я, наверное, никогда не видел, чтобы в тесте класса перед вызовами унаследованных функций объект явно кастили к базовому(а только это спасло бы помимо override в моем примере). <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2019-08-28T19:46:10+00:00">28.08.19, 19:46</time></span></span><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413186&view=findpost&p=3808501'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Wound &#064; <time class="tag-quote__quoted-time" datetime="2019-08-28T19:39:34+00:00">28.08.19, 19:39</time></span><div class='quote '>Зачем их создавать, если у тебя есть возможность уже использовать существующие классы например?</div></div><br>
Ну я уже написал, например, проверять, что дернул нужные методы нужное число раз с соответствующими аргументами. <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2019-08-28T19:48:11+00:00">28.08.19, 19:48</time></span></span><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413186&view=findpost&p=3808501'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Wound &#064; <time class="tag-quote__quoted-time" datetime="2019-08-28T19:39:34+00:00">28.08.19, 19:39</time></span><div class='quote '>Зачем их создавать, если у тебя есть возможность уже использовать существующие классы например?</div></div><br>
А зачем использовать существующие классы? У них свои тесты есть. Это же модульное тестирование. Кроме того, реализаций обычно несколько, какую выбрать? Моки обычно позволяют сделать дополнительные проверки.]]></description>
        <author>D_KEY</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808501</guid>
        <pubDate>Wed, 28 Aug 2019 19:39:34 +0000</pubDate>
        <title>Rust vs C++</title>
        <link>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808501</link>
        <description><![CDATA[Wound: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413186&view=findpost&p=3808500'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>D_KEY &#064; <time class="tag-quote__quoted-time" datetime="2019-08-28T19:34:06+00:00">28.08.19, 19:34</time></span><div class='quote '>Зачем их там создавать, если можно и нужно работать через интерфейсы? </div></div><br>
Вот теперь я тебя вообще перестал понимать. Ты до этого писал:<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413186&view=findpost&p=3808469'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>D_KEY &#064; <time class="tag-quote__quoted-time" datetime="2019-08-28T16:31:10+00:00">28.08.19, 16:31</time></span><div class='quote '>А ты часто видишь, чтобы кто-то явно кастил к базовому классу?<br>
</div></div><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413186&view=findpost&p=3808455'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>D_KEY &#064; <time class="tag-quote__quoted-time" datetime="2019-08-28T14:44:22+00:00">28.08.19, 14:44</time></span><div class='quote '>Во-вторых, я мало видел тестов, где бы кастили к базовому классу. Возможно, все кастят, а мне попадалось говно. Но это ничего на самом деле не меняет. </div></div><br>
Теперь ты уже пишешь совершенно противоположное.  :-? <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2019-08-28T19:40:58+00:00">28.08.19, 19:40</time></span></span><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413186&view=findpost&p=3808500'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>D_KEY &#064; <time class="tag-quote__quoted-time" datetime="2019-08-28T19:34:06+00:00">28.08.19, 19:34</time></span><div class='quote '>Создам два mock&#39;а, свяжу, проверю связь. Если нужно, чтоб дергались методы интерфейсов, проверю, что дергается нужное число раз и с ожидаемыми параметрами(gmock это позволяет). </div></div><br>
Что эти моки будут делать? Зачем их создавать, если у тебя есть возможность уже использовать существующие классы например?]]></description>
        <author>Wound</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808500</guid>
        <pubDate>Wed, 28 Aug 2019 19:34:06 +0000</pubDate>
        <title>Rust vs C++</title>
        <link>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808500</link>
        <description><![CDATA[D_KEY: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413186&view=findpost&p=3808495'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Wound &#064; <time class="tag-quote__quoted-time" datetime="2019-08-28T19:08:48+00:00">28.08.19, 19:08</time></span><div class='quote '>Так другие конкретные классы - это у тебя всегда сущности, которые ты не можешь создать в ЮТ? :blink:</div></div><br>
Зачем их там создавать, если можно и нужно работать через интерфейсы? <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2019-08-28T19:36:32+00:00">28.08.19, 19:36</time></span></span><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413186&view=findpost&p=3808499'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Wound &#064; <time class="tag-quote__quoted-time" datetime="2019-08-28T19:33:40+00:00">28.08.19, 19:33</time></span><div class='quote '>меня интересует как ты будешь тестить линкер</div></div><br>
Создам два mock&#39;а, свяжу, проверю связь. Если нужно, чтоб дергались методы интерфейсов, проверю, что дергается нужное число раз и с ожидаемыми параметрами(gmock это позволяет).]]></description>
        <author>D_KEY</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808499</guid>
        <pubDate>Wed, 28 Aug 2019 19:33:40 +0000</pubDate>
        <title>Rust vs C++</title>
        <link>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808499</link>
        <description><![CDATA[Wound: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413186&view=findpost&p=3808498'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>D_KEY &#064; <time class="tag-quote__quoted-time" datetime="2019-08-28T19:17:09+00:00">28.08.19, 19:17</time></span><div class='quote '>Ты слышал про IoC? </div></div><br>
Слышал, как это к теме относится?<br>
<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413186&view=findpost&p=3808498'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>D_KEY &#064; <time class="tag-quote__quoted-time" datetime="2019-08-28T19:17:09+00:00">28.08.19, 19:17</time></span><div class='quote '>Нет. Тесты будут разные на все три класса. Линкер твой вообще не будет знать ничего про конкретные классы и в его тестах вместо них будут mock-объекты, реализующие IContainer и IPrincipal, соответственно. </div></div><br>
Конечно разные на все три класса, меня интересует как ты будешь тестить линкер. Он ежели чего, и так не знает про конкретные классы. Так ты мок объекты тестить будешь или что?]]></description>
        <author>Wound</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808498</guid>
        <pubDate>Wed, 28 Aug 2019 19:17:09 +0000</pubDate>
        <title>Rust vs C++</title>
        <link>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808498</link>
        <description><![CDATA[D_KEY: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413186&view=findpost&p=3808495'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Wound &#064; <time class="tag-quote__quoted-time" datetime="2019-08-28T19:08:48+00:00">28.08.19, 19:08</time></span><div class='quote '>Так другие конкретные классы - это у тебя всегда сущности, которые ты не можешь создать в ЮТ? :blink:</div></div><br>
Ты слышал про IoC? <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2019-08-28T19:22:35+00:00">28.08.19, 19:22</time></span></span><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413186&view=findpost&p=3808495'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Wound &#064; <time class="tag-quote__quoted-time" datetime="2019-08-28T19:08:48+00:00">28.08.19, 19:08</time></span><div class='quote '>... <br>
Верно?</div></div><br>
Нет. Тесты будут разные на все три класса. Линкер твой вообще не будет знать ничего про конкретные классы и в его тестах вместо них будут mock-объекты, реализующие IContainer и IPrincipal, соответственно. <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2019-08-28T19:32:15+00:00">28.08.19, 19:32</time></span></span><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413186&view=findpost&p=3808495'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Wound &#064; <time class="tag-quote__quoted-time" datetime="2019-08-28T19:08:48+00:00">28.08.19, 19:08</time></span><div class='quote '>А если тебе до линковки нужно будет вызвать какой нибудь метод, который есть в базовом классе IContainer/IPrincipal, но нет в том, который ты пытаешься протестить?</div></div><br>
Чего? Еще раз, мы о модульных тестах. Для твоего примера будет три отдельных теста. А в тесте linker&#39;а будут использоваться не COrgUnit и Personage, а mock&#39;и, реализующие IContainer и IProncipal, что позволит мне, например, отслеживать вызовы методов этих интерфейсов, проверять, что они вырвались нужное число раз, написать тесты на аргументы и т.д.]]></description>
        <author>D_KEY</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808495</guid>
        <pubDate>Wed, 28 Aug 2019 19:08:48 +0000</pubDate>
        <title>Rust vs C++</title>
        <link>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808495</link>
        <description><![CDATA[Wound: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413186&view=findpost&p=3808484'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>D_KEY &#064; <time class="tag-quote__quoted-time" datetime="2019-08-28T18:30:20+00:00">28.08.19, 18:30</time></span><div class='quote '>Wound, ты не знаешь, что такое mock объекты и как они используются? </div></div><br>
Знаю, я не понимаю, зачем делать так, как ты пишешь.<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413186&view=findpost&p=3808484'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>D_KEY &#064; <time class="tag-quote__quoted-time" datetime="2019-08-28T18:30:20+00:00">28.08.19, 18:30</time></span><div class='quote '>Ты пишешь тест на класс. Что значит никто не тестит через классы? Покажи плиз свой обычный тест на класс. </div></div><br>
Ок, вот у тебя есть метод класса, который принимает две сущности, и линкует одну к другой:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">class EntityLinker</div><div class="code_line">{</div><div class="code_line">public:</div><div class="code_line">&nbsp;&nbsp; virtual bool LinkToContainer(IContainer* orgUnit, IPrincipal* principal)</div><div class="code_line">&nbsp;&nbsp; {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; if(orgUnit != nullptr &amp;&amp; principal != nullptr)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return orgUnit-&#62;Link(principal);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; }</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; return false;</div><div class="code_line">&nbsp;&nbsp; }</div><div class="code_line">};</div></ol></div></div></div></div><br>
У тебя вместо IPrincipal может быть например CUser, или там CPrinter, или может быть даже COrganizationUnit. В нашем случае это классы A и B. У юзера и принтера тоже есть свои какие то методы, и они тестируются отдельно. <br>
Я в тесте буду писать:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">void testLinkToContainer()</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;/*Тут, вместо new даже может быть Mock, который будет делать все тоже самое, кроме физического создания контейнера в системе, например как в примере создавать эксземпляр класса, напихивать в него данные, возвращать его, но не сохранять в системе*/</div><div class="code_line">&nbsp;&nbsp; &nbsp;IContainer* pContainer = new COrgUnit(CN, DN, Location,...);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;/*Тут ровно тоже самое, создается либо через mock, либо напрямую нужный класс, забивается данными*/</div><div class="code_line">&nbsp;&nbsp; &nbsp;IPrincipal* pPrincipal = new Personage(CN, DN, Location,...);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;//! Допустим через интерфейс создаем юзер аккаунт, который нужен будет для линковки</div><div class="code_line">&nbsp;&nbsp; &nbsp;pPrincipal-&#62;CreateUserAccountPersonage();</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;EntityLinker* linker = new EntiryLinker(...);</div><div class="code_line">&nbsp;&nbsp; </div><div class="code_line">&nbsp;&nbsp; &nbsp;//! Дальше тут какие то проверки, что все засетаплено честно.</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;//! Дальше собственно выполняем нашу линковку:</div><div class="code_line">&nbsp;&nbsp; &nbsp;linker-&#62;LinkToContainer(pContainer, pPrincipal);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; /*Дальше идет тестирование результатов линковки*/</div><div class="code_line">}</div></ol></div></div></div></div><br>
Собственно вот у нас есть вот такая структура, как ты ее будешь тестить? Ну вот линковку? <br>
На сколько я понял, ты будешь писать что то типа:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">void testLinkToContainer()</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;/*Тут, вместо new даже может быть Mock, который будет делать все тоже самое, кроме физического создания контейнера в системе, например как в примере создавать эксземпляр класса, напихивать в него данные, возвращать его, но не сохранять в системе*/</div><div class="code_line">&nbsp;&nbsp; &nbsp;COrgUnit unit(CN, DN, Location,...);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;/*Тут ровно тоже самое, создается либо через mock, либо напрямую нужный класс, забывается данными*/</div><div class="code_line">&nbsp;&nbsp; &nbsp;CAccountPrincipal principal(CN, DN, Location,...);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;//! Что вот с этим делать? Такого метода нема у CAccountPrincipal</div><div class="code_line">&nbsp;&nbsp; &nbsp;//pPrincipal-&#62;CreateUserAccountPersonage();</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;EntityLinker* linker = new EntiryLinker(...);</div><div class="code_line">&nbsp;&nbsp; </div><div class="code_line">&nbsp;&nbsp; &nbsp;//! Дальше тут какие то проверки, что все засетаплено честно.</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;//! Дальше собственно выполняем нашу линковку:</div><div class="code_line">&nbsp;&nbsp; &nbsp;linker-&#62;LinkToContainer(&amp;unit, &amp;principal);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; /*Дальше идет тестирование результатов линковки*/</div><div class="code_line">}</div></ol></div></div></div></div><br>
Верно? А если тебе до линковки нужно будет вызвать какой нибудь метод, который есть в базовом классе IContainer/IPrincipal, но нет в том, который ты пытаешься протестить? Что делать? :-? <br>
Обычно ЮТ, можно тестировать как отдельные методы, так и функционал в целом, когда ты уже начинает писать ЮТ для классов, которые юзают твои вот эти А/B. <br>
Напиши как ты будешь тестить и куда прикручивать моки?<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413186&view=findpost&p=3808484'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>D_KEY &#064; <time class="tag-quote__quoted-time" datetime="2019-08-28T18:30:20+00:00">28.08.19, 18:30</time></span><div class='quote '>Wound, я не понимаю тебя, извини. </div></div><br>
Я если честно тоже не понимаю тебя. Ты заглушки тестишь что ли? Или что? Я так и не понял.<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413186&view=findpost&p=3808484'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>D_KEY &#064; <time class="tag-quote__quoted-time" datetime="2019-08-28T18:30:20+00:00">28.08.19, 18:30</time></span><div class='quote '>Именно. В результате у тебя при тесте конкретного класса другие конкретные классы, как правило, не задействованы. Вместо них у тебя будет mock- объект с нужным интерфейсом.<br>
&quot;I</div></div><br>
Так другие конкретные классы - это у тебя всегда сущности, которые ты не можешь создать в ЮТ? :blink:]]></description>
        <author>Wound</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808484</guid>
        <pubDate>Wed, 28 Aug 2019 18:30:20 +0000</pubDate>
        <title>Rust vs C++</title>
        <link>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808484</link>
        <description><![CDATA[D_KEY: <strong class='tag-b'>Wound</strong>, ты не знаешь, что такое mock объекты и как они используются? <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2019-08-28T18:31:46+00:00">28.08.19, 18:31</time></span></span><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413186&view=findpost&p=3808470'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Wound &#064; <time class="tag-quote__quoted-time" datetime="2019-08-28T16:51:42+00:00">28.08.19, 16:51</time></span><div class='quote '>Практически постоянно вижу, что работают все через интерфейсы. Через классы вообще мало кто работает.</div></div><br>
Ты пишешь тест на класс. Что значит никто не тестит через классы? Покажи плиз свой обычный тест на класс. <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2019-08-28T18:32:33+00:00">28.08.19, 18:32</time></span></span><br>
<strong class='tag-b'>Wound</strong>, я не понимаю тебя, извини. <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2019-08-28T18:38:39+00:00">28.08.19, 18:38</time></span></span><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413186&view=findpost&p=3808470'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Wound &#064; <time class="tag-quote__quoted-time" datetime="2019-08-28T16:51:42+00:00">28.08.19, 16:51</time></span><div class='quote '>Mock-объекты нужны для имитации того, что ты не можешь иметь в ЮТ.  Допустим - это может быть БД, Флешка, какое то устройство, еще чего то, какой нибудь контекст, который получается путем сложных манипуляций и т.д.</div></div><br>
Именно. В результате у тебя при тесте конкретного класса другие конкретные классы, как правило, не задействованы. Вместо них у тебя будет mock- объект с нужным интерфейсом.]]></description>
        <author>D_KEY</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808470</guid>
        <pubDate>Wed, 28 Aug 2019 16:51:42 +0000</pubDate>
        <title>Rust vs C++</title>
        <link>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808470</link>
        <description><![CDATA[Wound: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413186&view=findpost&p=3808469'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>D_KEY &#064; <time class="tag-quote__quoted-time" datetime="2019-08-28T16:31:10+00:00">28.08.19, 16:31</time></span><div class='quote '>Мои &quot;тесты&quot; - это лишь пример. Покажи &quot;правильные&quot; тесты для данного случая, кстати.</div></div><br>
Так я тебе уже показывал. <br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413186&view=findpost&p=3808469'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>D_KEY &#064; <time class="tag-quote__quoted-time" datetime="2019-08-28T16:31:10+00:00">28.08.19, 16:31</time></span><div class='quote '>А ты часто видишь, чтобы кто-то явно кастил к базовому классу?</div></div><br>
Практически постоянно вижу, что работают все через интерфейсы. Через классы вообще мало кто работает.<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413186&view=findpost&p=3808469'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>D_KEY &#064; <time class="tag-quote__quoted-time" datetime="2019-08-28T16:31:10+00:00">28.08.19, 16:31</time></span><div class='quote '>А ты тестируешь наследование?</div></div><br>
Почему нет? Я же его для чего то там написал, раз написал - значит нужно тестировать. А ты не тестируешь поведение, да? Тестируешь только голые методы классов?<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413186&view=findpost&p=3808469'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>D_KEY &#064; <time class="tag-quote__quoted-time" datetime="2019-08-28T16:31:10+00:00">28.08.19, 16:31</time></span><div class='quote '>Чего? Mock-объекты и нужны для тестов.</div></div><br>
Для каких тестов? Mock-объекты нужны для имитации того, что ты не можешь иметь в ЮТ.  Допустим - это может быть БД, Флешка, какое то устройство, еще чего то, какой нибудь контекст, который получается путем сложных манипуляций и т.д.<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413186&view=findpost&p=3808469'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>D_KEY &#064; <time class="tag-quote__quoted-time" datetime="2019-08-28T16:31:10+00:00">28.08.19, 16:31</time></span><div class='quote '>Нет, тестируемый класс как раз не Mock. А все его окружение, которое в реальном коде будет реальными объектами, в тестах сделано через Mock-объекты.<br>
</div></div><br>
Ну ты пишешь что у тебя вот та фишка: factory-&gt;make_instance(...); будет где то там в Mock Объекте или вообще будет mock&#39;Ом. Я если честно не понял ничего из того что ты пишешь. Зачем это будет моком? И что он в данном случае будет делать? :D Для чего он нужен другими словами? Ты же не будешь вызывать методы классов через него и проверять значения.<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413186&view=findpost&p=3808469'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>D_KEY &#064; <time class="tag-quote__quoted-time" datetime="2019-08-28T16:31:10+00:00">28.08.19, 16:31</time></span><div class='quote '>В моем примере в других тестах(не A и не B), вместо реальных объектов было бы Mock-объект, наследованный от A:</div></div><br>
Слишком скудная информация. И как это потом использовать? Т.е. ты возвращаешь из метода что то, что не соответствует реальному результату? Что ты тогда тестишь то? У тебя явно тут идет расхождение в предложенных тестах и моках. Я если честно не совсем понимаю тебя.]]></description>
        <author>Wound</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808469</guid>
        <pubDate>Wed, 28 Aug 2019 16:31:10 +0000</pubDate>
        <title>Rust vs C++</title>
        <link>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808469</link>
        <description><![CDATA[D_KEY: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413186&view=findpost&p=3808468'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Wound &#064; <time class="tag-quote__quoted-time" datetime="2019-08-28T16:27:15+00:00">28.08.19, 16:27</time></span><div class='quote '>У тебя в тестах не так.</div></div><br>
Мои &quot;тесты&quot; - это лишь пример. Покажи &quot;правильные&quot; тесты для данного случая, кстати.<br>
<br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>Ну вся фишка в том, что в твоем случае не тестируется дин. полиморфизм.</div></div><br>
А ты часто видишь, чтобы кто-то явно кастил к базовому классу?<br>
<br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>Хотя по факту у тебя там наследование, которое ты не тестируешь.</div></div><br>
А ты тестируешь наследование?<br>
<br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>Допустим в явошарпах, там тестируется буквально все, моки там нужны разве что для объектов, которые невозможно съэмитировать с помощью тестов.</div></div><br>
Чего? Mock-объекты и нужны для тестов.<br>
<br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>У тебя будет Mock-Объект, вместо тестируемого класса? :-?</div></div><br>
Нет, тестируемый класс как раз не Mock. А все его окружение, которое в реальном коде будет реальными объектами, в тестах сделано через Mock-объекты. <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2019-08-28T16:36:21+00:00">28.08.19, 16:36</time></span></span><br>
В моем примере в других тестах(не A и не B), вместо реальных объектов было бы Mock-объект, наследованный от A:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">class MockA: public A {</div><div class="code_line">&nbsp;&nbsp; &nbsp;MOCK_CONST_METHOD0(foo, std::string());</div><div class="code_line">};</div></ol></div></div></div></div><br>
А после рефакторинга стал бы:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">class MockA: public A {</div><div class="code_line">&nbsp;&nbsp; &nbsp;MOCK_CONST_METHOD1(foo, std::string(int));</div><div class="code_line">};</div></ol></div></div></div></div><br>
И во всех тестах, кроме тестов A, использовался бы он.<br>
Если используется не gtest/gmock, а какой-то другой фреймворк, то код был бы чуть другой, но суть та же.]]></description>
        <author>D_KEY</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808468</guid>
        <pubDate>Wed, 28 Aug 2019 16:27:15 +0000</pubDate>
        <title>Rust vs C++</title>
        <link>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808468</link>
        <description><![CDATA[Wound: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413186&view=findpost&p=3808464'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>D_KEY &#064; <time class="tag-quote__quoted-time" datetime="2019-08-28T15:25:30+00:00">28.08.19, 15:25</time></span><div class='quote '>Именно так.</div></div><br>
У тебя в тестах не так. Если бы у тебя в тестах было бы так, то в одной из тестовой функций ты бы получил ошибку.<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413186&view=findpost&p=3808464'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>D_KEY &#064; <time class="tag-quote__quoted-time" datetime="2019-08-28T15:25:30+00:00">28.08.19, 15:25</time></span><div class='quote '>Да как он у тебя выплывет? Класс B тестируется только в юнит-тесте класса B. В остальных юнит-тестах будет mock-объект вместо реального. </div></div><br>
Ну вся фишка в том, что в твоем случае не тестируется дин. полиморфизм. Т.е. ты просто протестировал в отрыве от функционала два метода двух <strong class='tag-b'>разных</strong> классов. Хотя по факту у тебя там наследование, которое ты не тестируешь.<br>
Т.е. другими словами ты написал класс Млекопитающее, написал класс Собака, проверил их методы, но поведение сущности ты не проверил. Допустим в явошарпах, там тестируется буквально все, моки там нужны разве что для объектов, которые невозможно съэмитировать с помощью тестов. Например там физическая железка какая то. А так - даже БД создать можно. Поэтому не совсем понял о каком mock-Объекте ты говоришь. У тебя будет Mock-Объект, вместо тестируемого класса? :-?]]></description>
        <author>Wound</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808464</guid>
        <pubDate>Wed, 28 Aug 2019 15:25:30 +0000</pubDate>
        <title>Rust vs C++</title>
        <link>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808464</link>
        <description><![CDATA[D_KEY: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413186&view=findpost&p=3808460'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Wound &#064; <time class="tag-quote__quoted-time" datetime="2019-08-28T15:07:25+00:00">28.08.19, 15:07</time></span><div class='quote '>Да просто так, оно ж у тебя в тестах не тестируется.</div></div><br>
С чего ты взял? Фабрика тестируется отдельно. В своем юнит-тесте.<br>
<br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>А они как бы все в язык несут, все новомодности модные собирают со всех языков и несут в язык. Чтоб было.  :D </div></div><br>
Понятно :D <br>
<br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>Пишешь ЮТ - которые эмулируют работу, с помощью тех же mock объектов. Как правило помимо самих функций - тестируется еще и функционал который они делают. Потому как в 99% случаев, бывает такое, что для того, что бы юзнуть функцию в ЮТ, для нее нужно настроить окружение. А это подразумевает имитирование работы части функционала.<br>
</div></div>Именно так.<br>
<br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>Например там функция ждет от тебя какой нибудь коннектор, провайдер, поток с данными и т.д. чтоб дальше с ним работать, или например еще что то, и а те в свою очередь, для того чтоб вернули ожидаемые значения могут еще что то принимать, что в свою очередь может принимать еще другое. И в итоге ты начинаешь делать mock объекты и эмулировать работу программы в ЮТ.</div></div><br>
Верно.<br>
<br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>Где практически все косяки, в том числе и те, которые ты написал зачастую всплывают.</div></div><br>
Да как он у тебя выплывет? Класс B тестируется только в юнит-тесте класса B. В остальных юнит-тестах будет mock-объект вместо реального.]]></description>
        <author>D_KEY</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808460</guid>
        <pubDate>Wed, 28 Aug 2019 15:07:25 +0000</pubDate>
        <title>Rust vs C++</title>
        <link>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808460</link>
        <description><![CDATA[Wound: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413186&view=findpost&p=3808455'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>D_KEY &#064; <time class="tag-quote__quoted-time" datetime="2019-08-28T14:44:22+00:00">28.08.19, 14:44</time></span><div class='quote '>С чего вдруг?</div></div><br>
Да просто так, оно ж у тебя в тестах не тестируется. Мало ли там что пойдет не так, вместо класса A, создастся класс B например или наоборот.<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413186&view=findpost&p=3808455'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>D_KEY &#064; <time class="tag-quote__quoted-time" datetime="2019-08-28T14:44:22+00:00">28.08.19, 14:44</time></span><div class='quote '>Потому что это всего-лишь пример. Иллюстрация.<br>
Ты не всегда сможешь отследить изменение сигнатуры в реальном проекте. </div></div><br>
А раньше как отслеживал?  :D <br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413186&view=findpost&p=3808455'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>D_KEY &#064; <time class="tag-quote__quoted-time" datetime="2019-08-28T14:44:22+00:00">28.08.19, 14:44</time></span><div class='quote '>А для чего добавили, на твой взгляд?</div></div><br>
А они как бы все в язык несут, все новомодности модные собирают со всех языков и несут в язык. Чтоб было.  :D <br>
Ну как синтаксический сахар конечно пойдет. Я ж не против override&#39;ов.<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413186&view=findpost&p=3808455'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>D_KEY &#064; <time class="tag-quote__quoted-time" datetime="2019-08-28T14:44:22+00:00">28.08.19, 14:44</time></span><div class='quote '>Во-первых, ЮТ не являются частью языка. Во-вторых, я мало видел тестов, где бы кастили к базовому классу. Возможно, все кастят, а мне попадалось говно. Но это ничего на самом деле не меняет.<br>
</div></div><br>
Незнаю, мне напротив попадалось другое. Пишешь ЮТ - которые эмулируют работу, с помощью тех же mock объектов. Как правило помимо самих функций - тестируется еще и функционал который они делают. Потому как в 99% случаев, бывает такое, что для того, что бы юзнуть функцию в ЮТ, для нее нужно настроить окружение. А это подразумевает имитирование работы части функционала.<br>
Например там функция ждет от тебя какой нибудь коннектор, провайдер, поток с данными и т.д. чтоб дальше с ним работать, или например еще что то, и а те в свою очередь, для того чтоб вернули ожидаемые значения могут еще что то принимать, что в свою очередь может принимать еще другое. И в итоге ты начинаешь делать mock объекты и эмулировать работу программы в ЮТ. Где практически все косяки, в том числе и те, которые ты написал зачастую всплывают.]]></description>
        <author>Wound</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808455</guid>
        <pubDate>Wed, 28 Aug 2019 14:44:22 +0000</pubDate>
        <title>Rust vs C++</title>
        <link>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808455</link>
        <description><![CDATA[D_KEY: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413186&view=findpost&p=3808451'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Wound &#064; <time class="tag-quote__quoted-time" datetime="2019-08-28T14:37:58+00:00">28.08.19, 14:37</time></span><div class='quote '><div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413186&view=findpost&p=3808450'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>D_KEY &#064; <time class="tag-quote__quoted-time" datetime="2019-08-28T14:32:23+00:00">28.08.19, 14:32</time></span><div class='quote '>Например? </div></div><br>
Например что у тебя factory-&gt;make_instance(...); будет работать не так, как ты ожидаешь.</div></div><br>
С чего вдруг?<br>
<br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>Тебе объясняют почему в принципе не нужен override, а ты объясняешь от чего он спасает. Так если не писать так, как ты показал - то нафиг этот override нужен то? :D</div></div><br>
Потому что это всего-лишь пример. Иллюстрация.<br>
Ты не всегда сможешь отследить изменение сигнатуры в реальном проекте. <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2019-08-28T14:45:53+00:00">28.08.19, 14:45</time></span></span><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413186&view=findpost&p=3808453'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Wound &#064; <time class="tag-quote__quoted-time" datetime="2019-08-28T14:40:21+00:00">28.08.19, 14:40</time></span><div class='quote '>Между прочим в С++ override появился сравнительно недавно. И до него как то не особо припомню вот таких вот проблем.</div></div><br>
А для чего добавили, на твой взгляд?<br>
<br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>Обычно все разруливалось ЮТ.</div></div><br>
Во-первых, ЮТ не являются частью языка. Во-вторых, я мало видел тестов, где бы кастили к базовому классу. Возможно, все кастят, а мне попадалось говно. Но это ничего на самом деле не меняет.]]></description>
        <author>D_KEY</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808453</guid>
        <pubDate>Wed, 28 Aug 2019 14:40:21 +0000</pubDate>
        <title>Rust vs C++</title>
        <link>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808453</link>
        <description><![CDATA[Wound: Между прочим в С++ override появился сравнительно недавно. И до него как то не особо припомню вот таких вот проблем. Обычно все разруливалось ЮТ. <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2019-08-28T14:41:14+00:00">28.08.19, 14:41</time></span></span><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413186&view=findpost&p=3808452'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>OpenGL &#064; <time class="tag-quote__quoted-time" datetime="2019-08-28T14:39:39+00:00">28.08.19, 14:39</time></span><div class='quote '>А причём тут вообще проектирование? override ему ортогонален совершенно.</div></div><br>
Ну как выяснилось у некоторых не ортогонален.]]></description>
        <author>Wound</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808452</guid>
        <pubDate>Wed, 28 Aug 2019 14:39:39 +0000</pubDate>
        <title>Rust vs C++</title>
        <link>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808452</link>
        <description><![CDATA[OpenGL: А причём тут вообще проектирование? override ему ортогонален совершенно.]]></description>
        <author>OpenGL</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808451</guid>
        <pubDate>Wed, 28 Aug 2019 14:37:58 +0000</pubDate>
        <title>Rust vs C++</title>
        <link>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808451</link>
        <description><![CDATA[Wound: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413186&view=findpost&p=3808450'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>D_KEY &#064; <time class="tag-quote__quoted-time" datetime="2019-08-28T14:32:23+00:00">28.08.19, 14:32</time></span><div class='quote '>Например? </div></div><br>
Например что у тебя factory-&gt;make_instance(...); будет работать не так, как ты ожидаешь. <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2019-08-28T14:39:26+00:00">28.08.19, 14:39</time></span></span><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413186&view=findpost&p=3808450'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>D_KEY &#064; <time class="tag-quote__quoted-time" datetime="2019-08-28T14:32:23+00:00">28.08.19, 14:32</time></span><div class='quote '>Это уже совсем из другой области вопрос.<br>
</div></div><br>
Ну не знаю, просто у вас тогда странный разговор получается. Тебе объясняют почему в принципе не нужен override, а ты объясняешь от чего он спасает. Так если не писать так, как ты показал - то нафиг этот override нужен то? :D]]></description>
        <author>Wound</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808450</guid>
        <pubDate>Wed, 28 Aug 2019 14:32:23 +0000</pubDate>
        <title>Rust vs C++</title>
        <link>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808450</link>
        <description><![CDATA[D_KEY: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413186&view=findpost&p=3808449'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Wound &#064; <time class="tag-quote__quoted-time" datetime="2019-08-28T14:24:00+00:00">28.08.19, 14:24</time></span><div class='quote '>может тебе сказать что у тебя не совпадают сигнатуры базового и производного методов.</div></div><br>
Так и я про то.<br>
<br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>Но использование его, еще не означает что ты проектируешь систему правильно.</div></div><br>
А кто говорит о проектировании систем?<br>
<br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>И раз у тебя возникают такие ошибки, и тебе помог override, значит скорее всего будут и другие ошибки, на которые синтаксического сахара не найдется. </div></div><br>
Например? <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2019-08-28T14:33:26+00:00">28.08.19, 14:33</time></span></span><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413186&view=findpost&p=3808449'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Wound &#064; <time class="tag-quote__quoted-time" datetime="2019-08-28T14:24:00+00:00">28.08.19, 14:24</time></span><div class='quote '>потому что надо писать вот так то и так то</div></div><br>
Это уже совсем из другой области вопрос.]]></description>
        <author>D_KEY</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808449</guid>
        <pubDate>Wed, 28 Aug 2019 14:24:00 +0000</pubDate>
        <title>Rust vs C++</title>
        <link>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808449</link>
        <description><![CDATA[Wound: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413186&view=findpost&p=3808448'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>D_KEY &#064; <time class="tag-quote__quoted-time" datetime="2019-08-28T14:16:49+00:00">28.08.19, 14:16</time></span><div class='quote '>Просто странный код будет  <br>
Я не понимаю, о чем ты сейчас. Мы говорим о пользе override. Я просто привел пример, когда он поможет. И все.</div></div><br>
Так ты прочитай что тебе написали в этом посте: <a class='tag-url' href='https://forum.sources.ru/index.php?showtopic=413186&view=findpost&p=3808312' target='_blank'>Rust vs C++ (сообщение #3808312)</a><br>
И потом посмотри что ты ответил.<br>
Тебе говорят, что override нафиг не нужен, например в той же Java, потому что надо писать вот так то и так то, вот об этом написано:<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413186&view=findpost&p=3808312'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>korvin &#064; <time class="tag-quote__quoted-time" datetime="2019-08-27T21:26:22+00:00">27.08.19, 21:26</time></span><div class='quote '>Зачем это всё? Чтобы лучше всё структурировать вместо каши из override и non-override методов, чтобы IDE лучше понимала семантику кода, в частности выполняла семантически более точный рефакторинг при изменении сигнатуры методов «родителей», который мы тут обсуждали. + один набор юнит-тестов на разные реализации. И при этом добавить некоторую гибкость в виде протоколов. Хз как там в ваших D/Rust/C#, но без аналога Go&#39;шных интерфейсов или OCaml&#39;овских object type&#39;ов в Java грустновато.</div></div><br>
А ты в ответ пишешь, что он будет делать, если забудет гдето там написать override.<br>
override - синтаксический сахар по сути, который просто лишний раз может тебе сказать что у тебя не совпадают сигнатуры базового и производного методов. Но использование его, еще не означает что ты проектируешь систему правильно. И раз у тебя возникают такие ошибки, и тебе помог override, значит скорее всего будут и другие ошибки, на которые синтаксического сахара не найдется. <br>
Ну это как скажем assert что ли. То что он есть, еще не спасает тебя от ошибок.]]></description>
        <author>Wound</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808448</guid>
        <pubDate>Wed, 28 Aug 2019 14:16:49 +0000</pubDate>
        <title>Rust vs C++</title>
        <link>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808448</link>
        <description><![CDATA[D_KEY: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413186&view=findpost&p=3808445'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Wound &#064; <time class="tag-quote__quoted-time" datetime="2019-08-28T13:18:59+00:00">28.08.19, 13:18</time></span><div class='quote '><strong class='tag-b'>D_KEY</strong>, вот представь я пишу все тоже самое, но у меня B не наследуется от А, ну просто два разных класса, с одинаковым методом. А потом вдруг кто то подумает и решит короче, B унаследовать от А, и заодно изменит вот как ты сигнатуру у А. Ну и все далее как у тебя. Что в этом случае не так? Тесты плохие? Или что?</div></div><br>
Просто странный код будет :D <br>
Я не понимаю, о чем ты сейчас. Мы говорим о пользе override. Я просто привел пример, когда он поможет. И все.]]></description>
        <author>D_KEY</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808445</guid>
        <pubDate>Wed, 28 Aug 2019 13:18:59 +0000</pubDate>
        <title>Rust vs C++</title>
        <link>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808445</link>
        <description><![CDATA[Wound: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413186&view=findpost&p=3808444'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>D_KEY &#064; <time class="tag-quote__quoted-time" datetime="2019-08-28T13:13:02+00:00">28.08.19, 13:13</time></span><div class='quote '>Это уже будет не юнит-тестирование.</div></div><br>
А что это будет?<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413186&view=findpost&p=3808444'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>D_KEY &#064; <time class="tag-quote__quoted-time" datetime="2019-08-28T13:13:02+00:00">28.08.19, 13:13</time></span><div class='quote '>Работу класса я тестирую.</div></div><br>
В таком случае у тебя нет ошибки. И поведение абсолютно предсказуемое. К чему претензия?  :D <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2019-08-28T13:21:15+00:00">28.08.19, 13:21</time></span></span><br>
<strong class='tag-b'>D_KEY</strong>, вот представь я пишу все тоже самое, но у меня B не наследуется от А, ну просто два разных класса, с одинаковым методом. А потом вдруг кто то подумает и решит короче, B унаследовать от А, и заодно изменит вот как ты сигнатуру у А. Ну и все далее как у тебя. Что в этом случае не так? Тесты плохие? Или что?]]></description>
        <author>Wound</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808444</guid>
        <pubDate>Wed, 28 Aug 2019 13:13:02 +0000</pubDate>
        <title>Rust vs C++</title>
        <link>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808444</link>
        <description><![CDATA[D_KEY: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413186&view=findpost&p=3808443'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Wound &#064; <time class="tag-quote__quoted-time" datetime="2019-08-28T13:09:32+00:00">28.08.19, 13:09</time></span><div class='quote '>Ну речь то зашла изначально про интефрейсы.</div></div><br>
Это обсуждение уже давно откололось от того :) <br>
<br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>У тебя в твоем примере тесты отличаются от реальной работы классов. Т.е. тесты живут своей жизнью, программа живет своей жизнью. Не совсем понятно что ты тестишь.</div></div><br>
Работу класса я тестирую.<br>
<br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '><br>
Раз ты у себя в коде пишешь:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">auto ptr= factory-&#62;make_instance(...);</div></ol></div></div></div></div><br>
Значит это же у тебя должно быть и в тестах</div></div><br>
Это уже будет не юнит-тестирование.]]></description>
        <author>D_KEY</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808443</guid>
        <pubDate>Wed, 28 Aug 2019 13:09:32 +0000</pubDate>
        <title>Rust vs C++</title>
        <link>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808443</link>
        <description><![CDATA[Wound: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413186&view=findpost&p=3808442'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>D_KEY &#064; <time class="tag-quote__quoted-time" datetime="2019-08-28T13:03:21+00:00">28.08.19, 13:03</time></span><div class='quote '>Ты о чем-то своем. Мы обсуждаем пользу override при рефакторинге. При чем тут интерфейсы? </div></div><br>
Ну речь то зашла изначально про интефрейсы. <br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413186&view=findpost&p=3808442'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>D_KEY &#064; <time class="tag-quote__quoted-time" datetime="2019-08-28T13:03:21+00:00">28.08.19, 13:03</time></span><div class='quote '>И часто ты в тестах такой каст делаешь?</div></div><br>
Какой такой каст делаю? Это обычный дин. полиморфизм называется. У тебя в твоем примере тесты отличаются от реальной работы классов. Т.е. тесты живут своей жизнью, программа живет своей жизнью. Не совсем понятно что ты тестишь. Посмотри на свои функции тестирования, и посмотри на использование:<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413186&view=findpost&p=3808438'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>D_KEY &#064; <time class="tag-quote__quoted-time" datetime="2019-08-28T12:21:39+00:00">28.08.19, 12:21</time></span><div class='quote '>    <div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">auto ptr= factory-&#62;make_instance(...);</div><div class="code_line">...</div><div class="code_line">    std::cout &#60;&#60; ptr-&#62;foo(10) &#60;&#60; std::endl;</div></ol></div></div></div></div></div></div><br>
Я не вижу использования классов A/B, зато я вижу нечто базовое, через которое может вызваться в зависимости от типа тот или другой метод.<br>
Раз ты у себя в коде пишешь:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">auto ptr= factory-&#62;make_instance(...);</div></ol></div></div></div></div><br>
Значит это же у тебя должно быть и в тестах. Либо на крайняк, если ты не хочешь тестировать фабрику, должно быть так, как я написал выше, а именно работа через базовый класс.]]></description>
        <author>Wound</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808442</guid>
        <pubDate>Wed, 28 Aug 2019 13:03:21 +0000</pubDate>
        <title>Rust vs C++</title>
        <link>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808442</link>
        <description><![CDATA[D_KEY: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413186&view=findpost&p=3808441'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Wound &#064; <time class="tag-quote__quoted-time" datetime="2019-08-28T12:54:20+00:00">28.08.19, 12:54</time></span><div class='quote '>В твоем примере слово virtual абсолютно бессмысленно.</div></div><br>
Ты о чем-то своем. Мы обсуждаем пользу override при рефакторинге. При чем тут интерфейсы? <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2019-08-28T13:04:00+00:00">28.08.19, 13:04</time></span></span><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413186&view=findpost&p=3808441'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Wound &#064; <time class="tag-quote__quoted-time" datetime="2019-08-28T12:54:20+00:00">28.08.19, 12:54</time></span><div class='quote '>присвоей его переменной базового класса А.</div></div><br>
И часто ты в тестах такой каст делаешь?]]></description>
        <author>D_KEY</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808441</guid>
        <pubDate>Wed, 28 Aug 2019 12:54:20 +0000</pubDate>
        <title>Rust vs C++</title>
        <link>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808441</link>
        <description><![CDATA[Wound: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413186&view=findpost&p=3808438'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>D_KEY &#064; <time class="tag-quote__quoted-time" datetime="2019-08-28T12:21:39+00:00">28.08.19, 12:21</time></span><div class='quote '>И тест</div></div><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413186&view=findpost&p=3808438'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>D_KEY &#064; <time class="tag-quote__quoted-time" datetime="2019-08-28T12:21:39+00:00">28.08.19, 12:21</time></span><div class='quote '>И его тест</div></div><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413186&view=findpost&p=3808438'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>D_KEY &#064; <time class="tag-quote__quoted-time" datetime="2019-08-28T12:21:39+00:00">28.08.19, 12:21</time></span><div class='quote '>Все ок, если создадим экземпляр B, то будет выведено &quot;B&quot;.</div></div><br>
В твоем примере слово virtual абсолютно бессмысленно. Создай подобие интерфейса и перепиши свой код вот так:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">struct Base</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; virtual string foo() const = 0;</div><div class="code_line">&nbsp;&nbsp; virtual ~Base() = 0;</div><div class="code_line">};</div></ol></div></div></div></div><br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">class A : public Base</div><div class="code_line">{</div><div class="code_line">public:</div><div class="code_line">&nbsp;&nbsp; &nbsp;virtual ~A() = default;</div><div class="code_line">&nbsp;&nbsp; &nbsp;virtual std::string foo() const</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;return &quot;A&quot;;</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">};</div></ol></div></div></div></div><br>
Потом перепиши тесты:<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">void testA()</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;std::uniqe_ptr&#60;Base&#62; pA = std::make_uniqe&#60;A&#62;();</div><div class="code_line">&nbsp;&nbsp; &nbsp;assert(pA-&#62;foo(10) == &quot;A&quot;);</div><div class="code_line">}</div></ol></div></div></div></div><br>
А вот после этого меняй сигнатуру. Тогда будет правильно. <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2019-08-28T13:02:09+00:00">28.08.19, 13:02</time></span></span><br>
Ну или хотя бы в тесте testB сделай динамическое создание класса B, присвоей его переменной базового класса А. У тебя ведь А базовый, присутствуют виртуальные функции. Соответственно ты будешь работать с базовым классом, а не напрямую с B/A.]]></description>
        <author>Wound</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808438</guid>
        <pubDate>Wed, 28 Aug 2019 12:21:39 +0000</pubDate>
        <title>Rust vs C++</title>
        <link>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808438</link>
        <description><![CDATA[D_KEY: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413186&view=findpost&p=3808312'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>korvin &#064; <time class="tag-quote__quoted-time" datetime="2019-08-27T21:26:22+00:00">27.08.19, 21:26</time></span><div class='quote '>Давай пример кодом: как было до рефакторинга, как стало и что не так, а то я что-то не могу понять, на что ты жалуешься.</div></div><br>
Ну вот был такой класс:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">class A</div><div class="code_line">{</div><div class="code_line">public:</div><div class="code_line">&nbsp;&nbsp; &nbsp;virtual ~A() = default;</div><div class="code_line">&nbsp;&nbsp; &nbsp;virtual std::string foo() const</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;return &quot;A&quot;;</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">};</div></ol></div></div></div></div><br>
<br>
И тест<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">void testA()</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;A a;</div><div class="code_line">&nbsp;&nbsp; &nbsp;assert(a.foo() == &quot;A&quot;);</div><div class="code_line">}</div></ol></div></div></div></div><br>
<br>
И вот какой-то из наследников:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">class B: public A</div><div class="code_line">{</div><div class="code_line">public:</div><div class="code_line">&nbsp;&nbsp; &nbsp;virtual std::string foo() const</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;return &quot;B&quot;;</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">};</div></ol></div></div></div></div><br>
<br>
И его тест<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">void testB()</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;B b;</div><div class="code_line">&nbsp;&nbsp; &nbsp;assert(b.foo() == &quot;B&quot;);</div><div class="code_line">}</div></ol></div></div></div></div><br>
<br>
В реальном коде используем как-то так:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">&nbsp;&nbsp; &nbsp;auto ptr= factory-&#62;make_instance(...);</div><div class="code_line">...</div><div class="code_line">&nbsp;&nbsp; &nbsp;std::cout &#60;&#60; ptr-&#62;foo() &#60;&#60; std::endl;</div></ol></div></div></div></div><br>
<br>
Все ок, если создадим экземпляр B, то будет выведено &quot;B&quot;.<br>
<br>
Теперь рефакторили и заменили сигнатуру:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">class A</div><div class="code_line">{</div><div class="code_line">public:</div><div class="code_line">&nbsp;&nbsp; &nbsp;virtual ~A() = default;</div><div class="code_line">&nbsp;&nbsp; &nbsp;virtual std::string foo(int x) const</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;return &quot;A&quot;;</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">};</div></ol></div></div></div></div><br>
<br>
Подправили тесты:<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">void testA()</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;A a;</div><div class="code_line">&nbsp;&nbsp; &nbsp;assert(a.foo(10) == &quot;A&quot;);</div><div class="code_line">}</div></ol></div></div></div></div><br>
<br>
Подправили использование:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">&nbsp;&nbsp; &nbsp;auto ptr= factory-&#62;make_instance(...);</div><div class="code_line">...</div><div class="code_line">&nbsp;&nbsp; &nbsp;std::cout &#60;&#60; ptr-&#62;foo(10) &#60;&#60; std::endl;</div></ol></div></div></div></div><br>
<br>
Подправили тех наследников, о которых помнили.<br>
А вот про B забыли.<br>
<br>
В результате, теперь в случае экземпляра B, выводиться будет A.<br>
<br>
И, внезапно, если бы там был override, то компилятор бы ругался и никакой проблемы бы не возникло. <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2019-08-28T12:33:33+00:00">28.08.19, 12:33</time></span></span><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413186&view=findpost&p=3808312'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>korvin &#064; <time class="tag-quote__quoted-time" datetime="2019-08-27T21:26:22+00:00">27.08.19, 21:26</time></span><div class='quote '>Зачем это всё? Чтобы лучше всё структурировать вместо каши из override и non-override методов, чтобы IDE лучше понимала семантику кода, в частности выполняла семантически более точный рефакторинг при изменении сигнатуры методов «родителей», который мы тут обсуждали. + один набор юнит-тестов на разные реализации. И при этом добавить некоторую гибкость в виде протоколов.</div></div><br>
Я правильно понимаю, что это все потребует нового языка? :D <br>
<br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>Хз как там в ваших D/Rust/C#, но без аналога Go&#39;шных интерфейсов или OCaml&#39;овских object type&#39;ов в Java грустновато.</div></div><br>
Вот тут не понял. Зачем тебе goшные интерфейсый в java?<br>
<br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '><em class='tag-i'><br>
Но это только интерфейсы, осталось разобрать наследование реализаций (классов)…</em> </div></div><br>
Это будет ближе к практике? <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2019-08-28T12:39:53+00:00">28.08.19, 12:39</time></span></span><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413186&view=findpost&p=3808438'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>D_KEY &#064; <time class="tag-quote__quoted-time" datetime="2019-08-28T12:21:39+00:00">28.08.19, 12:21</time></span><div class='quote '>И, внезапно, если бы там был override, то компилятор бы ругался и никакой проблемы бы не возникло.</div></div><br>
Изначальный пример <a class='tag-url' href='http://ideone.com/cac3Ss' target='_blank'>http://ideone.com/cac3Ss</a><br>
После рефакторинга <a class='tag-url' href='http://ideone.com/kuCrur' target='_blank'>http://ideone.com/kuCrur</a><br>
Если бы был override <a class='tag-url' href='http://ideone.com/SieIBM' target='_blank'>http://ideone.com/SieIBM</a><br>
<br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>error: ‘std::__cxx11::string B::foo() const’ marked ‘override’, but does not override<br>
     std::string foo() const override</div></div>]]></description>
        <author>D_KEY</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808364</guid>
        <pubDate>Wed, 28 Aug 2019 06:40:54 +0000</pubDate>
        <title>Rust vs C++</title>
        <link>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808364</link>
        <description><![CDATA[applegame: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413186&view=findpost&p=3808304'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Qraizer &#064; <time class="tag-quote__quoted-time" datetime="2019-08-27T19:55:12+00:00">27.08.19, 19:55</time></span><div class='quote '>Сиречь придумали универсальный протокол, придерживаться которого должны обе стороны.Ага?</div></div>Более-менее придумали.]]></description>
        <author>applegame</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808316</guid>
        <pubDate>Tue, 27 Aug 2019 23:38:03 +0000</pubDate>
        <title>Rust vs C++</title>
        <link>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808316</link>
        <description><![CDATA[Qraizer: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413186&view=findpost&p=3808309'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>korvin &#064; <time class="tag-quote__quoted-time" datetime="2019-08-27T20:24:20+00:00">27.08.19, 20:24</time></span><div class='quote '>Тест должен тестировать класс целиком, а не только новые (по сравнению с базовым классом) методы.</div></div>Зачем? На эти методы можно натравить имеющиеся тесты.]]></description>
        <author>Qraizer</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808312</guid>
        <pubDate>Tue, 27 Aug 2019 21:26:22 +0000</pubDate>
        <title>Rust vs C++</title>
        <link>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808312</link>
        <description><![CDATA[korvin: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413186&view=findpost&p=3808307'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>korvin &#064; <time class="tag-quote__quoted-time" datetime="2019-08-27T20:13:23+00:00">27.08.19, 20:13</time></span><div class='quote '><em class='tag-i'>…Продолжение последовало</em></div></div><br>
<br>
Теперь выделим оба варианта в отдельные сущности следующим образом:<br>
– для первого варианта будем использовать interface, дополнив её опциональным контрактом<br>
– для второго введём новую сущность и назовём её, например, protocol<br>
– для поддержки первого варианта классы теперь не могут быть использованы в качестве типа переменной, только интерфейсы и протоколы<br>
– класс не может быть просто унаследован от другого класса без описания расширенного интерфейса<br>
<br>
Для примера возьмём Iterable, Iterator, Set, HashSet и TreeSet из java.util. Рассмотрим только небольшое подмножество реализованных в JDK методов. Так же опустим некоторые детали реализаций, типа требования имплементации Comaparable для элементов TreeSet.<br>
<br>
Set у нас будет interface, Iterable — protocol, HashSet и TreeSet — классами, реализующими Set и удовлетворяющими Iterable. Т.е. в псевдо-Java:<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">package jdk.collections</div><div class="code_line">&nbsp;</div><div class="code_line">import jdk.iter.Iterator // Note: not Iterable but Iterator</div><div class="code_line">&nbsp;</div><div class="code_line">public interface Set&#60;A&#62; {</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;int size()</div><div class="code_line">&nbsp;&nbsp; &nbsp;boolean add(A a)</div><div class="code_line">&nbsp;&nbsp; &nbsp;boolean remove(A a)</div><div class="code_line">&nbsp;&nbsp; &nbsp;Iterator&#60;A&#62; iterator() // Note that Set is not extending/implementing/whatever-relating-to Iterable so no &quot;override&quot; needed</div><div class="code_line">} contract {</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;void should_not_contain_duplicates() {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;...</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">}</div></ol></div></div></div></div><br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">package jdk.collections</div><div class="code_line">&nbsp;</div><div class="code_line">class HashSet&#60;A&#62; implements Set&#60;A&#62; {</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;// fields and constructors</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;// no need for &quot;override&quot; or specifying &quot;public&quot;</div><div class="code_line">&nbsp;&nbsp; &nbsp;// because all not-private methods are implementations of Set interface only</div><div class="code_line">&nbsp;&nbsp; &nbsp;int size() {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;...</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;boolean add(A a) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;...</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;boolean remove(A a) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;...</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;Iterator&#60;A&#62; iterator() {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;...</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;// private helping methods if needed</div><div class="code_line">&nbsp;&nbsp; &nbsp;// private methods are not comming from Set and do not override any Set method by design</div><div class="code_line">&nbsp;&nbsp; &nbsp;// so no need for &quot;override&quot;</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;// Same thing: java.iter.Iterator is an interface</div><div class="code_line">&nbsp;&nbsp; &nbsp;private class Iterator&#60;A&#62; implements java.iter.Iterator&#60;A&#62; {</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;// some implementation</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">}</div></ol></div></div></div></div><br>
<br>
И то же самое для TreeSet, только с другой внутренней реализацией, само собой.<br>
<br>
Далее мы имеем protocol Iterable, определённый где-то в дргуом месте:<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">package jdk.iter</div><div class="code_line">&nbsp;</div><div class="code_line">protocol Iterable&#60;A&#62; {</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;Iterator&#60;A&#62; iterator()</div><div class="code_line">}</div></ol></div></div></div></div><br>
<br>
и далее используем это всё вместе:<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">package my.coolapp</div><div class="code_line">&nbsp;</div><div class="code_line">import jdk.collections.*</div><div class="code_line">import jdk.iter.*</div><div class="code_line">&nbsp;</div><div class="code_line">public void main(String[] args) {</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;HashSet&#60;String&#62; words = new HashSet&#60;&#62;() &nbsp;// -- compilation error: class cannot be used as a type</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;Set&#60;String&#62; words = new HashSet&#60;&#62;() &nbsp; &nbsp; &nbsp;// -- ok</div><div class="code_line">&nbsp;&nbsp; &nbsp;var words = new HashSet&#60;String&#62;() &nbsp; &nbsp; &nbsp; &nbsp;// -- ok, the type of words is Set&#60;String&#62;</div><div class="code_line">&nbsp;&nbsp; &nbsp;Iterable&#60;String&#62; words = new HashSet&#60;&#62;() // -- ok since Set has a method `Iterator&#60;A&#62; iterator()` which is required by Iterable</div><div class="code_line">}</div></ol></div></div></div></div><br>
<br>
Зачем это всё? Чтобы лучше всё структурировать вместо каши из override и non-override методов, чтобы IDE лучше понимала семантику кода, в частности выполняла семантически более точный рефакторинг при изменении сигнатуры методов «родителей», который мы тут обсуждали. + один набор юнит-тестов на разные реализации. И при этом добавить некоторую гибкость в виде протоколов. Хз как там в ваших D/Rust/C#, но без аналога Go&#39;шных интерфейсов или OCaml&#39;овских object type&#39;ов в Java грустновато.<br>
<em class='tag-i'><br>
Но это только интерфейсы, осталось разобрать наследование реализаций (классов)…</em> <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2019-08-27T21:28:24+00:00">27.08.19, 21:28</time></span></span><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413186&view=findpost&p=3808311'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>D_KEY &#064; <time class="tag-quote__quoted-time" datetime="2019-08-27T21:05:53+00:00">27.08.19, 21:05</time></span><div class='quote '>Включил. И они проходят, потому что теперь тестируют методы нового класса. </div></div><br>
Я таки не понимаю, что тебя не устраивает: тесты проходят, значит поведение осталось корректым. Если тесты проходят, но поведение некорректно, значит тесты некорректны.<br>
<br>
Давай пример кодом: как было до рефакторинга, как стало и что не так, а то я что-то не могу понять, на что ты жалуешься.]]></description>
        <author>korvin</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808311</guid>
        <pubDate>Tue, 27 Aug 2019 21:05:53 +0000</pubDate>
        <title>Rust vs C++</title>
        <link>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808311</link>
        <description><![CDATA[D_KEY: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413186&view=findpost&p=3808309'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>korvin &#064; <time class="tag-quote__quoted-time" datetime="2019-08-27T20:24:20+00:00">27.08.19, 20:24</time></span><div class='quote '>Ты не включил в тесты производного класса тестирование методов из базового?</div></div><br>
Включил. И они проходят, потому что теперь тестируют методы нового класса.]]></description>
        <author>D_KEY</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808309</guid>
        <pubDate>Tue, 27 Aug 2019 20:24:20 +0000</pubDate>
        <title>Rust vs C++</title>
        <link>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808309</link>
        <description><![CDATA[korvin: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413186&view=findpost&p=3808308'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>D_KEY &#064; <time class="tag-quote__quoted-time" datetime="2019-08-27T20:17:10+00:00">27.08.19, 20:17</time></span><div class='quote '>При использовании через базовый класс/интерфейс не будет</div></div><br>
Ты не включил в тесты производного класса тестирование методов из базового? Плохой тест. Тест должен тестировать класс целиком, а не только новые (по сравнению с базовым классом) методы. Плохие тесты.]]></description>
        <author>korvin</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808308</guid>
        <pubDate>Tue, 27 Aug 2019 20:17:10 +0000</pubDate>
        <title>Rust vs C++</title>
        <link>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808308</link>
        <description><![CDATA[D_KEY: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413186&view=findpost&p=3808307'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>korvin &#064; <time class="tag-quote__quoted-time" datetime="2019-08-27T20:13:23+00:00">27.08.19, 20:13</time></span><div class='quote '>Значит и использование классов будет продолжать быть корректным.</div></div><br>
При использовании через базовый класс/интерфейс не будет :) <br>
<br>
Портянки твои завтра уже прочитаю скорее всего :)]]></description>
        <author>D_KEY</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808307</guid>
        <pubDate>Tue, 27 Aug 2019 20:13:23 +0000</pubDate>
        <title>Rust vs C++</title>
        <link>https://forum.sources.ru/index.php?showtopic=413186&amp;view=findpost&amp;p=3808307</link>
        <description><![CDATA[korvin: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413186&view=findpost&p=3808194'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>D_KEY &#064; <time class="tag-quote__quoted-time" datetime="2019-08-27T07:03:05+00:00">27.08.19, 07:03</time></span><div class='quote '>Подожди.</div></div><br>
<br>
Вот смотри, рассмотрим сначала на примере интерфейсов и Java.<br>
Здесь и далее одиночное слово «интерфейс» подразумевает собственно сущность «интерфейс», объявляемую ключевым словом interface, а словосочетание «интерфейс класса» — набор всех публичных методов класса. protected и package-private не будем рассматривать для простоты. private методы во всей этой вакханалии не участвуют по определению. =)<br>
Методы, унаследованные от java.lang.Object тоже опустим, предположим, что любой объявляемый без указания родителя класс не имеет никаких унаследованных публичных методов. Как в C++, в общем.<br>
<br>
Интерфейсы могут использоваться для двух конкретных целей:<br>
<br>
<strong class='tag-b'>1. Поиметь несколько реализаций одного интерфейса под разные случаи жизни</strong><br>
Классы в этом случае<br>
– реализуют только этот один публичный интерфейс<br>
– не имеют публичных методов сверх того<br>
– да и сами не публичны<br>
<br>
Пример: java.util.Iterator, его имплементации обычно <br>
– не реализуют никаких других публичных интерфейсов<br>
– не имеют других публичных методов<br>
– являются приватными классами коллекций, для которых реализуют итерацию<br>
<br>
<strong class='tag-b'>2. «Сузить» интерфейс класса для частных случаев</strong><br>
Например, некий класс MutableQueue может реализовывать интерфейсы ReadableQueue и WritableQueue и использоваться в том или ином качестве по ситуации: одним клиентам будет отдаваться интерфейс только для чтения, другим — только для записи, а где-то будет использоваться и сам класс MutableQueue. Либо клиентам может отдаваться ещё более узкий интерфейс, например Iterable вместо конкретного ArrayList, используемого в качестве приватного поля объекта-контейнера.<br>
<br>
<br>
Так вот, в первом варианте, при строгом соответствии класса единственному интерфейсу такой автоматический рефакторинг сигнатур всех имплементаций оправдан и хорош. По крайней мере, если интерфейс не является частью SDK или какой-нибудь широкоиспользуемой библиотекой, и такое изменение не приведёт к необходимости изменения кучи стороннего кода самых разных людей, потере клиентов, банкротству твоего бизнеса и прочим катаклизмам. Да, придётся починить все имплементации, но само изменение будет семантически корректным.<br>
<br>
<em class='tag-i'>К слову, мы как-то обсуждали тесты для интерфейсов, вот это как раз тот случай, когда неплохо б иметь некоторый контракт для интерфейса в виде юнит-теста и автоматически запускать для всех реализаций, чтобы убедиться, что они ему следуют.</em><br>
<br>
Во втором же варианте, фактическим интерфейсом будет неявный собственный <em class='tag-i'>интерфейс класса</em>, а дополнительные, «сужающие» интерфейсы — это просто некоторые аспекты (не имеет отношения к АОП), адаптации использования этого класса, фактически они выбирают из класс(а|ов) методы, а не класс реализует их методы, хоть это так выглядит, а значит нельзя просто взять и автоматически менять методы наследников при рефакторинге.<br>
<br>
Естественно на практике часто бывают не только два этих крайних варианта, но и разного рода смеси.<br>
<br>
<em class='tag-i'>To be continued…</em> <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2019-08-27T20:14:18+00:00">27.08.19, 20:14</time></span></span><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413186&view=findpost&p=3808297'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>D_KEY &#064; <time class="tag-quote__quoted-time" datetime="2019-08-27T19:28:37+00:00">27.08.19, 19:28</time></span><div class='quote '>Они же, вероятно, как раз дергают методы класса, который тестируют, а не базового класса, и это нормально. И такие тесты будут продолжать проходить.</div></div><br>
Значит и использование классов продолжить быть корректной. В чём проблема?]]></description>
        <author>korvin</author>
        <category>Holy Wars</category>
      </item>
	
      </channel>
      </rss>
	