<?xml version="1.0" encoding="UTF-8"?><!-- generator="wordpress/2.2.1" -->
<rss version="2.0" 
	xmlns:content="http://purl.org/rss/1.0/modules/content/">
<channel>
	<title>Comments on: Анти-паттерн проектирования (Java): интерфейс для констант</title>
	<link>http://www.javenue.info/post/22</link>
	<description>Блог разработчика о Java и родственных технологиях</description>
	<pubDate>Sun, 05 Feb 2012 00:30:50 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.2.1</generator>

	<item>
		<title>By: assent</title>
		<link>http://www.javenue.info/post/22#comment-93453</link>
		<author>assent</author>
		<pubDate>Fri, 03 Feb 2012 12:53:39 +0000</pubDate>
		<guid>http://www.javenue.info/post/22#comment-93453</guid>
		<description>помню наступал на эти грабли))) прописывать в каждом классе этот интерфейс констант оч неудобно! особенно если этих классов штук 10</description>
		<content:encoded><![CDATA[<p>помню наступал на эти грабли))) прописывать в каждом классе этот интерфейс констант оч неудобно! особенно если этих классов штук 10</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Alexey Terentyev</title>
		<link>http://www.javenue.info/post/22#comment-93108</link>
		<author>Alexey Terentyev</author>
		<pubDate>Tue, 24 Jan 2012 06:54:38 +0000</pubDate>
		<guid>http://www.javenue.info/post/22#comment-93108</guid>
		<description>Пожалуй, будет лучше пример и использовать Enum вместо константы?</description>
		<content:encoded><![CDATA[<p>Пожалуй, будет лучше пример и использовать Enum вместо константы?</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Alex</title>
		<link>http://www.javenue.info/post/22#comment-91884</link>
		<author>Alex</author>
		<pubDate>Fri, 16 Dec 2011 14:48:01 +0000</pubDate>
		<guid>http://www.javenue.info/post/22#comment-91884</guid>
		<description>2Арчи. а кто говорил про наследование класса с константами?? посмотрите внимательно, как они используются, потом уже комментируйте..

public class Second {
    public void usefulMethod() {
        int value = First.USEFUL_CONSTANT;
        ...
    }
    ...
}

наследуйте, что хотите</description>
		<content:encoded><![CDATA[<p>2Арчи. а кто говорил про наследование класса с константами?? посмотрите внимательно, как они используются, потом уже комментируйте..</p>
<p>public class Second {<br />
    public void usefulMethod() {<br />
        int value = First.USEFUL_CONSTANT;<br />
        &#8230;<br />
    }<br />
    &#8230;<br />
}</p>
<p>наследуйте, что хотите</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Арчи</title>
		<link>http://www.javenue.info/post/22#comment-91589</link>
		<author>Арчи</author>
		<pubDate>Tue, 06 Dec 2011 07:29:09 +0000</pubDate>
		<guid>http://www.javenue.info/post/22#comment-91589</guid>
		<description>Вы несете чушь!
Забываете о том что в джава запрещено множественное наследование классов. Так что если хранить константы в классе, то фактически мы не сможем наследовать какой-нибудь гораздо более важный для нас класс. тупо потому, что кому-то показалось, что это антипаттерн.

прежде чем писать такие статьи изучите Core Java</description>
		<content:encoded><![CDATA[<p>Вы несете чушь!<br />
Забываете о том что в джава запрещено множественное наследование классов. Так что если хранить константы в классе, то фактически мы не сможем наследовать какой-нибудь гораздо более важный для нас класс. тупо потому, что кому-то показалось, что это антипаттерн.</p>
<p>прежде чем писать такие статьи изучите Core Java</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Vasiliy</title>
		<link>http://www.javenue.info/post/22#comment-89461</link>
		<author>Vasiliy</author>
		<pubDate>Mon, 03 Oct 2011 00:06:39 +0000</pubDate>
		<guid>http://www.javenue.info/post/22#comment-89461</guid>
		<description>Vile, расширять класс, содержащий просто какие-то константы, это совсем жестко.

Что Вы теряете в Java после того, как написали extends? Вы теряете возможность наследоваться.

Обычно стремяться построить какую-то осмысленную иерархию классов.</description>
		<content:encoded><![CDATA[<p>Vile, расширять класс, содержащий просто какие-то константы, это совсем жестко.</p>
<p>Что Вы теряете в Java после того, как написали extends? Вы теряете возможность наследоваться.</p>
<p>Обычно стремяться построить какую-то осмысленную иерархию классов.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Vile</title>
		<link>http://www.javenue.info/post/22#comment-71390</link>
		<author>Vile</author>
		<pubDate>Thu, 30 Sep 2010 10:43:27 +0000</pubDate>
		<guid>http://www.javenue.info/post/22#comment-71390</guid>
		<description>Получается, выносить константу, не имеющую отношения к API в интерфейс идеологически неправильно. Второй вариант

public final class First {
    public static final int USEFUL_CONSTANT = 0;
    ...
}

public class Second {
    public void usefulMethod() {
        int value = First.USEFUL_CONSTANT;
        ...
    }
    ...
}
тоже неверный, т.к. со слов stan: «этот подход нарушает принцип инкапсуляции. Следуя логике такого подхода необходимо выделить класс(ы) переменных и класс(ы) методов.»

И что же остается? Вижу только один вариант:

public class BaseClass {
    public static final int SOME_CONSTANT = 123;
}

public class Worker extends BaseClass {
    public void doSomething() {
        int i = SOME_CONSTANT;
    }
}

Т.е. практически первый вариант, но вместо интерфейса мы используем класс (который вдобавок можно объявить как abstract). Что скажите?

Из практики: приходилось применять второй и третий способы, т.к. третий не всегда удобен.</description>
		<content:encoded><![CDATA[<p>Получается, выносить константу, не имеющую отношения к API в интерфейс идеологически неправильно. Второй вариант</p>
<p>public final class First {<br />
    public static final int USEFUL_CONSTANT = 0;<br />
    &#8230;<br />
}</p>
<p>public class Second {<br />
    public void usefulMethod() {<br />
        int value = First.USEFUL_CONSTANT;<br />
        &#8230;<br />
    }<br />
    &#8230;<br />
}<br />
тоже неверный, т.к. со слов stan: «этот подход нарушает принцип инкапсуляции. Следуя логике такого подхода необходимо выделить класс(ы) переменных и класс(ы) методов.»</p>
<p>И что же остается? Вижу только один вариант:</p>
<p>public class BaseClass {<br />
    public static final int SOME_CONSTANT = 123;<br />
}</p>
<p>public class Worker extends BaseClass {<br />
    public void doSomething() {<br />
        int i = SOME_CONSTANT;<br />
    }<br />
}</p>
<p>Т.е. практически первый вариант, но вместо интерфейса мы используем класс (который вдобавок можно объявить как abstract). Что скажите?</p>
<p>Из практики: приходилось применять второй и третий способы, т.к. третий не всегда удобен.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: marov</title>
		<link>http://www.javenue.info/post/22#comment-59689</link>
		<author>marov</author>
		<pubDate>Tue, 15 Sep 2009 09:51:47 +0000</pubDate>
		<guid>http://www.javenue.info/post/22#comment-59689</guid>
		<description>Блин, даже мысли никогда не возникало засунуть в интерфейс константу.</description>
		<content:encoded><![CDATA[<p>Блин, даже мысли никогда не возникало засунуть в интерфейс константу.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Sergey</title>
		<link>http://www.javenue.info/post/22#comment-59641</link>
		<author>Sergey</author>
		<pubDate>Mon, 14 Sep 2009 01:21:58 +0000</pubDate>
		<guid>http://www.javenue.info/post/22#comment-59641</guid>
		<description>Согла?усь с Oleg'ом. Видно сразу, человек заканчивал программирование с филосовским уклоном :). 

Ко всему им сказанному, хотел бы добавить. Причина многих затруднений кроется в наскакивании на идеи, до которых люди еще не доросли. Поясню. Человек только начинает учить программирование и на него сразу сваливается ООП, которое не родилось сразу из ничего, а люди при?ли к нему в процессе взросления своих идей. 

Я считаю, что начинающего нужно знакомить с простым линейным программированием, дать ему саму упереться в стенку и задать вопрос: "А нет ли способа реализовать задачу вывода всех чисел от 0 до 100 проще, чем писать:
Writeln("0");
Writeln("1");
...
Writeln("99");
?", и тогда скормить ему циклы, затем функции. Так же и классы нужны тогда, когда человек уже созрел для них. Так же и интерфейсы, и все остальные концепции. Я, конечно, пояснил сильно утрированно, но, надеюсь, донес свою мысль.

Если во время спора о необходимости использования того или иного подхода (паттерна) на вопрос какие преимущества в нем заключаются, оппонент дает заученную формулировку. А после вопроса, как он к этому при?ел, говорит, одну из следующих фраз:
1. Мне лид сказал так делать.
2. Мы так всегда дели.
3. Так в книжке "Н" написано.
Сразу становится понятно, насколько человек понимает то, о чем говорит. Понятно, что он следует "своему" любимому паттерну, даже если тот совер?енно не подходит для его языка или противоречит структуре приложения. ? он сделает все, чтобы соблюсти чистоту этого паттерна, даже если для этого приходится идти на неоправданные жертвы. 

Кто-то разумный сказал примерно следующее: паттерн существует ради облегчения реализации некоторой идеи, а не ради умещения идеи в рамки паттерна, но об этом часто забывают и реализовывают сам паттерн.</description>
		<content:encoded><![CDATA[<p>Согла?усь с Oleg&#8217;ом. Видно сразу, человек заканчивал программирование с филосовским уклоном :). </p>
<p>Ко всему им сказанному, хотел бы добавить. Причина многих затруднений кроется в наскакивании на идеи, до которых люди еще не доросли. Поясню. Человек только начинает учить программирование и на него сразу сваливается ООП, которое не родилось сразу из ничего, а люди при?ли к нему в процессе взросления своих идей. </p>
<p>Я считаю, что начинающего нужно знакомить с простым линейным программированием, дать ему саму упереться в стенку и задать вопрос: &#8220;А нет ли способа реализовать задачу вывода всех чисел от 0 до 100 проще, чем писать:<br />
Writeln(&#8221;0&#8243;);<br />
Writeln(&#8221;1&#8243;);<br />
&#8230;<br />
Writeln(&#8221;99&#8243;);<br />
?&#8221;, и тогда скормить ему циклы, затем функции. Так же и классы нужны тогда, когда человек уже созрел для них. Так же и интерфейсы, и все остальные концепции. Я, конечно, пояснил сильно утрированно, но, надеюсь, донес свою мысль.</p>
<p>Если во время спора о необходимости использования того или иного подхода (паттерна) на вопрос какие преимущества в нем заключаются, оппонент дает заученную формулировку. А после вопроса, как он к этому при?ел, говорит, одну из следующих фраз:<br />
1. Мне лид сказал так делать.<br />
2. Мы так всегда дели.<br />
3. Так в книжке &#8220;Н&#8221; написано.<br />
Сразу становится понятно, насколько человек понимает то, о чем говорит. Понятно, что он следует &#8220;своему&#8221; любимому паттерну, даже если тот совер?енно не подходит для его языка или противоречит структуре приложения. ? он сделает все, чтобы соблюсти чистоту этого паттерна, даже если для этого приходится идти на неоправданные жертвы. </p>
<p>Кто-то разумный сказал примерно следующее: паттерн существует ради облегчения реализации некоторой идеи, а не ради умещения идеи в рамки паттерна, но об этом часто забывают и реализовывают сам паттерн.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Leshij</title>
		<link>http://www.javenue.info/post/22#comment-29243</link>
		<author>Leshij</author>
		<pubDate>Wed, 08 Oct 2008 11:46:47 +0000</pubDate>
		<guid>http://www.javenue.info/post/22#comment-29243</guid>
		<description>По поводу ResultSet. Эти константы как раз являются косвенно частью контракта класса, реализующего РизалтСет. Метод getFetchDirection, допустим, возвращает одну из этих констант. Правда, такие вещи луч?е делать Перечислениями (enum), но в версии 1.2 их еще не было).</description>
		<content:encoded><![CDATA[<p>По поводу ResultSet. Эти константы как раз являются косвенно частью контракта класса, реализующего РизалтСет. Метод getFetchDirection, допустим, возвращает одну из этих констант. Правда, такие вещи луч?е делать Перечислениями (enum), но в версии 1.2 их еще не было).</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: m.victor</title>
		<link>http://www.javenue.info/post/22#comment-27328</link>
		<author>m.victor</author>
		<pubDate>Fri, 05 Sep 2008 20:02:17 +0000</pubDate>
		<guid>http://www.javenue.info/post/22#comment-27328</guid>
		<description>А если уж выносить константы в интерфейс, то луч?е выносить их в отдельный класс с приватным конструктом.</description>
		<content:encoded><![CDATA[<p>А если уж выносить константы в интерфейс, то луч?е выносить их в отдельный класс с приватным конструктом.</p>
]]></content:encoded>
	</item>
</channel>
</rss>

