Pull to refresh
36
0

Пользователь

Send message
Частоту звука нельзя задавать напрямую, но можно задавать косвенно через число тактов процессора до перехода к следующей фазы звуковой волны. Там есть формулы, превращающие t в герцы. А шум треугольный, потому что если это вывести на график, получится набор треугольников. Там должна быть картинка.

Обычно это такие же мечтатели, как и я.

Иногда так и делаю. Проводил даже как-то провести конкурс на переименование класса, когда не мог определиться.

Подумав, одобрил этот комментарий, но вы ходите по очень тонкому льду.

Канал дельта-модуляции позволяет ручками выставить любое значение. Цена — вся вычислительная мощь приставки.

«Сладкие конфеты минутных послаблений нейтрализуют горечь несбывшихся надежд» (с)
А мне кажется, они скорее дополняют друг друга. SOLID — пиши с учётом тех изменений, которые скорее всего будут. YAGNI — игнорируй изменения, которых скорее всего не будет. Затык тут в «скорее всего», потому что будущее мы предсказывать не умеем.
Видел я как-то код, который подстраивается под все возможные изменения, которые только могут случиться. Поверьте, человеку, который это писал сильно повезло, что я не психопат, знающий, где он живёт.
Я вроде как мельком коснулся абстракции в разделе «ООП вкратце», хоть и не назвал её по имени. И нет, пока никакой второй части. Честно говоря, я как-то удивлён тому факту, что я первую часть дописал. Что-то оно чуть-чуть вышло из-под контроля в плане объёма. Надо было догадаться, что писать «про всё на свете» идея слишком объёмная.
Эта структура не обязана выражаться в классах. Точно так же ее можно выражать в хорошем коде внутри классов.

Больше скажу, так и надо делать. Это упростит их разделение, когда классы всё же придётся разделить из-за их размера, чтобы их было проще воспринимать. И да, принцип единственной ответственности точно так же хорошо применяется и к методам. Например, метод LoadAndInit хороший кандидат на превращение в два метода Load и Init. Так как тут даже в названии намёк на два разных процесса, которые могут поменяться по разным причинам.
Учитывая, что этот класс уже используется другими модулями, возможно после того как вместо одного класса появится две иерархии, другим программистам придется вносить изменения в свои модули. Эти изменения не потребовались бы, если бы мы сразу подумали о том что БД и файлы могут быть разными.

Да, именно об этом и говорится. Смешивание разных ответственностей — ошибка проектирования. И чем раньше её починить, тем дешевле это обойдётся. Как и с любой ошибкой. Идеально — ещё до того, как возникла. Хорошо — до того, как её исправление начнёт обходиться слишком дорого.
Видимо «сделать так, чтобы код читался, как предложение на английском языке» было ну такой себе идеей. К сожалению, к середине статьи меня окончательно понесло и останавливаться было уже поздно.
Есть сборка. Она большая. И имеет на это право, так как сборка — это единица развёртывания, а для логического группирования классов есть пространства имён. И у этой сборки маленький контракт с внешним миром сводящийся к нескольким простым действиям. У нас много-много классов internal, которые мы не хотим оставлять без юнит-тестов. Особенно, если мы угораем по TDD, где 100% покрытие кода, написание тестов до самого кода и прочий хардкор. Вот тут-то и встаёт дилемма, которую я описал в статье.

Если какая-то внутренняя логика требует отдельного тестирования, то может вынести ее (логику) в отдельный класс?

Да, так и нужно сделать. Но, скорее всего, этот класс будет internal, так как в контракт с внешним миром не входит. Речь не о том, чтобы тестировать потроха классов. Речь о том, чтобы тестировать классы и их, скажем так, не очень внутренние методы.
Доползу домой, внесу это уточнение в статью. На которое, кстати, уже обратили внимание выше. Но да, в том же Троелсене эта возможность напрямую не упоминается, так как кому в здравом уме может такое прийти в голову (в стандартной ситуации, инструменты анализа кода — отдельная песня). Хотя тот факт, что в метаданных хранятся не только открытые типы и их члены, там отражён, хоть и мельком. Надо будет ещё перечитать Рихтера.

UPD. Добавил уточняющий абзац в статью.
Это уже между уровнями «защищаемся от дураков чуть тщательнее» и «включаем полную паранойю вплоть до обфускации кода». Вопрос в том, уважают ли другие декомпиляторы этот атрибут.

Ответил выше BratSin'у. На самом деле, не так уж и страшно, если честно, но парочка аргументов в пользу более строгого подхода всё же нашлось.

С учётом того, что мы уже в комментариях накопали, не так уж и сильно он не прав, соглашусь. Но ещё пару моментов я по этому поводу вижу:
1) Это собьёт с толку того, кто читает код и вызовет ненужные вопросы.
2) Если модификатор доступа у класса изменится на public, то модификаторам метода лучше оставаться по умолчанию internal, пока программист не решит, что метод тоже можно открыть внешнему миру и явно не выскажет это пожелание, внеся изменение internal на public у метода в ближайшем коммите…

А явно указывать методу GetMethods и прочим, чтобы они гребли и не открытые члены тоже без острой на той надобности, не очень хорошо. Там уже в комментариях написали, что если вы так делаете, и у вас потом что-то сломалось, что ССЗБ.
Я знал, что комментарии к этой статье будут полезнее самой статьи.
Что до internal, то я вижу дело так: рефлексия копает метаданные -> в метаданных из модификаторов доступа флаги Public/Non-public -> internal помечается как non-public. Отсюда вывод: надо взять Visual Studio и проверить. Но сто рублей на то, что от копания в internal это тоже защитит, я бы рискнул поставить.
Наткнулся, заинтересовался, начал копать и тут понеслось… Возможно, часть статьи, связанную с рефлексией и в самом деле стоило подсократить. Или наоборот, покопать поглубже и поосновательнее.
Ну, тут три варианта:
1) Вы открытым текстом просите положить болт на инкапсуляцию, потому что вы знаете, что вы делаете.
2) Вы открытым текстом просите положить болт на инкапсуляцию, потому что вы думаете, что вы знаете, что вы делаете.
3) Вы пишите какой-то инструмент анализа кода, которому действительно нужно залезть в потроха ваших сборок. Ещё один случай использования рефлексии, о котором я почему-то не подумал.
Из этих трёх проблему представляет только второй вариант. И это является проблемой даже без рефлексии.

Information

Rating
Does not participate
Location
Минск, Минская обл., Беларусь
Date of birth
Registered
Activity