Я думал об этом также и ответе, который удовлетворяет меня, большинство - то, что ICollection имеет много методов кроме, Добавляют, такие как: Очиститесь, Содержит, CopyTo, и Удалить. Удаление элементов или очистка не имеют никакого отношения к способности поддерживать объектный синтаксис инициализатора, все, в чем Вы нуждаетесь, Добавление ().
, Если бы платформа была разработана детализировано достаточно, и был интерфейс ICollectionAdd, то это имело бы "идеальный" дизайн. Но я честно не думаю, что это добавило бы много значения, имея один метод на интерфейс. IEnumerable + Добавляют, походит на подход hackish, но когда Вы думаете об этом, это - лучшая альтернатива.
РЕДАКТИРОВАНИЕ: Это не единственное время, C# приблизился к проблеме с этим типом решения. Начиная с.NET 1.1, foreach использует утиный ввод для перечисления набора, весь класс должен реализовать, GetEnumerator, MoveNext и Текущий. Kirill Osenkov имеет сообщение , который задает Ваш вопрос также.
Некоторые тесты модульности:
Для получения дополнительных идей ознакомьтесь с этим , а этот - по качеству программного обеспечения
Что касается вашего забота о том, чтобы сделать ваш код более модульным , сначала вы должны задать себе вышеуказанные вопросы, получить на них конкретные ответы, а затем взглянуть на this
Основная философия - чтобы разбить ваше приложение на как можно более маленькие фрагменты кода, аккуратно расположенные по множеству легко понятных и доступных макетов каталогов.
Каждый метод в вашем приложении не должен выполнять больше, чем требуется минимальная необходимая обработка ]. Объединение этих методов во все больше и больше методов макроуровня должно вернуть вас к вашему приложению
Чтобы ответить на ваш конкретный вопрос о , как сделать код более модульным, можно предложить несколько подходов:
Один из лучших инструментов для модульности - определение повторного кода. использовать. Если вы обнаружите, что ваш код выполняет одну и ту же (или очень похожую) вещь более чем в одном месте, это хороший кандидат для модуляции.
Определите, какие части логики можно сделать независимыми, в том смысле, что другая логика могла бы используйте их, не зная, как они устроены. Это в некоторой степени похоже на то, что вы делаете в объектно-ориентированном дизайне, хотя модуль / компонент не обязательно должен соответствовать моделируемому объекту, как в объектно-ориентированном проектировании.
Ключевые моменты:
Хороший пример такой модульной системы стандартные автомобильные детали, такие как дисковые тормоза и автомагнитола. Когда вы строите автомобили, вам не захочется строить автомагнитолу с нуля. Вы бы предпочли купить его и подключить. Вы также не хотите, чтобы тормозная система влияла на автомобильную стереосистему - или, что еще хуже, автомобильная стереосистема влияла на тормозную систему.
Чтобы ответить на ваш вопрос: «Как мне решить этот конкретный код» является модульным до такой степени ", мы можем формировать вопросы для проверки модульности. Можете ли вы легко заменить свои модули чем-нибудь другим, не затрагивая другие части вашего приложения?
Другим примером могут быть синтаксические анализаторы XML. Как только вы получите интерфейс DOM, вам действительно все равно, какая реализация XML-парсера будет использоваться под ним (например, Apache Xerces или JAXP).
В Java может возникнуть другой вопрос: Все ли функции доступны через интерфейс
s? Интерфейс в значительной степени заботится о низкой связи.
Кроме того, можете ли вы описать каждый модуль в вашей системе одним предложением? Например, автомобильная стереосистема воспроизводит музыку и радио. Дисковые тормоза безопасно замедляют автомобиль.
(Вот что я написал в Что такое разработка, управляемая компонентами? )
Согласно Википедии, разработка на основе компонентов является псевдонимом для Разработка программного обеспечения на основе компонентов (CBSE) .
[Это] раздел программного обеспечения инжиниринг, приоритетом которого является разделение ответственности в отношении широкого функционала доступно в рамках данного программного обеспечения система.
Это несколько расплывчато, поэтому давайте рассмотрим более подробную информацию.
Отдельный компонент - это программное обеспечение пакет или модуль, который инкапсулирует набор связанных функции (или данные).
Все системные процессы помещаются в отдельные компоненты, чтобы все данные и функции внутри каждого компоненты семантически связаны (как и в случае с содержимым классы). Благодаря этому принципу часто говорят, что компоненты модульный и сплоченный .
Итак, согласно этому определению, компонент может быть любым, если он действительно хорошо выполняет одну задачу и только одну вещь.
Что касается общесистемной координация, компоненты общаются друг с другом через интерфейсы . [...] В результате этого принципа компоненты, называемые инкапсулированные .
Таким образом, это все больше и больше похоже на то, что мы думаем о хорошем API или SOA.
Предоставленные интерфейсы представлены леденцом, а требуются интерфейсы - представлен символом открытого сокета, прикрепленным к внешнему краю компонента в UML.
Еще один важный атрибут компоненты в том, что они заменяемый , так что компонент может быть заменен другим (при время разработки или время выполнения), если требования к исходному компоненту (выраженные через интерфейсы) выполнены компонентом-преемником.
Повторное использование является важным характеристика высокого качества программная составляющая. Программное обеспечение компонент должен быть разработан и реализован так, чтобы его можно было использовать повторно во многих различных программах.
Возможность замены и повторного использования - вот что делает компонент компонентом. Так в чем же разница между этим и объектно-ориентированным программированием?
Идея объектно-ориентированного программирования программирование (ООП) - это программное обеспечение следует писать в соответствии с ментальная модель реального или воображаемого объекты, которые он представляет. [...]
Разработка программного обеспечения на основе компонентов, напротив, не делает таких предположения, и вместо этого заявляет, что программное обеспечение следует разрабатывать путем склеивания сборные компоненты вместе много как в области электроники или механика.
Поскольку это было помечено как 'osgi', я могу добавить точку зрения, связанную с OSGi.
Короткий ответ состоит в том, что можно перейти от полностью спагетти-кода к модульному в маленькие шаги; это не обязательно должно быть большим взрывом. Например, даже код спагетти зависит от какой-то библиотеки журналов болонского языка, так что в некотором смысле он уже модульный, только с одним очень большим шариком (извините, модуль) в нем.
Хитрость состоит в том, чтобы разбить большую фрикадельку на один кусок меньшего размера, затем немного меньшего размера фрикаделька, а затем рекурсивно. Необязательно делать все за один раз; просто отколите немного больше каждый раз, пока не останется ничего, что можно было бы удалить.
Что касается OSGi, все еще можно поместить uber-jar в связку. Фактически, вы можете сделать это, не меняя биты; либо изменив Manifest.MF на месте, либо обернув его в другой JAR и указав в манифесте Bundle-ClassPath: metaball.jar.
В противном случае такие инструменты, как BND, могут помочь сгенерировать нужные данные, а затем его достаточно легко можно будет отбросить в среде выполнения OSGi. Но будьте осторожны с излишне связанным кодом и прочим мусором с загрузчиками классов - они вас сбивают с толку.
Если я понимаю ваш вопрос, вы хотите знать, что делает код модульным, поскольку модули кода, очевидно, нуждаются в некоторой зависимости друг от друга, чтобы вообще работать. Это мой ответ:
Если вы можете разбить свою систему на модули и тестировать эти модули изолированно, это хороший признак того, что система является модульной.
Как вы говорите, модульность - это не двоичная вещь, поэтому она зависит от вашего относительного определения.
Я бы сказал: можете ли вы использовать данный метод в любой программе, где вам нужно выполнить эту функцию ? Это «черный ящик», где вам не нужно знать, что он творит под капотом? Если ответ отрицательный, т.е. метод будет правильно работать только в этой программе, тогда он не является истинно модульным.
Вы можете использовать инструмент анализа кода, такой как CAP , для анализа зависимостей между типами и пакетами. Они помогут вам найти и удалить любые циклические зависимости, которые часто становятся проблемой при разработке модульного кода. Если нет циклических зависимостей, вы можете начать разделять свой код на отдельные jar-файлы.
В целом рекомендуется кодировать интерфейсы, если это возможно, это обычно означает, что ваш код будет легче реорганизовать и / или использовать в разных контексты.
Фреймворки внедрения зависимостей, такие как Spring , также могут помочь с модульностью вашего дизайна. Поскольку типы вводятся с их зависимостями некоторым внешним процессом конфигурации, им не нужна прямая зависимость от реализации.
Идея «пакет за функцией» помогает сделать код более модульным.
Многие примеры, увиденные в Интернете, сначала делят приложения на уровни, а не на функции
Однако кажется лучше разделить приложения с помощью пакетов верхнего уровня, которые выровняйте с функциями, а не с уровнями .
Вот пример веб-приложения, которое использует пакет за функцией. Обратите внимание на имена пакетов верхнего уровня, которые читаются как список фактических функций в приложении. Также обратите внимание, как каждый пакет содержит все элементы, связанные с функцией - элементы не разбросаны повсюду; в большинстве случаев все они находятся в одном пакете / каталоге.
Обычно
Модульность зависит от того, кто когда-либо разрабатывает код. Но я думаю, что общее мнение таково, что модульный код - это код, в котором есть части, которые можно легко заменить без изменения большей части исходного кода.
IMHO, если у вас есть 3 модуля AB и C, и вы хотите полностью изменить или заменить модуль C, если это ПРОСТАЯ задача, то у вас есть модульный код.
Хей,
См. «Как инкапсулировать программное обеспечение (часть 1)» здесь:
http://www.edmundkirwan.com/encap/overview/paper7.html
С уважением,
Ред.