Как поддерживать довольно длинные классы в Java? - PullRequest
5 голосов
/ 12 января 2011

В настоящее время я пишу реализацию интерфейса RowSet в Java, и даже после получения от BaseRowSet (который сам по себе превышает 4k LOC) класс уже содержит более 1200 строк, без какого-либо написанного кода - простообъявления методов.

Теперь я понимаю, что в Java есть несколько классов, даже длиннее, в том числе java.awt.Component со страшным 10k LOC, но в настоящий момент я все еще пытаюсь понять, как работает RowSet s.(не предмет этого вопроса) и как я когда-либо снова пойму смысл класса, если он нуждается в изменениях позже.

Существуют ли хорошие методы о том, как структурировать таких зверей, или я должен просто записать это, один методв то время и надеемся на лучшее, чтобы понять это позже?

(Похожие: Я поддерживаю класс Java длиной 40 Кб .. проблема? - но это просто требуетпроблематично ли это . Я вполне уверен, что это так, но я боюсь этого избежать, я боюсь.)

Ответы [ 5 ]

2 голосов
/ 12 января 2011

Я бы определенно начал с юнит-тестов .Если я правильно понимаю, к счастью, вы пишете код с нуля, поэтому вы можете применить TDD .Это также помогло бы разобраться в тонкостях и ожидаемом поведении RowSet.

С проведением модульных тестов я был бы более свободен в рефакторинге.Моим первым (и единственным) инстинктом было бы попытаться делегировать функциональность внешним классам , предпочтительно , разделяя функциональность на (более или менее) логически связные группы .Эти классы делегатов было бы легче понять, протестировать и поддерживать.

Даже если возможности для делегирования сильно или полностью ограничены (например, поскольку вся функциональность тесно связана, вы не можете разделить ее на отдельныеклассы), все же модульные тесты очень помогают, документируя известное поведение класса .

Я вполне уверен, что это не так уж ново для вас - извините, чтобы признать, что это лучший совет, который яможет предложить.Необходимость реализации гигантского базового интерфейса накладывает довольно сильные ограничения на дизайн: - (

1 голос
/ 12 января 2011

Может быть, вы можете реализовать другую часть вашего класса в качестве делегатов в других классах, а затем включить эти классы в основной.

Таким образом, реализация будет разделена между различными классами, и тогда все основные классы будут вызывать эти классы.

0 голосов
/ 12 января 2011

Java - это полностью объектно-ориентированный язык, поэтому вы должны учитывать, что любой класс должен содержать определение только одного объекта с изолированными и независимыми обязанностями и поведением.Если вы выбрали лучшее определение для своих объектов, я думаю, вам не стоит беспокоиться о размере LOC вашего класса, потому что с затмением мир станет лучшим местом для программистов на Java!Но я предлагаю вам еще раз подумать об этих уведомлениях:Иногда можно разбить общий класс на несколько родительских и дочерних классов и использовать многоуровневое наследование, но в большинстве случаев это невозможно, так как родительские и дочерние отношения не существуют.Иногда вы можете перенести некоторые методы в другие классы, потому что они действительно не принадлежат вашему классу или они могут реализовывать где-то еще (в некоторых случаях нет явной границы между объектами)!& В общем, я предпочитаю иметь два или три легких объекта, а не сверхпрочных!

0 голосов
/ 12 января 2011

Хорошая IDE очень помогает в работе с таким кодом.

Использование eclipse, представление контура и наличие CTRL, превращающего каждый идентификатор в ссылку на его определение, являются, вероятно, наиболее полезными функциями в этом отношении. Я обычно понятия не имею, где в файле с исходным кодом я найду конкретный метод - потому что мне никогда не придется.

В конце концов, понять один класс 10 kLOC на самом деле не сложнее, чем 100 классов по 100 строк в каждом, предполагая схожую степень сплоченности (что, конечно, довольно большое предположение).

0 голосов
/ 12 января 2011

Вы должны попытаться создать король регионов для функциональности, которая связана с самим собой по функциональности или использованию. Это относится к вашим методам, в остальном вы должны придерживаться порядка интерфейса (суперкласса).

...