Страница 1 из 1
Best practices. String constants
Добавлено: 28 июл 2014, 10:32
Lighter
Как лучше хранить строковые константы в Android, например в таких случаях:
Создавать final поле или хардкодить как в примере выше?
Re: Best practices. String constants
Добавлено: 28 июл 2014, 10:37
anber
Имхо если единоразово - то хардходить, иначе - в константы.
Re: Best practices. String constants
Добавлено: 28 июл 2014, 12:37
altwin
ничего хардкодить и тем более загонять в строкове константы не нужно, java - это ООП.
[syntax=java5]class WordContainsException extends Exception
{
//Parameterless Constructor
public WordContainsException() {}
//Constructor that accepts a message
public WordContainsException(String message)
{
super(message);
}
}[/syntax]
и далее использовать:
[syntax=java5]throw new WordContainsException();[/syntax]
Re: Best practices. String constants
Добавлено: 28 июл 2014, 13:13
Mikhail_dev
Артем, а в чем отличие? В любом случае строку передавать в конструктор.
Re: Best practices. String constants
Добавлено: 28 июл 2014, 14:29
KamiSempai
Mikhail_dev писал(а):Артем, а в чем отличие? В любом случае строку передавать в конструктор.
Видимо, он успел просканировать мозг топикпастера и сразу дал ему более удачное решение его проблемы. Надеюсь у Lighter в коде нет ни чего воде такого:[syntax=java5]if(e.getMessage() == CONSTANT1) {
// Тут логика 1
}
else if(e.getMessage() == CONSTANT2) {
// Логика 2
}[/syntax]
Re: Best practices. String constants
Добавлено: 28 июл 2014, 15:04
Lighter
altwin, предлагаете для каждого случая своё исключение?
Код: Выделить всё
private void method(int a, int b) {
if(a < 0) {
throw new NegativeFirstArgumetException();
} else if(b < 0) {
throw new NegativeSecondArgemtException();
}
}
А если серьёзно, то если сообщение нужно только записать в лог, то на мой взгляд, не обязательно для него создавать свой класс.
Re: Best practices. String constants
Добавлено: 28 июл 2014, 15:23
Mikhail_dev
Вот и я думаю, что делать на исключение собственный класс, вовсе необязательно. Если в лог писать, то не вижу вообще смысла писать в ресурсы.
Re: Best practices. String constants
Добавлено: 28 июл 2014, 15:40
rezak90
так если для дебага то можно писать что угодно, хоть СИСЬКИ!!!
Re: Best practices. String constants
Добавлено: 28 июл 2014, 18:28
KamiSempai
Lighter писал(а):altwin, предлагаете для каждого случая своё исключение?
Код: Выделить всё
private void method(int a, int b) {
if(a < 0) {
throw new NegativeFirstArgumetException();
} else if(b < 0) {
throw new NegativeSecondArgemtException();
}
}
А если серьёзно, то если сообщение нужно только записать в лог, то на мой взгляд, не обязательно для него создавать свой класс.
По мне, лучше сделать так и не париться:
Код: Выделить всё
private void method(int a, int b) {
if(a < 0)
throw new IllegalArgumentException("value 'a' must be positive.");
if(b < 0)
throw new IllegalArgumentException("value 'b' must be positive.");
}
Re: Best practices. String constants
Добавлено: 28 июл 2014, 18:58
Foenix
если уж вообще обощать,
я бы обрабатывала exception вне метода, и написала бы ему throws E...

private void method(int a, int b) throws IllegalArgumentException{
лялля
}
Re: Best practices. String constants
Добавлено: 29 июл 2014, 09:35
altwin
Mikhail_dev писал(а):Артем, а в чем отличие? В любом случае строку передавать в конструктор.
тестирование или тестируемость кода выростает в разы... Ну и как бы строку передавать не обязательно, можно передавать внутренний код, даже объект если конструктор расширить и т.д., ограничение - только наша фантазия.
Lighter писал(а):altwin, предлагаете для каждого случая своё исключение?
интересно, почему в java вам не предлогают вывод сообщений в лог из строк или констант бросая везде простой Exception, а вы представьте что все стало именно так..? Зачем было написанно такое колличество исключений? Что это дает при разработке ПО на java? Вот ровно тоже самое это и даст вам. Варрианты типо у меня маленькое приложение - не катят. Нужно делать правильно всегда. А возможность бросать простой exception для того и дана - нельзя предусмотреть всего, но мы ведь стремимся к совершенству ?
KamiSempai писал(а):
А если серьёзно, то если сообщение нужно только записать в лог, то на мой взгляд, не обязательно для него создавать свой класс.По мне, лучше сделать так и не париться:
Код: Выделить всё
private void method(int a, int b) {
if(a < 0)
throw new IllegalArgumentException("value 'a' must be positive.");
if(b < 0)
throw new IllegalArgumentException("value 'b' must be positive.");
}
конечно, при условии, что это действительно IllegalArgumentException... А вот кидать exception не соответсвующий реальной ошибке - это "плохо пахнет"... И тогда уж точно лучше бросить стандартный Exception, чем вводить в заблуждение пользователя(пользователя кода, читателя и т.д.).
P.S> но вообще этот случай можно описать как "Тим Тоуди"... ( TMTOWTDI - There's more than one way to do it ). Но... код нужно тестировать, код нужно документировать, да и при debug = false записи в лог все отключают и вы так уверенны, что это исключение не возникнет? Так нафига его бросать если в продакшене с отключенным логом вы получите Exception... и сколько таких мест в коде? Нафига рожать себе проблемы и почему просто не сделать конструктор исключений, в которые не нужно передавать строки, просто "говорящее" имя... хочется лог - ну так split имени exception по кемел кейсу даст адекватное сообщение в логе.
Foenix писал(а):если уж вообще обощать,
я бы обрабатывала exception вне метода, и написала бы ему throws E...

private void method(int a, int b) throws IllegalArgumentException{
лялля
}
опять же - согласен и так возможно, но автор топика бросал не IllegalArgumentException, т.е. у него exception не стандартный и это введет в заблуждение(видела реакцию того, кто получает в ответ к примеру на "возвращен не тот объект" IllegalArgumentException ?

а если это психопат, который знает где ты живешь ?

), реч именно о том, что так: private
void method(int a, int b) throws Exception {} делать не надо.. а вот если у тебя есть свой класс exception для конкретной ситуации, то именно так ты и поступишь..
Re: Best practices. String constants
Добавлено: 29 июл 2014, 10:16
Lighter
Понятно, что кидать Exception или RunimeException - плохо, но мы немного отошли от темы, вопрос был не в исключениях, а как хранить строки

Re: Best practices. String constants
Добавлено: 29 июл 2014, 10:18
Mikhail_dev
А, теперь я понял. Да, конечно что же не стоит бросать "new Exception("some String")", это же ведь суперкласс для отлавливаемых исключений. Я не обратил внимание что именно суперкласс бросается в примере.
В своем коде я бросаю строки в определенных типах исключений. Например привожу класс к интерфейсному типу и если он не реализует данный интерфейс, то ClassCastException и простая строка внутри конструктора.
В общем если ошибка специфическая, которая не предусмотрена стандартными исключениями, то делайте свой класс ошибки.
вопрос был не в исключениях, а как хранить строки

Все очень просто. Если информация будет предоставлена пользователю, то в ресурсах. Если данная информация для разработчика, то хоть на кидайском пишите её в коде.
Re: Best practices. String constants
Добавлено: 29 июл 2014, 10:30
altwin
Lighter писал(а):Понятно, что кидать Exception или RunimeException - плохо, но мы немного отошли от темы, вопрос был не в исключениях, а как хранить строки

Ну собственно я как и говорил даю соответсвующие имена исключению, если нужна запись в лог, то:
[syntax=java5]
static String splitCamelCase(String s) {
return s.replaceAll(
String.format("%s|%s|%s",
"(?<=[A-Z])(?=[A-Z][a-z])",
"(?<=[^A-Z])(?=[A-Z])",
"(?<=[A-Za-z])(?=[^A-Za-z])"
),
" "
);
}
[/syntax]
этот метод позволяет преобразовать camelCaseNotation( "SimpleXMLParser") в "человекочитаемую" (Simple XML Parser), что и использую в логе... Преобразовать можно как угодно и тут мне помогает именно "правильное" имя исключения... т.е. зачем там вообще строки? Хотя опять же можно просто переопределить __toString для своего исключения и вызывать его в логе, таким образом вы получите свою строку если она вам и правда нужна.