<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Insight IT &#187; Java</title>
	<atom:link href="http://www.insight-it.ru/category/programmirovanie/java/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.insight-it.ru</link>
	<description>Информационные технологии</description>
	<lastBuildDate>Tue, 31 Jan 2012 09:34:08 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Интерфейс</title>
		<link>http://www.insight-it.ru/programmirovanie/java/interfejs/</link>
		<comments>http://www.insight-it.ru/programmirovanie/java/interfejs/#comments</comments>
		<pubDate>Sun, 04 May 2008 10:41:27 +0000</pubDate>
		<dc:creator>Иван Блинков</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[интерфейс]]></category>
		<category><![CDATA[ООП]]></category>

		<guid isPermaLink="false">http://www.insight-it.ru/?p=71</guid>
		<description><![CDATA[Наверняка у многих из вас слово &#171;интерфейс&#187; ассоциируется с внешним видом любой программы, то есть кнопочками, виджетами, иконками и прочим ее оформлением. Да, несомненно графический пользовательский интерфейс является одним из значений этого понятия, но существует и масса других! Хотите узнать больше? В общем случае под словом интерфейс понимают правила и рамки взаимодействия двух произвольных объектов. [...]]]></description>
			<content:encoded><![CDATA[<p><img src="/wp-content/uploads/exec.png" alt="Интерфейс" style="float:left; margin:6px;" /><br />
Наверняка у многих из вас слово <em>&#171;интерфейс&#187;</em> ассоциируется с внешним видом любой программы, то есть кнопочками, виджетами, иконками и прочим ее оформлением. Да, несомненно графический пользовательский интерфейс является одним из значений этого понятия, но существует и масса других!</p>
<p><strong>Хотите узнать больше?</strong><br />
<span id="more-71"></span><br />
В общем случае под словом интерфейс понимают правила и рамки взаимодействия двух произвольных объектов. В рамках компьютерной терминологии такими объектами обычно выступают люди, оборудование, программное обеспечение или его компоненты, но этот термин применим и далеко за ее пределами.</p>
<p>Вернувшись к примеру из первого абзаца мы теперь можем вполне аргументированно объяснить почему GUI так часто приравнивают к слову интерфейс: он просто является частным случаем интерфейса между приложением и его пользователем. Можно было бы привести еще массу примеров различных интерфейсов, скажем сокет в качестве интерфейса между процессором и материнской платой, но целью написания этого поста было вовсе не это.</p>
<p>Уже догадались? Да, это я так неспеша плавно подводил разговор к <a href="/tag/oop">объектно-ориентированному программированию</a>. Термин <em>интерфейс</em> широко применяется и в нем. Как не трудно предположить, в роли объектов в этом случае выступают как сами классы, так и их экземпляры (которые, впрочем, тоже принято называть словом <em>объект</em>).</p>
<p>В общем случае интерфейсом класса выступает совокупность его <strong>public</strong> методов и переменных, то есть доступных для обращения из других частей приложения. Этот факт вполне логичен &#8212; именно благодаря им и осуществляется взаимодействие класса (или его объекта) с &#171;внешним миром&#187;. Но не все так просто, особенно с точки зрения <a href="/programming/design-patterns" target="_blank">шаблонов проектирования</a>, немаловажную роль в взаимодействии классов и объектов играет <strong>абстракция</strong>. Хочется обратить внимание, что формально имеется ввиду даже не сами методы, а их заголовки, то есть название, набор получаемых переменных и тип возвращаемого значения (этот набор данных принято также принято называть интерфейсом методов или функций), само тело метода (реализация) в данном случае не важно.</p>
<p>Иными словами, если один класс (будем называть его <em>клиент</em>) взаимодействует с каким-либо другим объектом, то по большому счету он абсолютно не обязан знать какого класса этот объект является экземпляром (может конечно, но это совсем не обязательно). Единственное, что интересует класс-клиент, это <em>интерфейс</em> объекта, с которым он взаимодействует, этой информации вполне достаточно для полноценной совместной работы.</p>
<p>Сразу напрашивается вполне резонный вопрос: а как же тогда клиент может быть уверен, что в классе, с которым он работает, какой-либо конкретный интерфейс реализован? Допустим ему нужен во-о-о-он тот метод, а как же узнать доступен ли он и получит ли клиент в ответ данные нужного типа? Ответ на этот вопрос реализован в каждом языке программирования по-разному: где-то  существует специальные ключевые слова для <em>обозначения</em> интерфейсов и классов, их реализующих, где-то это ненавязчиво реализуется средствами <em>наследования</em> и <em>полиморфизма</em> на более концептуальном уровне.</p>
<p>Самым наглядным языком программирования для демонстрации описания интерфейсов я считаю <strong>Java</strong> (хотя можно было бы выбрать и C#, PHP или практически любой другой по вкусу). В теории все просто:</p>
<ul>
<li>Ключевое слово <strong>interface</strong> обозначает описание интерфейса;</li>
<li>За ним следует название конкретного интерфейса, которое впоследствии можно будет использовать в коде при его упоминании (некоторые программисты на правах традиции начинают названия интерфейсов с заглавной буквы <strong>I</strong>, мне в свое время даже пытались объяснить зачем так надо делать, но аргументы не показались мне достаточно весомыми);</li>
<li>Далее идет тело интерфейса, в котором перечисляются все заголовки методов, которые должны быть в классе, реализующем данный интерфейс (никакой реализации!);</li>
<li>Впоследствии приписав к заголовку любого класса ключевое слово <strong>implements</strong> с последующим указанием названия интерфейса, можно <em>обязать</em> этот класс реализовать указанные в описания интерфейса методы. Существует небольшое исключение для абстрактных классов (то есть классов,для которых <em>не может</em> быть создан объект, обозначаются ключевым словом <strong>abstract</strong>), они <em>могут</em> и не реализовать все методы интерфейса, но тогда эта <em>обязанность</em> будет переложена на их <em>наследников</em>.</li>
</ul>
<p>В данной ситуации клиент, работающий с каким-либо произвольным объектом может просто-напросто проверить, реализован ли в нем заранее определенный интерфейс, что даст ему гарантию, что он может смело обращаться к необходимому набору методов.</p>
<p><em>Небольшое примечание:</em> сами интерфейсы и методы в их теле по-умолчанию обладают свойствами <strong>abstract</strong> и <strong>public</strong>, так что повторно указывать эти ключевые слова не нужно.</p>
<p>На практике же это выглядит это примерно следующим образом:</p>
<pre lang="Java">
// описание интерфейса
interface Renderable
{
    // обязуем реализовать метод draw
    public void draw();
}

// конкретная реализация интерфейса
class SomeText implements Renderable
{
   string text;
   public SomeText(string str)
   {
      this.text=str;
   }
   public void draw()
   {
       // вынуждены подчиниться и реализовать
       System.out.println(this.text);
   }
}

// класс-клиент
class Render
{
  public Render(Renderable obj)
  {
     // можно быть уверенным, что
     // метод draw реализован
     obj.draw();
     /*
         в качестве альтернативы можно было бы написать как-то так:
         if(obj instanceof Renderable)obj.draw();
         то есть проверить реализован ли интерфейс
         вместо использования его названия в роли типа данных
     */
  }
</pre>
<p>В данном примере ситуация тривиальна: класс-клиент <strong>Render</strong> умеет лишь визуализировать классы, которые он получает в конструктор, вызывая у них метод <strong>draw</strong>. Для обеспечения такой возможности описан интерфейс <strong>Renderable</strong>, который реализуется в классе <strong>SomeText</strong>. Хоть класс <strong>Render</strong> ничего и не знает о том, какой именно класс ему подсунут, благодаря интерфейсу он сможет вывести на экран любой объект, корректно реализующий наш интерфейс, в том числе и <strong>SomeText</strong>.</p>
<p>Как я уже упоминал: альтернативой такому подходу является использование полиморфизма и наследования. Такой подход более распространен в других языках программирования, например C++, но пример я приведу все равно на <strong>Java</strong>, основываясь на предыдущем примере, чтобы читателям было проще сравнивать.</p>
<p>В теории такой подход еще проще: создается абстрактный класс, хоть как-то реализующий наш интерфейс (теоретически реализация может быть и пустой, просто в виде метода-заглушки), а на стороне клиента достаточно лишь просто принимать только наследников этого абстрактного класса. В нашем примере достаточно лишь изменить пару ключевых слов и все:</p>
<pre lang="Java">
// теперь используем абстрактный класс
abstract class Renderable
{
    // реализуем метод draw
    public void draw()
    {
       System.out.println("Вывод на экран недоступен!");
    }
}

// реализация интерфейса (на этот раз неформального)
class SomeText extends Renderable
{
   // на этот раз используем extends (наследование)
   // вместо implements
   string text;
   public SomeText(string str)
   {
      this.text=str;
   }
   public void draw()
   {
       // переопределяем метод draw
       // но могли этого и не делать, тогда
       // использовался бы метод из Renderable
       System.out.println(this.text);
   }
}

// класс-клиент
class Render
{
  public Render(Renderable obj)
  {
     // можно быть уверенным, что
     // метод draw реализован
     obj.draw();
     /*
        на этот раз так как в крайнем случае
        в крайнем случае вызовется хотябы
        метод из класса Renderable
     */
  }
</pre>
<p>Минимальные изменения &#8212; суть та же. Сразу хочу отметить, что этот процесс так прост только в <strong>Java</strong>, в других языках программирования понадобилось бы использование дополнительных модификаторов для метода <strong>draw</strong> (например в <strong>C#</strong>: <strong>virtual</strong> или <strong>abstract</strong> в классе-потомке и <strong>override</strong> в классе-наследнике, это необходимо для обеспечения возможности их переопределения).</p>
<p>На этом позвольте завершить данное повествование, очень надеюсь, что мне удалось изложить суть максимально прозрачно. Эта тема будет активно подниматься в дальнейших статьях по <a href="/tag/oop" target="_blank">ООП</a>, так что очень надеюсь, что она стала для Вас элементарной и очевидной. По традиции напоминаю, что не пропустить публикацию новых постов можно <a href="/feed" target="_blank">подписавшись на RSS</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.insight-it.ru/programmirovanie/java/interfejs/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Три основных компонента парадигмы объектно-ориентированного программирования</title>
		<link>http://www.insight-it.ru/programmirovanie/java/tri-osnovnyx-komponenta-paradigmy-obektno-orientirovannogo-programmirovaniya/</link>
		<comments>http://www.insight-it.ru/programmirovanie/java/tri-osnovnyx-komponenta-paradigmy-obektno-orientirovannogo-programmirovaniya/#comments</comments>
		<pubDate>Sat, 05 Jan 2008 19:28:51 +0000</pubDate>
		<dc:creator>Иван Блинков</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[инкапсуляция]]></category>
		<category><![CDATA[интерфейс]]></category>
		<category><![CDATA[наследование]]></category>
		<category><![CDATA[объектно-ориентированное программирование]]></category>
		<category><![CDATA[ООП]]></category>
		<category><![CDATA[парадигма]]></category>
		<category><![CDATA[полиморфизм]]></category>
		<category><![CDATA[программное обеспечение]]></category>

		<guid isPermaLink="false">http://www.insight-it.ru/programming/tri-osnovnyx-komponenta-paradigmy-obektno-orientirovannogo-programmirovaniya/</guid>
		<description><![CDATA[Представьте: Россия, солнце только-только начинает свой путь по бескрайним просторам неба, Вы находитесь на одной из самых оживленных улиц своего города и вокруг Вас нетрудно заметить множество людей, спешащих по своим делам. И вот, Вы видите как один человек зашел в большое офисное здание. Вы спросите у меня: как это все может быть связано с [...]]]></description>
			<content:encoded><![CDATA[<p>Представьте: Россия,  солнце только-только начинает свой путь по бескрайним просторам неба, Вы находитесь на одной из самых оживленных улиц своего города и вокруг Вас нетрудно заметить множество людей, спешащих по своим делам. И вот, Вы видите как один человек зашел в большое офисное здание.</p>
<p>Вы спросите у меня: как это все может быть связано с темой этой записи? &#8212; об этом я и собираюсь Вам поведать.</p>
<p><span id="more-12"></span><br />
<hr width="100%" size="2" />
<font size="1" face="courier new,courier">Перед тем как продолжить чтение этой записи, очень рекомендую сначала ознакомиться с <a href="/programming/obektno-orientirovannoe-programmirovanie-a-chto-zhe-eto">введением в объектно-ориентированное програмирование</a>, если Вы еще не успели этого сделать.</font><br />
<hr width="100%" size="2" />
<img style="float: right;" src="/wp-content/uploads/cubes.png" alt="" /></p>
<p>Человек, которого Вы, надеюсь, успешно представили в процессе прочтения вступления к этой записи, будет служить нам примером в процессе обсуждения трех базовых вещей, на которых основывается вся концепция <strong>ООП</strong>, которые имеет сразу обозначить прямо сейчас:</p>
<ul>
<li>наследование</li>
<li>инкапсуляция</li>
<li>полиморфизм</li>
</ul>
<p>Все они являются равнозначными и перечислены они просто в порядке их упоминания в этом посте. Но прежде чем перейти к их рассмотрению по отдельности было бы не лишним несколько конкретизировать пример, упомянутый чуть выше. Основной акцент в этой записи делается на теорию, но для упрощения понимания я буду стараться приводить элементарные примеры реализации на языке <em>Java</em> (выбранный как наиболее характерный представитель языков программирования, приспособленных для ООП), которые правда будут лишь иллюстрировать повествование, но не будут нести за собой никакой практической пользы.</p>
<p align="justify">Для начала можно рассматривать этого человека просто &quot;со стороны&quot;: с этой точки зрения можно определить его рост, возраст, пол, цвет волос и глаз, и возможно какие-либо внешние признаки. Помимо этого можно предположить, что он обладает элементарными навыками, которые он успел продемонстрировать, проходя мимо Вас: он умеет ходить и еще, видимо, работать, правда не ясно кем.</p>
<p align="justify">Теперь посмотрим на него, как на объект, который необходимо смоделировать внутри программы. Внешние данные, перечисленные в предыдущем абзаце, станут <em>состоянием</em>, которое необходимо будет описать примерно следующим образом в описании класса, экземпляром которого и будет впоследствии являться наш человек:</p>
<pre lang="Java">
class Human
{
   public int height; // рост
   public int age; // возраст
   public String gender; // пол
   public String eyesColor; // цвет глаз
   public String hairColor; // цвет волос
}</pre>
<p align="justify">Помимо этого мы говорили о его навыках, которые тоже необходимо здесь же упомянуть, для простоты не будем ничего сложного придумывать в плане реализации:</p>
<pre lang="Java">
class Human
{
   public int height; // рост
   public int age; // возраст
   public String gender; // пол
   public String eyesColor; // цвет глаз
   public String hairColor; // цвет волос
   public void walk()
   {
      System.out.println(&quot;Я иду!&quot;);
   }
   public void work()
   {
      System.out.println(&quot;Я работаю в большом офисном здании&quot;);
   }
}</pre>
<p align="justify">Пожалуй этого будет достаточно для перехода собственно к обсуждению первого из трех компонентов парадигмы.</p>
<h3>Наследование</h3>
<p align="justify">В отличии от реальной жизни, в рамках данной концепции наследование относится не к материальным вещам, а к  переменным и методам класса. Тот класс, который передает &quot;наследство&quot;, принято называть <strong>базовым</strong>, а получателя &quot;наследства&quot;, соответственно &#8212; <strong>наследующим</strong>. Наследующий класс в дополнение к собственным методам и переменным получает еще и полный доступ ко всем переменным и методам базового класса (за некоторым исключением, о котором пойдет речь при разговоре об инкапсуляции, но обо всем по порядку).</p>
<p align="justify">Для иллюстрации этого механизма предлагаю предположить кем же мог работать наш человек. Для примера возьмем три варианта: менеджер, программист и директор. Менеджер будет уметь командовать подчиненными, программист писать код, а директор &#8212; ничего не делать. но не будем забывать, что человек, обладающий каждой из этих трех профессий, все же остается просто человеком и может выполнять все стандартные действия, которые мог бы выполнять обычный безработный, и обладать теми же признаками.</p>
<p align="justify">Конечно же можно было бы написать для каждой из профессии класс, просто добавив по одному методу, это выглядело бы примерно так:</p>
<pre lang="Java">
class Director
{
   public int height; // рост
   public int age; // возраст
   public String gender; // пол
   public String eyesColor; // цвет глаз
   public String hairColor; // цвет глаз
   public void walk()
   {
      System.out.println(&quot;Я иду!&quot;);
   }
   public void work()
   {
      System.out.println(&quot;Я работаю в большом офисном здании&quot;);
   }
   public void idle()
   {
      System.out.println(&quot;Я ничего не делаю!&quot;);
   }
}</pre>
<p align="justify">Но такой подход годится только для людей даже краем уха не слышавших об ООП, ведь он далеко не самый эффективный, особенно с точки зрения затрачиваемого на написание кода времени. Воспользовавшись механизмом наследования, можно сократить как объем кода, так и время, затраченное на его написание. В используемом для примеров языке программирования Java, для этого достаточно лишь указать в заголовке наследующего класса ключевое слово <em>extends</em> и название базового класса. Аналогичный предыдущему класс с использованием этого механизма существенно упрощается:</p>
<pre lang="Java">
class Director extends Human
{
   public void idle()
   {
      System.out.println(&quot;Я ничего не делаю!&quot;);
   }
}</pre>
<p align="justify">Как не трудно заметить объем кода существенно сократился, но это далеко не единственное преимущество. Помимо этого, например, если появится необходимость произвести изменения во всех профессиях &#8212; нужно будет произвести их один раз в базовом классе, а не три раза, как было бы в случае не использования наследования. А в некоторых случаях базовый класс может быть уже написан разработчиками языка программирования и для того чтобы им воспользоваться останется лишь написать пару волшебных слов.</p>
<h3>Полиморфизм</h3>
<p align="justify">Это слово пришло к нам из греческого языка, понимания этого термина легко достичь, просто переведя его на русский язык: <span lang="grc" style="font-family: palatino linotype,new athena unicode,athena,gentium,code2000,serif; font-size: 110%;" xml:lang="grc">&pi;&omicron;&lambda;ύ&mu;&omicron;&rho;&phi;&omicron;&sigmaf;</span> &#8212; многоформенность. То есть в наиболее простом случае подразумевается использование одной и той же переменной (или массива) для хранения информации об объектах, описываемых разными классами. Представим, что нам необходим стандартизованный способ узнать кем же работает тот или иной человек, естественно для этого необходимо описание соответствующего метода для выполнения этой функции в каждом классе, причем он должен одинаково называться в каждом из них. Для реализации этого примера на языке Java нет необходимости использовать дополнительных ключевых слов (в отличие от, например, C#, где необходимо использование слова virtual в заголовке метода в базовом классе и override &#8212; в производных). Продолжая приводить примеры на Java имеем три производных класса (для упрощения опустим дополнительные методы, которые могли бы присутствовать):</p>
<pre lang="Java">
class Director extends Human
{
   public void work()
   {
      System.out.println(&quot;Я работаю директором!&quot;);
   }
}</pre>
<pre lang="Java">
class Programmer extends Human
{
   public void work()
   {
      System.out.println(&quot;Я работаю программистом!&quot;);
   }
}</pre>
<pre lang="Java">
class Manager extends Human
{
   public void work()
   {
      System.out.println(&quot;Я работаю менеджером!&quot;);
   }
}</pre>
<p align="justify">Для того, чтобы воспользоваться механизмом полиморфизма достаточно лишь написать функцию, которая будет создавать экземпляры наших классов и &quot;спрашивать&quot; к них кем они работают, выглядит это ничуть не сложнее, чем и описания классов, хочу лишь обратить Ваще внимание на то, что полиморфная переменная должна иметь тип базового класса:</p>
<pre lang="Java">
class AskHuman
{
   public static void main(String[] args)
   {
      public Human person;
      person = new Director();
      person.work();
      person = new Manager();
      person.work();
      person = new Programmer();
      person.work();
}</pre>
<p align="justify">В ответ на выполнение этого мы метода мы получим каждую фразу из всех четырех классов, то есть не смотря на то, что у переменной заявлен тип базового класса, будут вызываться методы производных:</p>
<p><code> Я работаю директором! Я работаю менеджером! Я работаю программистом! </code></p>
<p align="justify">Этот механизм расширяет возможности использования классов, позволяя более гибко использовать переменные и методы (да, этот механизм справедлив и для методов), а также позволяет писать более абстрактные программы и существенно упрощает работу программ, имеющих модульную структуру.</p>
<p align="justify">Также имеет смысл упомянуть, что в некоторых языках программирования существует такое понятие как <strong>интерфейс</strong>, предназначенное именно для стандартизации механизма полиморфизма. Смысл интерфейса состоит в том, что он предоставляет классу список методов, которые класс <em>обязан</em> реализовать (ключевое слово в Java &#8212; <strong>implements</strong>), при этом сам интерфейс не содержит какой-либо реализации и может быть только определен. Выглядит примерно следующим образом:</p>
<pre lang="Java">
interface Worker
{
   public void work();
}</pre>
<pre></pre>
<pre lang="Java">
class Director extends Human implements Worker
{
   public void work()
   {
      System.out.println(&quot;Я работаю директором!&quot;);
   }
}</pre>
<pre lang="Java">
class Programmer extends Human implements Worker
{
   public void work()
   {
      System.out.println(&quot;Я работаю программистом!&quot;);
   }
}</pre>
<pre lang="Java">
class Manager extends Human implements Worker
{
   public void work()
   {
      System.out.println(&quot;Я работаю менеджером!&quot;);
   }
}</pre>
<p align="justify">В этом случае производные классы будут <em>обязаны</em> иметь метод work, что даст гарантию классу AskHuman, что он не вызовет несуществующий метод.</p>
<h3>Инкапсуляция</h3>
<p align="justify">Наверняка Вы уже задавались вопросом о том, что же значит слово <strong>public</strong> во всех предыдущих примерах. Это ключевое слово является частью реализации механизма инкапсуляции в языке Java, суть его состоит в том, чтобы дать возможность определить <em>область видимости</em> для составных частей класса, это очень актуально при написании ПО, использующего библиотеки, plug-in&#8217;ы или при написании программы группой людей. Ведь если Ваш класс подразумевает какие-либо ограничения для переменных или методов (например &#8212; возраст не может быть отрицательным), то их легко обойти воспользовавшись прямым доступом к ним из-за пределов класса или просто выполнив наследование.</p>
<p align="justify">Для предотвращения этого используется система параметров, назначаемых переменным и методам внутри класса для присвоения им &quot;уровней доступа&quot; (на примере опять же Java, но в большинстве известных мне высокоуровневых языков используется та же система):</p>
<ul>
<li><strong>public</strong> &#8212; назначается по-умолчанию &#8212; полностью свободный доступ</li>
<li><strong>private</strong> &#8212; доступ предоставляется <em>только</em> другим компонентам класса</li>
<li><strong>protected</strong> &#8212; доступ предоставляется остальным компонентам класса, а также всем <em>наследникам</em> данного класса</li>
</ul>
<p align="justify">Данный механизм является незаменимым помощником разработчиков любых более-менее крупных проектов, следующих принципам ООП.</p>
<h4>Вместо заключения</h4>
<p align="justify">Казалось бы бестолковая история про человека, идущего на работу, позволила Вам получить базовое представление об основах объектно-ориентированного программирования. Надеюсь у меня не раз еще найдется повод вернуться к обсуждению этой парадигмы. А на последок, хотелось бы Вас попросить, если вам понравилась эта статья, <a href="http://technorati.com/faves?sub=addfavbtn&amp;add=http://www.insight-it.ru">добавить этот блог в Ваши закладки сервиса Tehnorati</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.insight-it.ru/programmirovanie/java/tri-osnovnyx-komponenta-paradigmy-obektno-orientirovannogo-programmirovaniya/feed/</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
	</channel>
</rss>

