2009-04-15 4 views
2

Статические методы утилиты, как правило, недовольны пуристами OO.Homegrown utility methods

Мне было интересно, как люди относятся к утилитарным методам, которые используются, чтобы избежать чего-то простого, такого как нулевая проверка во всем приложении.

String.trim() выдает NPE при вызове по нулевой строке. Так что я должен сделать:

Что делать, если я создаю метод утилиты, который проверяет значение null?

setValue(myTrim(str)); 

public static String myTrim(String str) { 

    if(str==null) return "" 

    else return str.trim(); 
} 

Одна проблема, я столкнулся с методами, как это в том, что некоторые разработчики по команде не могли бы/не знаю эту утилиту и может делать Staight вызовы после делать нулевое сравнение.

Это что-то, что вы делаете и в своих рамках? Если да, то каковы другие общие методы общего использования, которые люди создали и используют в своих приложениях?

Что вы считаете преимуществами и недостатками любого подхода?

+0

Записывая метод, вы указываете, что он делает. Кроме того, myTrim принимает значение null и преобразует его в пустую строку, поэтому он делает больше, чем обрезает, что делает его вводящим в заблуждение именем метода. –

+0

@Steve Это хороший момент. – Kapsh

ответ

7

я был бы склонен заменить доморощенные использует при существующей библиотеки (например, Apache Commons Бла Бла Бла) уже написал Это. Код, который вы можете разгрузить другому, позволяет сосредоточиться на важных частях программного обеспечения, которые действительно отличает вашу работу от всех остальных. Но да, классы полезности со статическими методами велики, если они вообще должны быть написаны вами.

FYI, посмотрите на StringUtils.trimToEmpty(). Удачи.

+2

Apache Commons для победы! – ScArcher2

3

некоторые разработчики по команде не могли бы/не знаю, эта утилита

Это то, что связь хорошо. И я не имею в виду электронную почту.

Говорит об этих функциях, возможно, другие члены команды делают то же самое и не сообщая, что вы дублируете код и усилия.

Вы можете найти способ использования этих методов утилиты или даже более опытный разработчик migth уже разработали более зрелую библиотеку или использовали стороннюю сторону.

Но всеми средствами, общаться с командой

3

Я не OO пуристов. Так что я люблю такие вещи. Все, что облегчает писать код, который отражает мои намерения, не увязнув в нерелевантных деталях.

Запишите его. Используйте его самостоятельно. Не стесняйтесь - продемонстрируйте, насколько он чище делает ваш код. В худшем случае, по крайней мере, будет немного меньше повторения в вашего кода ...

1

У меня есть несколько классов, которые содержат только фавельные статические методы - они do имеют смысл иметь. Вы можете собрать обширные модульные тесты, проверяющие любые граничные условия.

В случае, о котором вы описали, было бы лучше, если бы метод setValue принял любую строку, отправленную на него? Затем метод может применить нулевую строку по умолчанию, обрезать ее или даже выбросить исключение, если значение было неверным.

JavaDoc в этой рутине может затем четко указать, какие входы действительны/недействительны и что происходит с недействительными входами.

Не говорю, что это правильно - просто другая точка зрения

2

С точки зрения принципа проектирования, есть некоторые вещи, которые просто более логически статические методы. Если класс утилиты, который вы пишете, на самом деле не имеет никакого «состояния», и более логично сделать его неинстанционным с кучей статических методов, тогда сделайте это так. Но убедитесь, что ваш класс действительно неинстантен (дайте ему частный конструктор, я видел, как люди объявляют класс абстрактным, но это не хорошо, потому что люди могут его переопределить).

Проблема, с которой вы тогда сталкиваетесь, заключается в том, что , если ваш класс по всему проекту, вам нужно рассматривать его как класс библиотеки. И написание библиотек отличается от написания общего кода:

  • В общем коде вы должны профиль, а не преждевременная оптимизация; но в библиотечном методе вы не можете предсказать, как люди будут использовать ваш вызов в будущем;
  • Вы должны быть очень осторожны, чтобы документировать или четко называть то, что делает ваш метод;
  • вам необходимо дать родовое поведение и не ослепнуть какой-либо конкретной функцией, которая вам нужна в данный момент (например, если у вас есть метод «tokenise a string», что вы делаете с пустыми жетонами? If вы должны игнорировать их, будете других звонящих вашего метода?)
1

Я использую много полезных функции. Есть некоторые вещи, которые просто не нужны «объекты», но мне не нравится конкретный пример, который у вас есть trim().

Ссылка на строку, которая является нулевой, сильно отличается от пустой строки. Если приложение очень простое, и вы знаете, что всегда хотите читать нулевую ссылку как «», я бы этого не сделал. В этом случае, я предпочитаю:

setValue((str != null) ? str.trim() : "") 

Для меня неперехваченное NPE является хорошим показателем того, что есть большая ошибка происходит в приложении!