2016-09-04 20 views
1

В своем посте SOLID: the next step is Functional Марк Seemann заявляет:Является ли класс с только одной связью?

Если вы продолжите движение вашего дизайна в стороне меньших и меньших интерфейсов, вы будете в конечном итоге прийти к конечному Role интерфейса: интерфейс с одним методом [... ] Если вы применяете SRP и ISP, как это, вы, скорее всего, разработаете базу кода со многими мелкозернистыми классами, каждая из которых имеет один метод. Это случилось со мной не раз.

Моя забота о сплочении таких классов. Подходит ли этот подход к функциональной связности? Являются ли эти классы непригодными? Есть ли плохое влияние на когерентность кода?

+1

Отсутствие сплоченности означает «делать слишком много вещей», «иметь слишком много обязанностей». Наличие только одного метода коррелирует с меньшим количеством обязанностей - до тех пор, пока вы не сделаете этот метод методом uber-do-all. – slim

ответ

2

Там отличное определение сплоченности, представленное в книге Growing object oriented software guided by tests, который гласит следующее: сплочение

Элемента является мерой ли своими обязанностями формы значимой единицы. Например, класс, который анализирует обе даты и URL-адреса, не является согласованным, потому что это не связанные понятия. Подумайте о машине, которая стирает как одежду, так и посуду - это вряд ли будет делать и . С другой стороны, класс, который анализирует только пунктуацию в URL-адресе, вряд ли будет согласованным, поскольку он не представляет собой целую концепцию . Чтобы все было сделано, программисту придется найти других парсеров для протокола, хоста, ресурса и т. Д. Особенности с «высокая» когерентность проще в обслуживании.

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

В функциональном стиле наличие таких классов имеет большой смысл. Речь идет о создании функций для достижения результата. C# делает этот стиль возможным, но также довольно многословным, поэтому я полностью согласен с Seemann, когда он утверждает, что F # в том случае, если вы все равно разрабатываете свою кодовую базу.

Вопрос о том, хороший или плохой дизайн является субъективным, но я думаю, что мы можем сказать несколько вещей объективно. Один из классов методов по своей природе почти гарантированно соблюдает SRP (конечно, вы все равно можете пропустить точку и сделать классы богов с помощью всего мощного метода). Таким образом, код, написанный таким образом, должен обладать всеми преимуществами, которые мы ожидаем, т.е. быть свободно связанными, составными и поддерживаемыми. Но есть что сказать и о том, чтобы потерять большую картину такого кода.

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

 Смежные вопросы

  • Нет связанных вопросов^_^