Best practices. String constants

Ответить
Lighter
Сообщения: 61
Зарегистрирован: 13 авг 2013, 16:39

Best practices. String constants

Сообщение Lighter » 28 июл 2014, 10:32

Как лучше хранить строковые константы в Android, например в таких случаях:

Код: Выделить всё

throw new Exception("Exception message");
Создавать final поле или хардкодить как в примере выше?

Аватара пользователя
anber
Сообщения: 584
Зарегистрирован: 10 июн 2013, 15:05
Откуда: UA

Re: Best practices. String constants

Сообщение anber » 28 июл 2014, 10:37

Имхо если единоразово - то хардходить, иначе - в константы.
Личные сообщения с просьбой ответить на форуме или написать программу я просто удаляю, если я в хорошем настроении. Если в плохом добавляю автора в черный список. По любым другим вопросам feel free to write to me.

Аватара пользователя
altwin
Сообщения: 1951
Зарегистрирован: 13 ноя 2013, 14:46

Re: Best practices. String constants

Сообщение altwin » 28 июл 2014, 12:37

ничего хардкодить и тем более загонять в строкове константы не нужно, 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]
Изображение

Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

Re: Best practices. String constants

Сообщение Mikhail_dev » 28 июл 2014, 13:13

Артем, а в чем отличие? В любом случае строку передавать в конструктор.

Аватара пользователя
KamiSempai
Сообщения: 1339
Зарегистрирован: 17 фев 2012, 21:23
Откуда: Мордор

Re: Best practices. String constants

Сообщение KamiSempai » 28 июл 2014, 14:29

Mikhail_dev писал(а):Артем, а в чем отличие? В любом случае строку передавать в конструктор.
Видимо, он успел просканировать мозг топикпастера и сразу дал ему более удачное решение его проблемы. Надеюсь у Lighter в коде нет ни чего воде такого:[syntax=java5]if(e.getMessage() == CONSTANT1) {
// Тут логика 1
}
else if(e.getMessage() == CONSTANT2) {
// Логика 2
}[/syntax]
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

Lighter
Сообщения: 61
Зарегистрирован: 13 авг 2013, 16:39

Re: Best practices. String constants

Сообщение Lighter » 28 июл 2014, 15:04

altwin, предлагаете для каждого случая своё исключение?

Код: Выделить всё

	private void method(int a, int b) {
		if(a < 0) {
			throw new NegativeFirstArgumetException();
		} else if(b < 0) {
			throw new NegativeSecondArgemtException();
		}
	}
А если серьёзно, то если сообщение нужно только записать в лог, то на мой взгляд, не обязательно для него создавать свой класс.

Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

Re: Best practices. String constants

Сообщение Mikhail_dev » 28 июл 2014, 15:23

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

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: Best practices. String constants

Сообщение rezak90 » 28 июл 2014, 15:40

так если для дебага то можно писать что угодно, хоть СИСЬКИ!!!
R.id.team
Политика на форуме запрещена

Аватара пользователя
KamiSempai
Сообщения: 1339
Зарегистрирован: 17 фев 2012, 21:23
Откуда: Мордор

Re: Best practices. String constants

Сообщение KamiSempai » 28 июл 2014, 18:28

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.");
	}
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Best practices. String constants

Сообщение Foenix » 28 июл 2014, 18:58

если уж вообще обощать,
я бы обрабатывала exception вне метода, и написала бы ему throws E... :)
private void method(int a, int b) throws IllegalArgumentException{
лялля
}
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Аватара пользователя
altwin
Сообщения: 1951
Зарегистрирован: 13 ноя 2013, 14:46

Re: Best practices. String constants

Сообщение altwin » 29 июл 2014, 09:35

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 для конкретной ситуации, то именно так ты и поступишь..
Изображение

Lighter
Сообщения: 61
Зарегистрирован: 13 авг 2013, 16:39

Re: Best practices. String constants

Сообщение Lighter » 29 июл 2014, 10:16

Понятно, что кидать Exception или RunimeException - плохо, но мы немного отошли от темы, вопрос был не в исключениях, а как хранить строки ;)

Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

Re: Best practices. String constants

Сообщение Mikhail_dev » 29 июл 2014, 10:18

А, теперь я понял. Да, конечно что же не стоит бросать "new Exception("some String")", это же ведь суперкласс для отлавливаемых исключений. Я не обратил внимание что именно суперкласс бросается в примере.
В своем коде я бросаю строки в определенных типах исключений. Например привожу класс к интерфейсному типу и если он не реализует данный интерфейс, то ClassCastException и простая строка внутри конструктора.
В общем если ошибка специфическая, которая не предусмотрена стандартными исключениями, то делайте свой класс ошибки.
вопрос был не в исключениях, а как хранить строки ;)
Все очень просто. Если информация будет предоставлена пользователю, то в ресурсах. Если данная информация для разработчика, то хоть на кидайском пишите её в коде.

Аватара пользователя
altwin
Сообщения: 1951
Зарегистрирован: 13 ноя 2013, 14:46

Re: Best practices. String constants

Сообщение altwin » 29 июл 2014, 10:30

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 для своего исключения и вызывать его в логе, таким образом вы получите свою строку если она вам и правда нужна.
Изображение

Ответить