<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-5617654747865265950</id><updated>2011-11-28T03:37:13.037+04:00</updated><category term='темы'/><category term='mocks'/><category term='tdd'/><category term='metablog'/><category term='agile'/><category term='2009 schedule'/><category term='smalltalk'/><category term='задачи'/><category term='history'/><title type='text'>Smalltalk. Брошенный вовне</title><subtitle type='html'>Программирование на Smalltalk, и еще про Agile Methodologies, в т.ч. и про Test-Driven Development...</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://chaetal.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5617654747865265950/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://chaetal.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>chaetal</name><uri>http://www.blogger.com/profile/11331138719104479605</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>20</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-5617654747865265950.post-6266075563767904211</id><published>2009-11-25T17:37:00.003+04:00</published><updated>2009-11-25T17:41:56.659+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mocks'/><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><category scheme='http://www.blogger.com/atom/ns#' term='tdd'/><title type='text'>Суррогатные объекты (Mock Objects)</title><content type='html'>&lt;span style="font-size:small;"&gt;&lt;i&gt;Статья незакончена! Опубликована как предварительный материал к лекции по Mock-объектам.&lt;/i&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:small;"&gt;Вольный пересказ статьи &lt;a href="http://martinfowler.com/articles/mocksArentStubs.html"&gt;Mocks Aren't Stubs by Martin Fowler&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-size:small;"&gt;См. также&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:small;"&gt; &lt;/span&gt;&lt;a href="http://xunitpatterns.com/"&gt;XUnit Test Patterns by Gerard Meszaros&lt;/a&gt;&lt;br /&gt;&lt;h2&gt;Пример&lt;/h2&gt;&lt;br /&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-size:small;"&gt;Для иллюстрации будем использовать следующий пример: &lt;b&gt;выполнение заказа со склада&lt;/b&gt;. Заказ (Order) включает всего один товар (для простоты товары будут кодироваться символами типа #article1) с указанием количества (amount). Склад (warehouse) знает про наличие товаров (inventory). Когда мы просим заказ "выполниться", возможны два сценария:&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-size:small;"&gt; (1) если на складе имеется достаточное количество указанного товара, то заказ помечается как выполненный (filled) и со склада списывается соответствующее количество этого товара;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-size:small;"&gt; (2) если нужного количества нет, заказ остается невыполненным, а со складом ничего не происходит.&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;h2&gt;Обычные тесты&lt;br /&gt;&lt;/h2&gt;&lt;div  style=";font-family:&amp;quot;;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-size:small;"&gt;OrderStateTests &amp;gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div  style=";font-family:&amp;quot;;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-size:small;"&gt;    setUp &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div  style=";font-family:&amp;quot;;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-size:small;"&gt;        warehouse := Warehouse new.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div  style=";font-family:&amp;quot;;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-size:small;"&gt;        warehouse &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div  style=";font-family:&amp;quot;;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-size:small;"&gt;            add: 50 of: #article1.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div face="&amp;quot;" style=""&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-size:small;"&gt;    test&lt;/span&gt;&lt;/span&gt;OrderIsFilledIfEnoughInWarehouse&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;        | order |&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;        order := Order on: 50 of: #article1.&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;        order fillBy: warehouse.&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;        self assert: order isFilled.&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;        self assert: (warehouse inventoryOf: #article1) isZero.&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;    testOrderDoesNotRemoveIfNotEnough&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;        | order |&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;        order := Order on: 51 of: #article1.&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;        order fillBy: warehouse.&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;        self deny: order isFilled.&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;        self assert: (warehouse inventoryOf: #article1) = 50.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Тесты в xUnit (SUnit в данном случае) обычно, как и в данном случае, можно разбить на четыре стадии: &lt;i&gt;установка&lt;/i&gt;, &lt;i&gt;выполнение&lt;/i&gt;, &lt;i&gt;проверка&lt;/i&gt;, &lt;i&gt;демонтаж&lt;/i&gt;.&lt;br /&gt;Установка в данном примере выполняется в методе setUp, а также в самих тестах --- созданием заказа. Выполнение состоит в передаче сообщения #fillBy: созданном заказу. С помощью assert-ов выполняется проверка. А стадия демонтажа явно не представлена (на самом деле, она выполняется "за кадром" сборщиком мусора).&lt;br /&gt;&lt;br /&gt;На стадии установки мы конфигурируем два объекта: склад (warehouse) и заказ (order). Можно заметить, что с точки зрения теста эти объекты не равнозначны.&lt;br /&gt;&lt;br /&gt;Один из них --- заказ --- собственно и подвергается тестированию (точнее, один из аспектов его функциональности --- метод выполнения). Такие --- центральные для теста --- объекты будем называть &lt;i&gt;тестируемой системой&lt;/i&gt;. А для краткости будем использовать английскую аббревиатуру &lt;i&gt;SUT&lt;/i&gt; (от &lt;i&gt;System Under Test&lt;/i&gt;).&lt;br /&gt;&lt;br /&gt;Другой объект --- склад --- нужен в первую очередь для того, чтобы выполнение заказа могло правильно отработать в данном тесте. Назовем такие объекты (их может быть несколько) &lt;i&gt;сотрудниками&lt;/i&gt; (&lt;i&gt;collaborators&lt;/i&gt; в англоязычной литературе). В данном случае мы используем сотрудника еще и на стадии проверки для того, чтобы проконтролировать результат выполнения заказа (произошло ли списание).&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Что в этих тестах не так?&lt;/h3&gt;&lt;br /&gt;В первую очередь можно заметить, что связь второго аспекта условия в каждом тесте (остаток товара на складе) с самой операцией выполнения заказа, мягко говоря, совсем не очевидна. Человеку, читающему данный код, сложно догадаться, что в процессе выполнения заказа может выполняться списание. Этот аспект, как и зависимость успешности списания от наличия необходимого остатка на складе, отмечены только в названиях тестов.&lt;br /&gt;&lt;br /&gt;Еще одно замечание: класс Warehouse должен существовать и правильно работать (по крайней мере, в отношении хранения остатков по продуктам и их списания), для того, чтобы тест работал. То есть, тест может сломаться не только потому, что неправильно реализована тестируемая система, но и из-за ошибок в сотрудниках. Как следствие, данный тест не может точно показать, где именно кроется ошибка. И это не единственный недостаток зависимости тестов от используемых в них сотрудников. Но другой --- весьма немаловажный, надо заметить, --- аспект рассмотрим чуть позже...&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Тесты с использованием суррогатных объектов&lt;/h2&gt;&lt;br /&gt;&lt;br /&gt;С использованием SMock то же поведение можно описать следующим образом. Рассмотрим сначала "неудачное" списание.&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;OrderInteractionTests &amp;gt;&amp;gt;&lt;br /&gt;  testFillingDoesNotRemoveIfNotEnoughInStock&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;    | order warehouse mock |&lt;br /&gt;    order := Order on: 101 of: #article1.&lt;br /&gt;    mock := SMock.Mock new.&lt;br /&gt;    (mock expect: #has:of:)&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;        with: 101;&lt;br /&gt;        with: #article1;&lt;br /&gt;        returns: false.&lt;br /&gt;    warehouse := mock proxy.&lt;br /&gt;    order fillIn: warehouse.&lt;br /&gt;    mock verify.&lt;br /&gt;    self deny: order isFilled&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Теперь вместо настоящего склада мы используем "заместителя" (proxy), полученного из суррогатного объекта ("мок-объекта" или просто "мока" в дальнейшем). Моки позвволяют проверить взаимодействие тестируемой системы с сотрудниками. Для этого сначала моку указывается, какие сообщения он должен будет получить --- описываются ожидания (expectations). А после использования мока (через его представителя) в реальных вычислениях, можно проверить, были ли эти ожидания выполнены.&lt;br /&gt;&lt;br /&gt;Ожидания добавляются в мок через посылку сообщения #expect:. В параметре передается селектор сообщения. В ответ мок возвращает специальный объект, представляющий информацию об ожидаемом сообщении. Ему можно указать, например, значения параметров (с помощью последовательных сообщений #with:), возвращаемый результат (#returns:) и др.&lt;br /&gt;&lt;br /&gt;В рассмотренном примере: mock ожидает сообщение #has:of: с первым параметром равным 101, и вторым параметром равным #article. В ответ на получение этого сообщения мок должен вернуть значение false.&lt;br /&gt;&lt;br /&gt;"Заместитель" переадресует получаемые сообщения моку, который сверяем получаемое сообщение с ожиданиями и помечает их выполнение.&lt;br /&gt;&lt;br /&gt;В ответ на сообщение #verify мок проверяет, были ли выполнены все ожидания. Если это не так, то генерируется исключительная ситуация, описывающая несоответствие.&lt;br /&gt;&lt;br /&gt;Рассмотрим второй тест:&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;OrderInteractionTests &amp;gt;&amp;gt;&lt;br /&gt;  testFillingRemovesInventoryIfInStock&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;    | order warehouse mock |&lt;br /&gt;    order := Order on: 100 of: #article1.&lt;br /&gt;    mock := SMock.Mock new.&lt;br /&gt;    (mock expect: #has:of:)&lt;br /&gt;        with: 100;&lt;br /&gt;        with: #article1;&lt;br /&gt;        returns: true.&lt;br /&gt;    (mock expect: #remove:of:)&lt;br /&gt;        with: 100;&lt;br /&gt;        with: #article1.&lt;br /&gt;    warehouse := mock proxy.&lt;br /&gt;    order fillIn: warehouse.&lt;br /&gt;    mock verify.&lt;br /&gt;    self assert: order isFilled&lt;/div&gt;&lt;br /&gt;Здесь мок должен получить два сообщения: #has:of: и #remove:of:. В обоих случаях ожидаются два аргумента: 100 и #article, соответственно. На #has:of: мок должен ответить true.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5617654747865265950-6266075563767904211?l=chaetal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chaetal.blogspot.com/feeds/6266075563767904211/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://chaetal.blogspot.com/2009/11/mock-objects.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5617654747865265950/posts/default/6266075563767904211'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5617654747865265950/posts/default/6266075563767904211'/><link rel='alternate' type='text/html' href='http://chaetal.blogspot.com/2009/11/mock-objects.html' title='Суррогатные объекты (Mock Objects)'/><author><name>chaetal</name><uri>http://www.blogger.com/profile/11331138719104479605</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5617654747865265950.post-6141078016913352692</id><published>2009-10-28T14:02:00.001+04:00</published><updated>2009-10-29T18:09:33.227+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><category scheme='http://www.blogger.com/atom/ns#' term='tdd'/><title type='text'>Метафора для Agile</title><content type='html'>Еще одна метафора, с помощью которой можно "на пальцах" объяснить суть Agile методологий."Классический" подход похож на стрельбу: нужно уметь хорошо прицеливаться. Для этого нужно понимать механику полета снаряда, силы на него действующие, уметь брать всякие поправки (на ветер, к примеру) --- в общем, вычислять траекторию, чтобы обеспечить его попадание в нужную точку. При этом еще нужно учитывать, что цель тоже движется --- брать упреждение. Или уметь это делать интуитивно. Или, скорее, владеть некоторым искусством, представляющим собой синтез расчета и интуиции.А что такое Agile методологии? Это просто управляемый снаряд. Если обеспечить своевременное поступление информации о том, куда в данный момент снаряд летит, иметь возможность быстро на это реагировать и нужным образом воздействовать на направление его движения, то попасть в цель гораздо проще. Отсюда очевидны три основных ценности (задачи): готовность к изменениям, управляемость разрабатываемой программной системы, обратная связь с пользователем. Test-Driven Development, в частности, говорит о том, как обеспечить решение этих трех задач "на уровне программиста".&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5617654747865265950-6141078016913352692?l=chaetal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chaetal.blogspot.com/feeds/6141078016913352692/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://chaetal.blogspot.com/2009/10/agile.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5617654747865265950/posts/default/6141078016913352692'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5617654747865265950/posts/default/6141078016913352692'/><link rel='alternate' type='text/html' href='http://chaetal.blogspot.com/2009/10/agile.html' title='Метафора для Agile'/><author><name>chaetal</name><uri>http://www.blogger.com/profile/11331138719104479605</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5617654747865265950.post-5432898326529355045</id><published>2009-10-13T09:34:00.000+05:00</published><updated>2009-10-13T09:34:27.027+05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='задачи'/><title type='text'>Задачка</title><content type='html'>Вывести в Transcript матрицу вида:&lt;br /&gt;&lt;br /&gt;123456789&lt;br /&gt;012345678&lt;br /&gt;009123456&lt;br /&gt;000789123&lt;br /&gt;000045678&lt;br /&gt;000009123&lt;br /&gt;000000456&lt;br /&gt;000000078&lt;br /&gt;000000009&lt;br /&gt;&lt;br /&gt;Реализовать это, разумеется, в цикле.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5617654747865265950-5432898326529355045?l=chaetal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chaetal.blogspot.com/feeds/5432898326529355045/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://chaetal.blogspot.com/2009/10/blog-post.html#comment-form' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5617654747865265950/posts/default/5432898326529355045'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5617654747865265950/posts/default/5432898326529355045'/><link rel='alternate' type='text/html' href='http://chaetal.blogspot.com/2009/10/blog-post.html' title='Задачка'/><author><name>chaetal</name><uri>http://www.blogger.com/profile/11331138719104479605</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5617654747865265950.post-6116471665598291945</id><published>2009-10-09T23:28:00.000+05:00</published><updated>2009-10-09T23:28:00.529+05:00</updated><title type='text'>Кратко и по-русски о синтаксисе Smalltalk</title><content type='html'>&lt;a href="http://philatov.habrahabr.ru/blog/72007/"&gt;http://philatov.habrahabr.ru/blog/72007/&lt;/a&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5617654747865265950-6116471665598291945?l=chaetal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chaetal.blogspot.com/feeds/6116471665598291945/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://chaetal.blogspot.com/2009/10/smalltalk.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5617654747865265950/posts/default/6116471665598291945'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5617654747865265950/posts/default/6116471665598291945'/><link rel='alternate' type='text/html' href='http://chaetal.blogspot.com/2009/10/smalltalk.html' title='Кратко и по-русски о синтаксисе Smalltalk'/><author><name>chaetal</name><uri>http://www.blogger.com/profile/11331138719104479605</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5617654747865265950.post-8000237634247110601</id><published>2009-10-08T12:04:00.002+05:00</published><updated>2009-10-08T12:11:19.002+05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='темы'/><title type='text'>Store + SVN</title><content type='html'>Взаимодействие Smalltalk-овских систем управления кодом/версиями (в частности Store в VW) с традиционными файловыми (в частности, SVN)&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5617654747865265950-8000237634247110601?l=chaetal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chaetal.blogspot.com/feeds/8000237634247110601/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://chaetal.blogspot.com/2009/10/store-svn.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5617654747865265950/posts/default/8000237634247110601'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5617654747865265950/posts/default/8000237634247110601'/><link rel='alternate' type='text/html' href='http://chaetal.blogspot.com/2009/10/store-svn.html' title='Store + SVN'/><author><name>chaetal</name><uri>http://www.blogger.com/profile/11331138719104479605</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5617654747865265950.post-4536257187522315786</id><published>2009-09-29T21:54:00.000+05:00</published><updated>2009-09-29T21:54:24.801+05:00</updated><title type='text'>Test-Driven Development --- некоторые тезисы</title><content type='html'>0. "Предпосылка": программирование в стиле "сначала использование, потом реализация" в Smalltalk.&lt;br /&gt;1. TDD = Test-First + Test Automation + Refactoring.&lt;br /&gt;2.&amp;nbsp; По сути, TDD является &lt;i&gt;научным открытием&lt;/i&gt;: написание тестов и анализ (+ частично проектирование) --- очень близкие виды деятельности.&lt;br /&gt;3. TDD --- agile-методология &lt;i&gt;для разработчиков&lt;/i&gt; (кстати, до сих пор единственная мне известная).&lt;br /&gt;4. ... А "менеджерские" методологии не будут работать, если разработчики не будут agile-ными.&lt;br /&gt;5. Итерации внутри итераций.&lt;br /&gt;6. (Неформальная постановка задачи-&amp;gt;) Создание теста (Формальная постановка задачи) -&amp;gt; Реализация -&amp;gt; Рефакторинг&lt;br /&gt;7. В Smalltalk-е TDD в значительной степени реализуется как "программирование в отладчике"&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5617654747865265950-4536257187522315786?l=chaetal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chaetal.blogspot.com/feeds/4536257187522315786/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://chaetal.blogspot.com/2009/09/test-driven-development.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5617654747865265950/posts/default/4536257187522315786'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5617654747865265950/posts/default/4536257187522315786'/><link rel='alternate' type='text/html' href='http://chaetal.blogspot.com/2009/09/test-driven-development.html' title='Test-Driven Development --- некоторые тезисы'/><author><name>chaetal</name><uri>http://www.blogger.com/profile/11331138719104479605</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5617654747865265950.post-2424159001476065566</id><published>2009-09-21T21:37:00.000+05:00</published><updated>2009-09-21T21:37:46.668+05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='history'/><title type='text'>Xerox PARC --- опередившая время</title><content type='html'>(взято с &lt;a href="http://gwtsmalltalk.wordpress.com/2009/09/20/the-spirit-of-parc/"&gt;The Spirit of PARC&lt;/a&gt;) &lt;br /&gt;Изобретено в &lt;a href="http://en.wikipedia.org/wiki/Xerox_Parc"&gt;Xerox Palo Alto Research Center&lt;/a&gt;:&lt;br /&gt;- лазерный принтер&lt;br /&gt;- современный &lt;a href="http://ru.wikipedia.org/wiki/%D0%93%D1%80%D0%B0%D1%84%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%B8%D0%BD%D1%82%D0%B5%D1%80%D1%84%D0%B5%D0%B9%D1%81_%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D1%8F"&gt;графический интерфейс пользователя&lt;/a&gt;&lt;br /&gt;- первый текстовый редактор &lt;a href="http://ru.wikipedia.org/wiki/WYSIWYG"&gt;"что видишь, то и получаешь" :) (WYSIWYG)&lt;/a&gt;&lt;br /&gt;- предок языка &lt;a href="http://ru.wikipedia.org/wiki/Postscript"&gt;PostScript&lt;/a&gt;&lt;br /&gt;- &lt;a href="http://ru.wikipedia.org/wiki/Ethernet"&gt;Ethernet&lt;/a&gt;&lt;br /&gt;- объектно-ориентированное программирование&lt;br /&gt;- &lt;a href="http://ru.wikipedia.org/wiki/%D0%A1%D1%80%D0%B5%D0%B4%D0%B0_%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B8_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE_%D0%BE%D0%B1%D0%B5%D1%81%D0%BF%D0%B5%D1%87%D0%B5%D0%BD%D0%B8%D1%8F"&gt;интегрированная среда разработки&lt;/a&gt; (и выполнения!)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Два последний пункта --- это &lt;b&gt;Smalltalk&lt;/b&gt;.&lt;/span&gt;&lt;br /&gt;&lt;i&gt;&lt;span lang="en" xml:lang="en"&gt;&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5617654747865265950-2424159001476065566?l=chaetal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chaetal.blogspot.com/feeds/2424159001476065566/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://chaetal.blogspot.com/2009/09/xerox-parc.html#comment-form' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5617654747865265950/posts/default/2424159001476065566'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5617654747865265950/posts/default/2424159001476065566'/><link rel='alternate' type='text/html' href='http://chaetal.blogspot.com/2009/09/xerox-parc.html' title='Xerox PARC --- опередившая время'/><author><name>chaetal</name><uri>http://www.blogger.com/profile/11331138719104479605</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5617654747865265950.post-239325502337536926</id><published>2009-09-15T23:26:00.000+05:00</published><updated>2009-09-15T23:26:12.763+05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='smalltalk'/><title type='text'>Самое начало: только объекты --- а что такое объект?</title><content type='html'>Весь Smalltalk базируется на нескольких простых принципах. Сейчас рассмотрим пару, и один --- подробно.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;1. Все в Smalltalk-е является объектом.&lt;/b&gt; &lt;br /&gt;&lt;br /&gt;Подробнее этот принцип обсудим в другой раз. Сейчас займемся другим пунктом... Ведь это первое утверждение, по сути, является "апофатическим": говорит о том, чего нет в Smalltalk-е --- "не-объектов". &lt;i&gt;А вот что такое объект?&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;На самом деле, в этом вопросе содержится сразу два: &lt;br /&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;Что такое объект "извне" --- как ими пользоваться?&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Что такое объект "изнутри" --- как он устроены и как создать "свой" объект?&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;&lt;span style="font-size: x-small;"&gt;(Объект как, соответственно, ноумен и феномен?)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;Сейчас рассмотрим только первую часть.&lt;br /&gt;&lt;br /&gt;"Извне" объект весьма прост (и в этом, наверное, и заложена вся сила ООП): объект это то, что может что-то сделать (для нас). Нужно всего лишь попросить его. Просьба --- это &lt;span style="font-style: italic;"&gt;сообщение&lt;/span&gt;. В сообщении мы должны изложить суть нашей просьбы (ее "название") и указать необходимые для ее выполнения "материалы" --- другие объекты, с использованием которых просьба может быть выполнена.&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div style="color: black;"&gt;&lt;span style="font-size: x-small;"&gt;Примерно так же мы пользуемся объектами в жизни (правда не всегда сообщения вербальны)?&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: x-small;"&gt;&lt;span style="font-size: small;"&gt;Сообственно, мы уже "расписали" второй принцип:&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: x-small;"&gt;&lt;b&gt;&lt;span style="font-size: small;"&gt; 2. Все вычисления выполняются через посылку сообщений.&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;Синтаксис Smalltalk отвечает этому принципу максимально близко к естественному языку. Для примера:&lt;/div&gt;&lt;blockquote&gt;&lt;div&gt;&lt;span style="font-style: italic;"&gt;почтальон&amp;nbsp;&lt;/span&gt;&lt;u&gt;&lt;span style="font-style: italic;"&gt;доставь:&lt;/span&gt;&lt;/u&gt;&lt;span style="font-style: italic;"&gt; письмо &lt;/span&gt;&lt;u&gt;&lt;span style="font-style: italic;"&gt;по:&lt;/span&gt;&lt;/u&gt;&lt;span style="font-style: italic;"&gt; адрес.&lt;/span&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;span style="font-size: x-small;"&gt;Примечание: Smalltalk, естественно, ориентирован наанглийский язык; в русской версии за счет наличия окончаний в различных падежах либо выглядит не столь "естественно" (лучше бы смотрелось "&lt;/span&gt;&lt;span style="font-size: x-small; font-style: italic;"&gt;... по: адресу&lt;/span&gt;&lt;span style="font-size: x-small;"&gt;"),либо требует доработки компирятора (что, кстати, выглядит не оченьсложной задачей). Но в любом случае далее будем использовать "нормальный" англоязычныйсинтаксис.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;В обычном, англоязычном Smalltalk-е указанный пример будет выглядеть так:&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;div&gt;&lt;span style="font-style: italic;"&gt;&lt;b&gt;postman&lt;/b&gt; &lt;u&gt;&lt;u&gt;deliver&lt;/u&gt;&lt;/u&gt;&lt;/span&gt;&lt;u&gt;&lt;span style="font-style: italic;"&gt;:&lt;/span&gt;&lt;/u&gt;&lt;span style="font-style: italic;"&gt;&amp;nbsp; letter &lt;u&gt;to&lt;/u&gt;&lt;/span&gt;&lt;u&gt;&lt;span style="font-style: italic;"&gt;:&lt;/span&gt;&lt;/u&gt;&lt;span style="font-style: italic;"&gt; address.&lt;/span&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;div&gt;Получили (почти) обычное предложение. Подлежащее в нем --- объект &lt;span style="font-style: italic;"&gt;&lt;b&gt;почтальон&lt;/b&gt; --- &lt;/span&gt;в терминах Smalltalk называется &lt;span style="font-style: italic;"&gt;получателем &lt;/span&gt;(сообщения)&lt;span style="font-style: italic;"&gt;.&lt;/span&gt;&amp;nbsp;Само сообщение включает в себя&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;"имя" (в терминах Smalltalk --- &lt;span style="font-style: italic;"&gt;селектор&lt;/span&gt;; почему селектор --- будет ясно позже, при рассмотрении внутреннего устройства объектов) --- в данном случае именем является&amp;nbsp;&lt;span style="font-style: italic;"&gt;доставь:по:&lt;/span&gt; --- (почти) сказуемое&lt;/li&gt;&lt;li&gt;аргументы (дополнения) --- объекты &lt;span style="font-style: italic;"&gt;письмо &lt;/span&gt;и &lt;span style="font-style: italic;"&gt;адрес&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;span style="font-style: italic;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;span style="font-size: x-small;"&gt;&lt;i&gt;Продолжение следует...&lt;/i&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5617654747865265950-239325502337536926?l=chaetal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chaetal.blogspot.com/feeds/239325502337536926/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://chaetal.blogspot.com/2009/09/blog-post.html#comment-form' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5617654747865265950/posts/default/239325502337536926'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5617654747865265950/posts/default/239325502337536926'/><link rel='alternate' type='text/html' href='http://chaetal.blogspot.com/2009/09/blog-post.html' title='Самое начало: только объекты --- а что такое объект?'/><author><name>chaetal</name><uri>http://www.blogger.com/profile/11331138719104479605</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5617654747865265950.post-7731399928649934091</id><published>2009-09-14T19:58:00.002+05:00</published><updated>2009-09-14T19:59:30.003+05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='2009 schedule'/><title type='text'>Неделя 3: Коллекции</title><content type='html'>&lt;h2&gt;&lt;/h2&gt;Обзор: Collection, Set, Bag, Array, OrderedCollection, Dictionary c примерами.&lt;br /&gt;Смотрим (в Workspace), как работает очередной метод, разбираем его устройство (параллельно осваивая Debugger и Browser)...&lt;br /&gt;За лекцию и практическое занятие можно успеть, не очень торопясь:&lt;br /&gt;1. Collection: базовый класс&lt;br /&gt;2. Set: добавление, удаление элементов; проверка вхождения; nil не работает; size&lt;br /&gt;3. Bag: то же самое, но с количеством вхождений&lt;br /&gt;4. Array: не изменяет размер; создание через #new:, #new:withAll; литерально; first&lt;br /&gt;5. OrderedCollection: можно добавлять/удалять элементы&lt;br /&gt;6. Печать элементов коллекции в Transcript: "С"-подобный вариант; через #do:&lt;br /&gt;7. #select:, #collect:, #detect:, #detect:ifNone: --- с реализацией&lt;br /&gt;8. #inject:into: --- принцип, пример использования (вычисление суммы); устройство и другие примеры --- на самостоятельное изучение&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5617654747865265950-7731399928649934091?l=chaetal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chaetal.blogspot.com/feeds/7731399928649934091/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://chaetal.blogspot.com/2009/09/3.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5617654747865265950/posts/default/7731399928649934091'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5617654747865265950/posts/default/7731399928649934091'/><link rel='alternate' type='text/html' href='http://chaetal.blogspot.com/2009/09/3.html' title='Неделя 3: Коллекции'/><author><name>chaetal</name><uri>http://www.blogger.com/profile/11331138719104479605</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5617654747865265950.post-4367761536466574028</id><published>2009-09-12T00:29:00.000+05:00</published><updated>2009-09-12T00:29:58.664+05:00</updated><title type='text'>Пример сайта на Seaside</title><content type='html'>Беззастенчиво пиарю сайт &lt;a href="http://doslovno.info/"&gt;Дословно.Инфо&lt;/a&gt;. Сделан на &lt;a href="http://www.pharo-project.org/"&gt;Pharo Smalltalk&lt;/a&gt; + &lt;a href="http://www.seaside.st/"&gt;Seaside&lt;/a&gt; + &lt;a href="http://www.piercms.com/"&gt;Pier&lt;/a&gt;. Упоминается &lt;a href="http://www.pharo-project.org/about/success-stories"&gt;здесь&lt;/a&gt; и &lt;a href="http://www.piercms.com/doc/examples"&gt;здесь&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5617654747865265950-4367761536466574028?l=chaetal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chaetal.blogspot.com/feeds/4367761536466574028/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://chaetal.blogspot.com/2009/09/seaside.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5617654747865265950/posts/default/4367761536466574028'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5617654747865265950/posts/default/4367761536466574028'/><link rel='alternate' type='text/html' href='http://chaetal.blogspot.com/2009/09/seaside.html' title='Пример сайта на Seaside'/><author><name>chaetal</name><uri>http://www.blogger.com/profile/11331138719104479605</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5617654747865265950.post-8989174145744755574</id><published>2009-09-10T11:39:00.000+05:00</published><updated>2009-10-08T12:11:19.002+05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='темы'/><title type='text'>Web Development Using WebVelocity</title><content type='html'>... пока без комментариев&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5617654747865265950-8989174145744755574?l=chaetal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chaetal.blogspot.com/feeds/8989174145744755574/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://chaetal.blogspot.com/2009/09/web-development-using-webvelocity.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5617654747865265950/posts/default/8989174145744755574'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5617654747865265950/posts/default/8989174145744755574'/><link rel='alternate' type='text/html' href='http://chaetal.blogspot.com/2009/09/web-development-using-webvelocity.html' title='Web Development Using WebVelocity'/><author><name>chaetal</name><uri>http://www.blogger.com/profile/11331138719104479605</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5617654747865265950.post-8828957697063784318</id><published>2009-09-09T22:07:00.016+05:00</published><updated>2009-09-09T23:47:17.277+05:00</updated><title type='text'>Классы и метаклассы --- часть 1</title><content type='html'>&lt;span style="font-size:78%;"&gt;"Мета" = "о"&lt;br /&gt;"Метакласс"= "класс о классе"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Smalltalk&lt;/span&gt; построен на нескольких базовых принципах. Два из них: &lt;span style="font-weight: bold;"&gt;(*)&lt;/span&gt; &lt;span style="font-style: italic;"&gt;все является объектом&lt;/span&gt; и &lt;span style="font-weight: bold;"&gt;(**)&lt;/span&gt; &lt;span style="font-style: italic;"&gt;каждый объект является экземпляром некоторого класса, описывающего поведение всех своих экземпляров&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Из этих принципов следует, что &lt;span style="font-weight: bold;"&gt;(*)&lt;/span&gt;=&gt; каждый класс является объектом, и &lt;span style="font-weight: bold;"&gt;(**)&lt;/span&gt;=&gt; является экземпляром некоторого класса --- назовем его &lt;span style="font-weight: bold;"&gt;метаклассом&lt;/span&gt; данного класса.&lt;br /&gt;&lt;br /&gt;Рассмотрим некоторый класс &lt;code&gt;C&lt;/code&gt;. Экземпляром какого класса он является?&lt;br /&gt;&lt;br /&gt;Существует два способа ответить на этот вопрос: (А) все классы являются экземплярами некоторого единственного метакласса, и (Б) каждый класс (в общем случае) является экземпляром некоторого "своего собственного" метакласса.&lt;br /&gt;&lt;br /&gt;Поскольку различные классы в &lt;span style="font-style: italic;"&gt;Smalltalk&lt;/span&gt; обладают различным поведением (см. примечание 1), вариант (А) не подходит, т.к. поведение всех классов будет одинаковым --- оно описано в единственном метаклассе.&lt;br /&gt;&lt;br /&gt;Таким образом, класс &lt;code&gt;C&lt;/code&gt; является экземпляром своего некоторого собственного, "личного" метакласса.&lt;br /&gt;&lt;br /&gt;Чтобы определить, экземпляром какого класса является некоторый объект, ему можно послать сообщение &lt;code&gt;#class&lt;/code&gt;. Например:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;(Point x: 1 y: 2) class "printIt -&gt; Point"&lt;br /&gt;Point class "printIt -&gt; Point class"&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;"Личные" метаклассы в Smalltalk не имеют собственного имени (так как ими очень редко пользуются люди) и их текстовое представление совпадает с текстом посылки сообщения на получение метакласса.&lt;br /&gt;&lt;br /&gt;Поскольку поведение у всех "личных" метаклассов одинаково, они имеют общий метакласс:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;Point class class "printIt -&gt; Metaclass"&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Класс Metaclass имеет свое собственное поведение и, соответственно, собственный метакласс:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;Metaclass class "printIt -&gt; Metaclass class"&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Метакласс класса Metaclass является обычным метаклассом и, соответственно, его метаклассом является Metaclass.&lt;span style="font-style: italic;"&gt; "Метаклассом класса Metaclass class является класс Metaclass"&lt;/span&gt; :)&lt;br /&gt;&lt;br /&gt;--- Примечание 1.&lt;br /&gt;Например, класс Point должен иметь метод &lt;code&gt;#x:y:&lt;/code&gt; для создания точки сзаданными координатами:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;Point x: 1 y: 2.&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Для большинства других классов (&lt;code&gt;String&lt;/code&gt;, &lt;code&gt;Integer&lt;/code&gt;, &lt;code&gt;Boolean&lt;/code&gt;,...) этот метод смысла не имеет.&lt;br /&gt;---&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;font-size:85%;" &gt;... продолжение следует...&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5617654747865265950-8828957697063784318?l=chaetal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chaetal.blogspot.com/feeds/8828957697063784318/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://chaetal.blogspot.com/2009/09/1.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5617654747865265950/posts/default/8828957697063784318'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5617654747865265950/posts/default/8828957697063784318'/><link rel='alternate' type='text/html' href='http://chaetal.blogspot.com/2009/09/1.html' title='Классы и метаклассы --- часть 1'/><author><name>chaetal</name><uri>http://www.blogger.com/profile/11331138719104479605</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5617654747865265950.post-6782908067487891851</id><published>2009-09-08T19:59:00.002+05:00</published><updated>2009-10-08T12:11:19.003+05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='темы'/><title type='text'>UI + Metadescriptions</title><content type='html'>Исследование возможностей использования мета-описаний для создания "универсального" UI Framework&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5617654747865265950-6782908067487891851?l=chaetal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chaetal.blogspot.com/feeds/6782908067487891851/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://chaetal.blogspot.com/2009/09/ui-metadescriptions.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5617654747865265950/posts/default/6782908067487891851'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5617654747865265950/posts/default/6782908067487891851'/><link rel='alternate' type='text/html' href='http://chaetal.blogspot.com/2009/09/ui-metadescriptions.html' title='UI + Metadescriptions'/><author><name>chaetal</name><uri>http://www.blogger.com/profile/11331138719104479605</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5617654747865265950.post-2270783342396596043</id><published>2009-09-08T19:55:00.003+05:00</published><updated>2009-09-08T19:59:01.907+05:00</updated><title type='text'>Smalltalk + Java</title><content type='html'>Возможности использования Java-кода из Smalltalk (VW). &lt;a href="http://www.info.ucl.ac.be/~jbrichau/javaconnect.html"&gt;JavaConnect&lt;/a&gt; и &lt;a href="http://jniport.wikispaces.com/"&gt;JNIPort&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5617654747865265950-2270783342396596043?l=chaetal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chaetal.blogspot.com/feeds/2270783342396596043/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://chaetal.blogspot.com/2009/09/smalltalk-java.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5617654747865265950/posts/default/2270783342396596043'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5617654747865265950/posts/default/2270783342396596043'/><link rel='alternate' type='text/html' href='http://chaetal.blogspot.com/2009/09/smalltalk-java.html' title='Smalltalk + Java'/><author><name>chaetal</name><uri>http://www.blogger.com/profile/11331138719104479605</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5617654747865265950.post-3221460146620768015</id><published>2009-04-03T07:37:00.012+05:00</published><updated>2009-04-03T08:02:07.571+05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mocks'/><category scheme='http://www.blogger.com/atom/ns#' term='smalltalk'/><category scheme='http://www.blogger.com/atom/ns#' term='tdd'/><title type='text'>Пример работы с mock-ами</title><content type='html'>&lt;h4&gt;Контекст&lt;/h4&gt;&lt;br /&gt;Сайт. Пользователь может задавать вопросы, заполняя и отправляя соответствующую форму. Вопросы представлены экземплярами класса Question. Когда вопрос изменяется (в результате редактирования пользователем) он получает сообщение #changed.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Задача&lt;/h4&gt;&lt;br /&gt;Когда изменяется вопрос, нужно отослать соответствующее оповещение администратору сайта.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Решение&lt;/h4&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;(1) QuestionTests &gt;&gt; testNotifiesAdminOnChange&lt;br /&gt;(2)  | question |&lt;br /&gt;(3)  question := Question new.&lt;br /&gt;(4)  [ :notifier |&lt;br /&gt;(5)    question notifier: notifier.&lt;br /&gt;(6)    [ question changed ] &lt;br /&gt;(7)        should strictly satisfy:&lt;br /&gt;(8)            [ notifier notifyAdminAbout: question ] &lt;br /&gt;(9)  ] runScenario&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Пояснение&lt;/h4&gt;&lt;br /&gt;В строках (4) -- (9) создается &lt;i&gt;сценарий&lt;/i&gt;. &lt;br /&gt;Параметры сценария (строка (4)) инициализируются mock-объектами.&lt;br /&gt;В блоке (6) описываются действия, определяющие тестируемую ситуацию: &lt;i&gt;question&lt;/i&gt; получает сообщение &lt;i&gt;#changed&lt;/i&gt;. &lt;br /&gt;В строке (7) задается условие: в результате этих (заданных выше в строке (6) действий должно происходить строго в заданной последовательности то, что записано в блоке строки (8).&lt;br /&gt;В этом блоке записано, что объект &lt;i&gt;notifier&lt;/i&gt; должен получить сообщение &lt;i&gt;#notifyAdminAbout:&lt;/i&gt; с аргументом, идентичным &lt;i&gt;question&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;&lt;u&gt;Обратите внимание!&lt;/u&gt; Не указывается, к какому классу будут принадлежать нотификаторы, с которыми будут работать вопросы.&lt;br /&gt;Далее разработка будет включать шаги по созданию и описанию поведения такого класса.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Замечание&lt;/h4&gt;&lt;br /&gt;Также, возможно, потребуется рефакторинг по вынесению адресата оповещения в параметр и (в дальнейшем, возможно) изменению системы отсылки сообщения. На это указывает наличие указания на адресата (admin) в селекторе сообщения &lt;i&gt;#notifyAdminAbout:&lt;/i&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5617654747865265950-3221460146620768015?l=chaetal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chaetal.blogspot.com/feeds/3221460146620768015/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://chaetal.blogspot.com/2009/04/mock.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5617654747865265950/posts/default/3221460146620768015'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5617654747865265950/posts/default/3221460146620768015'/><link rel='alternate' type='text/html' href='http://chaetal.blogspot.com/2009/04/mock.html' title='Пример работы с mock-ами'/><author><name>chaetal</name><uri>http://www.blogger.com/profile/11331138719104479605</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5617654747865265950.post-9090784668128438411</id><published>2009-03-20T07:15:00.009+04:00</published><updated>2009-03-20T08:00:58.050+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><category scheme='http://www.blogger.com/atom/ns#' term='smalltalk'/><category scheme='http://www.blogger.com/atom/ns#' term='tdd'/><title type='text'>Идея и некоторые тезисы курса по ГМ и Smalltalk</title><content type='html'>Логика примерно такая:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Гибкие методологии&lt;/span&gt; --- это хорошо. Поэтому их надо применять. Применять можно на разных уровнях. Базовый уровень --- программистский. Здесь работает &lt;span style="font-style:italic;"&gt;Test-Driven Development&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Чтобы эффективно применять TDD, нужны соответствующие средства. Mainstream-овые языки на эту роль подходят не очень хорошо. С динамическими скриптовыми языками (которые тоже потихонечьку смываются в главный поток) дела, наверное, получше, но и у них многовато недостатков. В применении к ГМ на сегодняшний день Smalltalk --- (как минимум) одно из лучших решений. Поэтому будем его изучать.&lt;br /&gt;&lt;br /&gt;Эти мысли излагаются на первых двух--трех лекциях. Далее "вперемжку" (!) небольшими кусками излагаются основы программирования на Smalltalk и Test-Driven Development.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;&lt;u&gt;Примечание 1.&lt;/u&gt; Про &lt;span style="font-style:italic;"&gt;гибкие&lt;/span&gt; методологии&lt;/h4&gt;&lt;br /&gt;&lt;br /&gt;Гибкие методологии --- не очень адекватный перевод терамина Agile methodology. &lt;br /&gt;&lt;br /&gt;Agile --- проворный, шустрый, сообразительный. &lt;br /&gt;Под гибкостью же у нас издревле понимают некую универсальность, возможность приспособить (уже готовое) программную систему под любые нужды и сделать это без программирования, "играясь настройками". То есть, "гибкое" в данном понимании --- синоним сложного с целью универсальности.&lt;br /&gt;&lt;br /&gt;Идея agile --- практически обратная: простота, достаточная для конкретного узкого применения. Но простота "правильная", позволяющая приспособить код к новым задачам. Делать это предполагается программно и без серьезного усложнения кода --- по крайней мере, без претензий на то, что наш код будет без изменений работать для любых задач. Другими словами, в основе agile лежит осознание того факта, что написать универсальный код неимоверно (или по крайней мере, слишком) сложно, и мы лучше напишем просто работающий код, но будем готовы его изменять под новые задачи.&lt;br /&gt;&lt;br /&gt;Тем не менее, в русскоязычном переводе закрепился термин "гибкие", он и будет в дальнейшем использоваться.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;&lt;u&gt;Примечание 2.&lt;/u&gt; Про &lt;span style="font-style:italic;"&gt;скриптовые&lt;/span&gt; динамические языки программирования&lt;/h4&gt;&lt;br /&gt;&lt;br /&gt;Тезис по поводу скриптовых языков требует проработки и обоснования. Однако отсутствие единой среды разработки и выполнения --- уже весьма существенный "минус" (по крайней мере для разработки более-менее крупных систем).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;&lt;u&gt;Примечание 3.&lt;/u&gt; Почему &lt;span style="font-weight:bold;"&gt;Smalltalk&lt;/span&gt;?&lt;/h4&gt;&lt;br /&gt;&lt;br /&gt;Собственно, цель курса и состоит в том, чтобы ответ на этот вопрос был бы понят и &lt;span style="font-style:italic;"&gt;прочувствован&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;В кратком виде аргументация такова: Smalltalk очень прост в своей основе но при этом его выразительные возможности огромны. &lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;br /&gt;(Изначально хотел написать много тезисов. Но, похоже, все они лишь комментируют  и обосновывают данный. С ними будем разбираться уже в лекциях непосредственно по Smalltalk.)&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5617654747865265950-9090784668128438411?l=chaetal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chaetal.blogspot.com/feeds/9090784668128438411/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://chaetal.blogspot.com/2009/03/smalltalk.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5617654747865265950/posts/default/9090784668128438411'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5617654747865265950/posts/default/9090784668128438411'/><link rel='alternate' type='text/html' href='http://chaetal.blogspot.com/2009/03/smalltalk.html' title='Идея и некоторые тезисы курса по ГМ и Smalltalk'/><author><name>chaetal</name><uri>http://www.blogger.com/profile/11331138719104479605</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5617654747865265950.post-8641115369916213968</id><published>2009-03-10T14:19:00.004+04:00</published><updated>2009-10-08T12:11:40.983+05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='темы'/><title type='text'>Отложенные ошибки</title><content type='html'>Коллега предложил очень интересную идею, которую тоже можно рассмотреть в рамках курсовой.&lt;br /&gt;&lt;br /&gt;Все &lt;strike&gt;ошибки&lt;/strike&gt; необработанные исключения в программе сохраняются как континуации. Тогда разработчик в (&lt;strike&gt;далеком&lt;/strike&gt; светлом) будущем анализирует протокол и может посмотреть "живую" ошибку, исправить, а если повезет, то и завершить действия пользователя без потери данных.&lt;br /&gt;&lt;br /&gt;Особенно актуально для Web...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5617654747865265950-8641115369916213968?l=chaetal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chaetal.blogspot.com/feeds/8641115369916213968/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://chaetal.blogspot.com/2009/03/blog-post_10.html#comment-form' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5617654747865265950/posts/default/8641115369916213968'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5617654747865265950/posts/default/8641115369916213968'/><link rel='alternate' type='text/html' href='http://chaetal.blogspot.com/2009/03/blog-post_10.html' title='Отложенные ошибки'/><author><name>chaetal</name><uri>http://www.blogger.com/profile/11331138719104479605</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5617654747865265950.post-2877079199854052645</id><published>2009-03-10T10:04:00.003+04:00</published><updated>2009-10-08T12:11:19.003+05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='темы'/><title type='text'>MVC(P) для Seaside, Pier</title><content type='html'>Ссылки по теме: &lt;br /&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://martinfowler.com/eaaDev/uiArchs.html"&gt;GUI Architectures&lt;/a&gt; by Martin Fowler&lt;br /&gt;&lt;/li&gt;&lt;li&gt;(наверное) &lt;a href="http://seabreeze.heeg.de/"&gt;seaBreeze&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5617654747865265950-2877079199854052645?l=chaetal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chaetal.blogspot.com/feeds/2877079199854052645/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://chaetal.blogspot.com/2009/03/mvcp-seaside-pier.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5617654747865265950/posts/default/2877079199854052645'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5617654747865265950/posts/default/2877079199854052645'/><link rel='alternate' type='text/html' href='http://chaetal.blogspot.com/2009/03/mvcp-seaside-pier.html' title='MVC(P) для Seaside, Pier'/><author><name>chaetal</name><uri>http://www.blogger.com/profile/11331138719104479605</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5617654747865265950.post-9052766922236783029</id><published>2009-03-07T21:21:00.004+04:00</published><updated>2009-10-08T12:11:19.003+05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='темы'/><title type='text'>Content Management Systems</title><content type='html'>Цель --- разработка Web-сайтов на Smalltalk.&lt;br /&gt;Задачи:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;преимущества и недостатки Pier относительно других CMS&lt;/li&gt;&lt;li&gt;что хорошо и что не очень хорошо в устройстве Pier&lt;br /&gt;&lt;/li&gt;&lt;li&gt;перенос Pier в VisualWorks&lt;/li&gt;&lt;li&gt;разработка своей CMS&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5617654747865265950-9052766922236783029?l=chaetal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chaetal.blogspot.com/feeds/9052766922236783029/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://chaetal.blogspot.com/2009/03/content-management-systems.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5617654747865265950/posts/default/9052766922236783029'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5617654747865265950/posts/default/9052766922236783029'/><link rel='alternate' type='text/html' href='http://chaetal.blogspot.com/2009/03/content-management-systems.html' title='Content Management Systems'/><author><name>chaetal</name><uri>http://www.blogger.com/profile/11331138719104479605</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5617654747865265950.post-658088090657934093</id><published>2009-03-07T21:07:00.003+04:00</published><updated>2009-03-07T21:51:58.787+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='metablog'/><title type='text'>О чем и для кого этот блог</title><content type='html'>Здесь я буду писать о&lt;br /&gt;&lt;ul&gt;&lt;li&gt;языке программирования Smalltalk и соответствующих средах&lt;/li&gt;&lt;li&gt;методологии Test-Driven Development (TDD)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;о том, как TDD работает в Smalltalk&lt;/li&gt;&lt;li&gt;о "смежных" вопросах&lt;/li&gt;&lt;/ul&gt;Для кого я буду это писать:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;для себя --- чтобы не забыть и, надеюсь, когда-нибудь использовать эти записи&lt;/li&gt;&lt;li&gt;для студентов, которых мне доведется учить&lt;/li&gt;&lt;li&gt;для всех интересующихся указанными вопросами&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-style: italic;font-size:85%;" &gt;Замечание: весьма вероятно, этот пост будет модифицироваться в будущем... &lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5617654747865265950-658088090657934093?l=chaetal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chaetal.blogspot.com/feeds/658088090657934093/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://chaetal.blogspot.com/2009/03/blog-post_07.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5617654747865265950/posts/default/658088090657934093'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5617654747865265950/posts/default/658088090657934093'/><link rel='alternate' type='text/html' href='http://chaetal.blogspot.com/2009/03/blog-post_07.html' title='О чем и для кого этот блог'/><author><name>chaetal</name><uri>http://www.blogger.com/profile/11331138719104479605</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
