瀏覽代碼

Back-port 2016-09-03 august recap

pull/1/head
父節點
當前提交
d9794687d4
共有 12 個檔案被更改,包括 1583 行新增2 行删除
  1. 二進制
      2016-09-03_august-recap.png
  2. +301
    -0
      2016-august-recap-ru.html
  3. +301
    -0
      2016-august-recap.html
  4. +4
    -0
      archives.html
  5. +20
    -0
      author/opensource-game-studio2.html
  6. +20
    -0
      category/news2.html
  7. +349
    -1
      feeds/all.atom.xml
  8. +175
    -1
      feeds/news.atom.xml
  9. +20
    -0
      index2.html
  10. +197
    -0
      pelican/content/articles/2016-09-03_2016-august-recap-ru.md
  11. +196
    -0
      pelican/content/articles/2016-09-03_2016-august-recap.md
  12. 二進制
      pelican/content/images/2016-09-03_august-recap.png

二進制
2016-09-03_august-recap.png 查看文件

Before After
Width: 1025  |  Height: 588  |  Size: 172KB

+ 301
- 0
2016-august-recap-ru.html 查看文件

@@ -0,0 +1,301 @@
<!DOCTYPE html>
<head>
<meta charset="utf-8" />
<!-- Set the viewport width to device width for mobile -->
<meta name="viewport" content="width=device-width" />

<title>Август 2016 кратко</title>

<link rel="stylesheet" href="http://opengamestudio.org/theme/css/normalize.css" />
<link rel="stylesheet" href="http://opengamestudio.org/theme/css/foundation.min.css" />
<link rel="stylesheet" href="http://opengamestudio.org/theme/css/style.css" />
<link rel="stylesheet" href="http://opengamestudio.org/theme/css/pygments.css" />
<script src="http://opengamestudio.org/theme/js/custom.modernizr.js"></script>

<!-- So Firefox can bookmark->"abo this site" -->
<link href="feeds/all.atom.xml" rel="alternate" title="Opensource Game Studio" type="application/atom+xml">

</head>

<body>

<!-- Nav Bar -->
<nav>

<!-- Show menu items and pages -->
<div class="row">
<div class="large-12 columns top-bar">
<h1><a href="http://opengamestudio.org">Opensource Game Studio</a></h1>
</div>
</div>
<div class="row top-menu">
<div class="large-12 columns">
<a href="/pages/projects.html" class="menu-button secondary">Projects</a>
<a href="/pages/about.html" class="menu-button secondary">About</a>

</div>
</div>
</nav>
<!-- End Nav -->


<!-- Main Page Content and Sidebar -->
<div class="row">

<!-- Main Blog Content -->
<div class="large-9 columns">
<article>
<header>
<h3 class="article-title"><a href="http://opengamestudio.org/2016-august-recap-ru.html" rel="bookmark"
title="Permalink to Август 2016 кратко">Август 2016 кратко</a></h3>
</header>

<h6 class="subheader" title="2016-09-03T00:00:00+03:00">Сб 03 Сентябрь 2016
<a class="button secondary small translation-button" href="http://opengamestudio.org/2016-august-recap.html">en</a>

</h6> <p><img alt="2016-august-recap" src="http://opengamestudio.org/2016-09-03_august-recap.png" /></p>
<p>Эта статья описывает самые важные технические детали разработки за август: модуль UIQt, его переработку, новый подход к разработке на основе функционала и его преимущества.</p>
<p><strong>Модуль UIQt</strong> - это коллекция компонент UI на основе Qt. Сейчас используем лишь для интерфейса редактора.</p>
<p>Список компонент модуля UIQt с описанием и размером кода:<table>
<tr>
<th><strong>№</strong></th>
<th><strong>Компонента</strong></th>
<th><strong>Описание</strong></th>
<th><strong>Размер (Б)</strong></th>
<th><strong>Размер (%)</strong></th>
</tr>
<tr>
<td>1</td>
<td>UIQtAction</td>
<td>Действия (события) для меню</td>
<td>11224</td>
<td>9</td>
</tr>
<tr>
<td>2</td>
<td>UIQtAux</td>
<td>Инициализирует Qt и главное окно. Предоставляет поиск виджета по имени для других компонент</td>
<td>15518</td>
<td>12</td>
</tr>
<tr>
<td>3</td>
<td>UIQtDock</td>
<td>Виджет стыковки</td>
<td>5273</td>
<td>4</td>
</tr>
<tr>
<td>4</td>
<td>UIQtFileDialog</td>
<td>Диалог выбора файла</td>
<td>8960</td>
<td>7</td>
</tr>
<tr>
<td>5</td>
<td>UIQtMenu</td>
<td>Меню для главного окна и на ПКМ (вроде меню по добавлению/копированию/вставке/удалению узла)</td>
<td>4566</td>
<td>3</td>
</tr>
<tr>
<td>6</td>
<td>UIQtMenuBar</td>
<td>Панель меню для главного окна</td>
<td>4222</td>
<td>3</td>
</tr>
<tr>
<td>7</td>
<td>UIQtRunner</td>
<td>Позволяет запустить QApplication</td>
<td>2450</td>
<td>2</td>
</tr>
<tr>
<td>8</td>
<td>UIQtThumbnailDialog</td>
<td>Диалог с изображениями</td>
<td>18615</td>
<td>14</td>
</tr>
<tr>
<td>9</td>
<td>UIQtToolBar</td>
<td>Панель инструментов для главого окна</td>
<td>4276</td>
<td>3</td>
</tr>
<tr>
<td>10</td>
<td>UIQtTree</td>
<td>Предоставляет сложные виджеты вроде Дерева сцены и Редактора свойств</td>
<td>51216</td>
<td>39</td>
</tr>
<tr>
<td>11</td>
<td>UIQtWidget</td>
<td>Общие свойства виджетов вроде фокуса и видимости</td>
<td>5465</td>
<td>4</td>
</tr>
</table></p>
<p><strong>Мы переработали модуль UIQt</strong> для замены старого State API на новый Environment API, который позволяет делать то же самое лаконичнее, т.е. упрощает и ускоряет разработку.</p>
<p>Переработку начали в июле и должны были закончить в том же месяце. Тем не менеe, работы завершили лишь в августе. Начальный план предполагал, что 28 часов должно хватить, но мы потратили 65. Мы оценивали необходимое время на основе количества вызовов публичного API каждой компоненты. Это хорошо сработало для небольших компонент, т.к. число вызовов их публичного API было примерно равно количеству их функционала, а сам функционал был очень маленький. Однако такой подход полностью провалился для компонеты UIQtTree, составляющей 39% кода модуля UIQt, потому что не было прямой связи между публичным API и функционалом.</p>
<p><strong>Новый подход к разработке на основе функционала</strong> родился после решения проблем с переработкой UIQtTree. Т.к. Qt использует MVC, компонента UIQtTree состоит из нескольких классов. К тому моменту, когда UIQtTree могла отображать и управлять иерархией элементов, компонента уже имела размер в 27К. Мы заметили, что UIQtTree стала потреблять непомерное количество времени разработки даже для мелкого функционала. Это было явным проявлением <a href="http://rsdn.org/article/philosophy/Complexity.xml">количественной сложности</a>.</p>
<p>Мы решили разбить UIQtTree на базовую часть и дополнительные. База содержит лишь необходимый минимум кода. Дополнение содержит код, специфичный для данного функционала, и может быть безболезненно изменено. В случае UIQtTree, отображение и управление иерархией элементов - это минимальный функционал, а переименование элементов - это дополнение.</p>
<p>Текущий функционал UIQtTree состоит из следующих возможностей:</p>
<table>
<tr>
<th>**№**</th>
<th>**Функционал**</th>
<th>**Описание**</th>
<th>**Размер (Б)**</th>
<th>**Размер (%)**</th>
</tr>
<tr>
<td>1</td>
<td>Base</td>
<td>Создание, изменение, отображение иерархии элементов</td>
<td>26966</td>
<td>52</td>
</tr>
<tr>
<td>2</td>
<td>Item open state</td>
<td>Хранит состояние свойства скрыто/отображено элемента</td>
<td>3094</td>
<td>6</td>
</tr>
<tr>
<td>3</td>
<td>Item renaming</td>
<td>Переименование элемента</td>
<td>3471</td>
<td>7</td>
</tr>
<tr>
<td>4</td>
<td>Item selection</td>
<td>Получение/установка выбранного элемента</td>
<td>2338</td>
<td>5</td>
</tr>
<tr>
<td>5</td>
<td>Item value</td>
<td>Предоставляет второй и последующие столбцы для элементов, используется Редактором свойств</td>
<td>1307</td>
<td>3</td>
</tr>
<tr>
<td>6</td>
<td>Item value editing</td>
<td>Редактирование значений элемента с помощью стандартного виджета</td>
<td>1996</td>
<td>4</td>
</tr>
<tr>
<td>7</td>
<td>Item value editing with combobox</td>
<td>Редактирование значений элемента с помощью виджета combobox</td>
<td>5819</td>
<td>11</td>
</tr>
<tr>
<td>8</td>
<td>Item value editing with spinner</td>
<td>Редактирование значений элемента с помощью виджета spinbox</td>
<td>5290</td>
<td>10</td>
</tr>
<tr>
<td>9</td>
<td>Menu</td>
<td>Меню на ПКМ</td>
<td>1248</td>
<td>2</td>
</tr>
</table>

<p>Пример файла функционала Menu для UIQtTree: <a href="https://bitbucket.org/ogstudio-history/mjin/src/0c4cc3c3213f4687c0f3bd6a5426a6054cadd79b/f/TREE_MENU.cpp?at=Studio+0.10&amp;fileviewer=file-view-default">TREE_MENU</a>.</p>
<p><strong>Преимущества подхода:</strong></p>
<ol>
<li>Более быстрое чтение/понимание благодаря небольшому размеру</li>
<li>Более простое и безболезненное изменение благодаря изолированному коду</li>
</ol>
<p>Есть и недостаток: новый подход требует изучения.</p>
<p>На этом мы заканчиваем описание самых важных технических деталей разработки за август: модуль UIQt, его переработку, новый подход к разработке на основе функционала и его преимущества.</p>
<p class="subheader">Category: <a href="http://opengamestudio.org/category/news.html">News</a>

</p>



</article>
</div>
<!-- End Main Content -->

<!-- Sidebar -->
<aside class="large-3 columns">
<!--k
<h5 class="sidebar-title">Site</h5>
<ul class="side-nav">
<li><a href="http://opengamestudio.org/archives.html">Archives</a>
<li><a href="http://opengamestudio.org/tags.html">Tags</a>


<li><a href="http://opengamestudio.org/feeds/all.atom.xml" rel="alternate">Atom feed</a></li>
</ul>

<h5 class="sidebar-title">Categories</h5>
<ul class="side-nav">
<li><a href="http://opengamestudio.org/category/news.html">News</a></li>
</ul>
-->


<h5 class="sidebar-title">Ads</h5>
<script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
<!-- ogs2 -->
<ins class="adsbygoogle"
style="display:block"
data-ad-client="ca-pub-4473792248813084"
data-ad-slot="9024247127"
data-ad-format="auto"></ins>
<script>
(adsbygoogle = window.adsbygoogle || []).push({});
</script>

</aside> <!-- End Sidebar -->

</div> <!-- End Main Content and Sidebar -->


<!-- Footer -->
<footer class="row">
<div class="large-12 columns">
<hr />
<div class="row">
<div class="large-7 columns">
<p>Proudly powered by <a href="http://getpelican.com">Pelican</a>, which takes great advantage of <a href="http://python.org">Python</a>.</p>
</div>
</div>
</div>
<script type="text/javascript">
var _gaq = _gaq || [];
_gaq.push(['_setAccount', 'UA-3773114-1']);
_gaq.push(['_trackPageview']);
(function() {
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
})();
</script>
</footer>

+ 301
- 0
2016-august-recap.html 查看文件

@@ -0,0 +1,301 @@
<!DOCTYPE html>
<head>
<meta charset="utf-8" />
<!-- Set the viewport width to device width for mobile -->
<meta name="viewport" content="width=device-width" />

<title>August 2016 recap</title>

<link rel="stylesheet" href="http://opengamestudio.org/theme/css/normalize.css" />
<link rel="stylesheet" href="http://opengamestudio.org/theme/css/foundation.min.css" />
<link rel="stylesheet" href="http://opengamestudio.org/theme/css/style.css" />
<link rel="stylesheet" href="http://opengamestudio.org/theme/css/pygments.css" />
<script src="http://opengamestudio.org/theme/js/custom.modernizr.js"></script>

<!-- So Firefox can bookmark->"abo this site" -->
<link href="feeds/all.atom.xml" rel="alternate" title="Opensource Game Studio" type="application/atom+xml">

</head>

<body>

<!-- Nav Bar -->
<nav>

<!-- Show menu items and pages -->
<div class="row">
<div class="large-12 columns top-bar">
<h1><a href="http://opengamestudio.org">Opensource Game Studio</a></h1>
</div>
</div>
<div class="row top-menu">
<div class="large-12 columns">
<a href="/pages/projects.html" class="menu-button secondary">Projects</a>
<a href="/pages/about.html" class="menu-button secondary">About</a>

</div>
</div>
</nav>
<!-- End Nav -->


<!-- Main Page Content and Sidebar -->
<div class="row">

<!-- Main Blog Content -->
<div class="large-9 columns">
<article>
<header>
<h3 class="article-title"><a href="http://opengamestudio.org/2016-august-recap.html" rel="bookmark"
title="Permalink to August 2016 recap">August 2016 recap</a></h3>
</header>

<h6 class="subheader" title="2016-09-03T00:00:00+03:00">Сб 03 Сентябрь 2016
<a class="button secondary small translation-button" href="http://opengamestudio.org/2016-august-recap-ru.html">ru</a>

</h6> <p><img alt="2016-august-recap" src="http://opengamestudio.org/2016-09-03_august-recap.png" /></p>
<p>This article explains the most important technical details about development in August: UIQt module, its refactoring, a new feature based development approach, and its benefits.</p>
<p><strong>UIQt module</strong> is a collection of UI components backed by Qt. We only use it for Editor UI at the moment.</p>
<p>Here is a list of UIQt module components with their description and current code size:<table>
<tr>
<th><strong>№</strong></th>
<th><strong>Component</strong></th>
<th><strong>Description</strong></th>
<th><strong>Size (B)</strong></th>
<th><strong>Size (%)</strong></th>
</tr>
<tr>
<td>1</td>
<td>UIQtAction</td>
<td>Actions (events) for menus</td>
<td>11224</td>
<td>9</td>
</tr>
<tr>
<td>2</td>
<td>UIQtAux</td>
<td>Initializes Qt and main window. Provides widget resolution by name to other components</td>
<td>15518</td>
<td>12</td>
</tr>
<tr>
<td>3</td>
<td>UIQtDock</td>
<td>Widget docks</td>
<td>5273</td>
<td>4</td>
</tr>
<tr>
<td>4</td>
<td>UIQtFileDialog</td>
<td>File selection dialogs</td>
<td>8960</td>
<td>7</td>
</tr>
<tr>
<td>5</td>
<td>UIQtMenu</td>
<td>Menus for main window and pop-ups (like node's add/copy/paste/delete menu)</td>
<td>4566</td>
<td>3</td>
</tr>
<tr>
<td>6</td>
<td>UIQtMenuBar</td>
<td>Menu bar for main window</td>
<td>4222</td>
<td>3</td>
</tr>
<tr>
<td>7</td>
<td>UIQtRunner</td>
<td>Allows to start QApplication</td>
<td>2450</td>
<td>2</td>
</tr>
<tr>
<td>8</td>
<td>UIQtThumbnailDialog</td>
<td>Dialog with thumbnail images</td>
<td>18615</td>
<td>14</td>
</tr>
<tr>
<td>9</td>
<td>UIQtToolBar</td>
<td>Tool bar for main window</td>
<td>4276</td>
<td>3</td>
</tr>
<tr>
<td>10</td>
<td>UIQtTree</td>
<td>Provides complex widgets like Scene tree and Property browser</td>
<td>51216</td>
<td>39</td>
</tr>
<tr>
<td>11</td>
<td>UIQtWidget</td>
<td>Common widget properties like focus and visibility</td>
<td>5465</td>
<td>4</td>
</tr>
</table></p>
<p><strong>UIQt module refactoring</strong> purpose was to replace old State API with new Environment API, which allows to achieve the same functionality with less code, i.e., makes development easier and faster.</p>
<p>Refactoring started in July and should have been done the same month. However, we only finished the work in August. Initial plan assumed 28 hours would be enough, but we spent 65 instead. We estimated planned time by relying on the number of public API calls of each component. That worked fine for small components, because the number of their public API calls was roughly equal to the number of their features, and features themselves were very small. However, it totally failed for UIQtTree, which contains 39% of UIQt module code, because there was no direct connection between public API and features.</p>
<p><strong>Feature based development approach</strong> was born as a result of UIQtTree refactoring struggle. Since Qt uses MVC, UIQtTree component consists of several classes. By the time UIQtTree could display and manage a hierarchy of items, the component was already 27K in size. We noticed UIQtTree started to require abnormal amount of development time even for tiny features. This was an obvious <a href="http://kornerr.blogspot.com/2012/04/complexity-conservation-law-complexity.html">quantitative complexity</a> manifestation.</p>
<p>We decided to separate UIQtTree into base part and additional ones. Base would only contain minimal code required by all features. Addition would contain specific feature code and could be safely modified. In the case of UIQtTree, item hierarchy display and modification is the minimal functionality, while item renaming is an addition.</p>
<p>Here is a list of current UIQtTree features:</p>
<table>
<tr>
<th>**№**</th>
<th>**Feature**</th>
<th>**Description**</th>
<th>**Size (B)**</th>
<th>**Size (%)**</th>
</tr>
<tr>
<td>1</td>
<td>Base</td>
<td>Allows to construct item hierarchy, modify it, and display it</td>
<td>26966</td>
<td>52</td>
</tr>
<tr>
<td>2</td>
<td>Item open state</td>
<td>Keeps track of collapsed/expanded item properties</td>
<td>3094</td>
<td>6</td>
</tr>
<tr>
<td>3</td>
<td>Item renaming</td>
<td>Allows to rename an item</td>
<td>3471</td>
<td>7</td>
</tr>
<tr>
<td>4</td>
<td>Item selection</td>
<td>Allows to get/set selected item</td>
<td>2338</td>
<td>5</td>
</tr>
<tr>
<td>5</td>
<td>Item value</td>
<td>Provides 2nd and the rest columns for items, used by Property browser</td>
<td>1307</td>
<td>3</td>
</tr>
<tr>
<td>6</td>
<td>Item value editing</td>
<td>Allows to edit item values with a default editor widget</td>
<td>1996</td>
<td>4</td>
</tr>
<tr>
<td>7</td>
<td>Item value editing with combobox</td>
<td>Provides combobox editor</td>
<td>5819</td>
<td>11</td>
</tr>
<tr>
<td>8</td>
<td>Item value editing with spinner</td>
<td>Provides spinbox editor</td>
<td>5290</td>
<td>10</td>
</tr>
<tr>
<td>9</td>
<td>Menu</td>
<td>Provides pop-up menu</td>
<td>1248</td>
<td>2</td>
</tr>
</table>

<p>Here's an example of UIQtTree Menu feature file: <a href="https://bitbucket.org/ogstudio-history/mjin/src/0c4cc3c3213f4687c0f3bd6a5426a6054cadd79b/f/TREE_MENU.cpp?at=Studio+0.10&amp;fileviewer=file-view-default">TREE_MENU</a>.</p>
<p><strong>Benefits of the approach</strong> include:</p>
<ol>
<li>Faster code reading/understanding due to small size</li>
<li>Easier and safer modification due to isolated code</li>
</ol>
<p>There's a drawback, too: new approach requires learning.</p>
<p>That's it for the most important technical details about development in August: UIQt module, its refactoring, a new feature based development approach, and its benefits.</p>
<p class="subheader">Category: <a href="http://opengamestudio.org/category/news.html">News</a>

</p>



</article>
</div>
<!-- End Main Content -->

<!-- Sidebar -->
<aside class="large-3 columns">
<!--k
<h5 class="sidebar-title">Site</h5>
<ul class="side-nav">
<li><a href="http://opengamestudio.org/archives.html">Archives</a>
<li><a href="http://opengamestudio.org/tags.html">Tags</a>


<li><a href="http://opengamestudio.org/feeds/all.atom.xml" rel="alternate">Atom feed</a></li>
</ul>

<h5 class="sidebar-title">Categories</h5>
<ul class="side-nav">
<li><a href="http://opengamestudio.org/category/news.html">News</a></li>
</ul>
-->


<h5 class="sidebar-title">Ads</h5>
<script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
<!-- ogs2 -->
<ins class="adsbygoogle"
style="display:block"
data-ad-client="ca-pub-4473792248813084"
data-ad-slot="9024247127"
data-ad-format="auto"></ins>
<script>
(adsbygoogle = window.adsbygoogle || []).push({});
</script>

</aside> <!-- End Sidebar -->

</div> <!-- End Main Content and Sidebar -->


<!-- Footer -->
<footer class="row">
<div class="large-12 columns">
<hr />
<div class="row">
<div class="large-7 columns">
<p>Proudly powered by <a href="http://getpelican.com">Pelican</a>, which takes great advantage of <a href="http://python.org">Python</a>.</p>
</div>
</div>
</div>
<script type="text/javascript">
var _gaq = _gaq || [];
_gaq.push(['_setAccount', 'UA-3773114-1']);
_gaq.push(['_trackPageview']);
(function() {
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
})();
</script>
</footer>

+ 4
- 0
archives.html 查看文件

@@ -125,6 +125,10 @@
<td>Сб 17 Сентябрь 2016</td>
<td><a href='september-live-session-announcement.html'>Live session: 25 September 2016</a></td>
</tr>
<tr>
<td>Сб 03 Сентябрь 2016</td>
<td><a href='2016-august-recap.html'>August 2016 recap</a></td>
</tr>
</tbody>
</table>



+ 20
- 0
author/opensource-game-studio2.html 查看文件

@@ -227,6 +227,26 @@ It's time to create simple Mahjong solitaire game.</p><p class="subheader">Categ
<hr class="gradient"/>
</article>



<article>
<a href="http://opengamestudio.org/2016-august-recap.html"><h3 class="article-title">August 2016 recap</h3></a>
<h6 class="subheader" title="2016-09-03T00:00:00+03:00">Сб 03 Сентябрь 2016
<a class="button secondary small translation-button" href="http://opengamestudio.org/2016-august-recap-ru.html">ru</a>

</h6><p><img alt="2016-august-recap" src="http://opengamestudio.org/2016-09-03_august-recap.png" /></p>
<p>This article explains the most important technical details about development in August: UIQt module, its refactoring, a new feature based development approach, and its benefits.</p>
<p><strong>UIQt module</strong> is a collection of UI components backed by Qt. We only use it for Editor UI at the moment.</p>
<p>Here is a list ...</p><p class="subheader">Category: <a href="http://opengamestudio.org/category/news.html">News</a>

</p>


<a class="button radius secondary small right" href="http://opengamestudio.org/2016-august-recap.html">Read More</a>
<hr class="gradient"/>
</article>

<!-- /#posts-list -->
<div class="pagination-centered">
<h6 class="subheader">Page 2 of 2</h6>


+ 20
- 0
category/news2.html 查看文件

@@ -227,6 +227,26 @@ It's time to create simple Mahjong solitaire game.</p><p class="subheader">Categ
<hr class="gradient"/>
</article>



<article>
<a href="http://opengamestudio.org/2016-august-recap.html"><h3 class="article-title">August 2016 recap</h3></a>
<h6 class="subheader" title="2016-09-03T00:00:00+03:00">Сб 03 Сентябрь 2016
<a class="button secondary small translation-button" href="http://opengamestudio.org/2016-august-recap-ru.html">ru</a>

</h6><p><img alt="2016-august-recap" src="http://opengamestudio.org/2016-09-03_august-recap.png" /></p>
<p>This article explains the most important technical details about development in August: UIQt module, its refactoring, a new feature based development approach, and its benefits.</p>
<p><strong>UIQt module</strong> is a collection of UI components backed by Qt. We only use it for Editor UI at the moment.</p>
<p>Here is a list ...</p><p class="subheader">Category: <a href="http://opengamestudio.org/category/news.html">News</a>

</p>


<a class="button radius secondary small right" href="http://opengamestudio.org/2016-august-recap.html">Read More</a>
<hr class="gradient"/>
</article>

<!-- /#posts-list -->
<div class="pagination-centered">
<h6 class="subheader">Page 2 of 2</h6>


+ 349
- 1
feeds/all.atom.xml 查看文件

@@ -822,4 +822,352 @@ We will publish live session materials later this week.&lt;/p&gt;
It's time to create simple Mahjong solitaire game.&lt;/p&gt;</summary></entry><entry><title>Прямой эфир: 25 сентября 2016</title><link href="http://opengamestudio.org/september-live-session-announcement-ru.html" rel="alternate"></link><updated>2016-09-17T00:00:00+03:00</updated><author><name>Opensource Game Studio</name></author><id>tag:opengamestudio.org,2016-09-17:september-live-session-announcement-ru.html</id><summary type="html">&lt;iframe width="560" height="315" src="https://www.youtube.com/embed/Y5hOGKcQ8wA" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;

&lt;p&gt;&lt;a href="http://www.timeanddate.com/worldclock/fixedtime.html?msg=%D0%9F%D1%80%D1%8F%D0%BC%D0%BE%D0%B9+%D1%8D%D1%84%D0%B8%D1%80+Open+Game+Studio%3A+%D0%A1%D0%B5%D0%BD%D1%82%D1%8F%D0%B1%D1%80%D1%8C+2016&amp;amp;iso=20160925T13&amp;amp;p1=166&amp;amp;ah=2"&gt;25 сентября 2016 в 13:00 MSK&lt;/a&gt; мы проведём &lt;a href="https://www.livecoding.tv/kornerr"&gt;прямой эфир&lt;/a&gt;.
Самое время создать простой пасьянс Маджонг&lt;/p&gt;</summary></entry></feed>
Самое время создать простой пасьянс Маджонг&lt;/p&gt;</summary></entry><entry><title>August 2016 recap</title><link href="http://opengamestudio.org/2016-august-recap.html" rel="alternate"></link><updated>2016-09-03T00:00:00+03:00</updated><author><name>Opensource Game Studio</name></author><id>tag:opengamestudio.org,2016-09-03:2016-august-recap.html</id><summary type="html">&lt;p&gt;&lt;img alt="2016-august-recap" src="http://opengamestudio.org/2016-09-03_august-recap.png" /&gt;&lt;/p&gt;
&lt;p&gt;This article explains the most important technical details about development in August: UIQt module, its refactoring, a new feature based development approach, and its benefits.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;UIQt module&lt;/strong&gt; is a collection of UI components backed by Qt. We only use it for Editor UI at the moment.&lt;/p&gt;
&lt;p&gt;Here is a list of UIQt module components with their description and current code size:&lt;table&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;№&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Component&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Description&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Size (B)&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Size (%)&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;UIQtAction&lt;/td&gt;
&lt;td&gt;Actions (events) for menus&lt;/td&gt;
&lt;td&gt;11224&lt;/td&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;UIQtAux&lt;/td&gt;
&lt;td&gt;Initializes Qt and main window. Provides widget resolution by name to other components&lt;/td&gt;
&lt;td&gt;15518&lt;/td&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;UIQtDock&lt;/td&gt;
&lt;td&gt;Widget docks&lt;/td&gt;
&lt;td&gt;5273&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;UIQtFileDialog&lt;/td&gt;
&lt;td&gt;File selection dialogs&lt;/td&gt;
&lt;td&gt;8960&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;UIQtMenu&lt;/td&gt;
&lt;td&gt;Menus for main window and pop-ups (like node's add/copy/paste/delete menu)&lt;/td&gt;
&lt;td&gt;4566&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;UIQtMenuBar&lt;/td&gt;
&lt;td&gt;Menu bar for main window&lt;/td&gt;
&lt;td&gt;4222&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;UIQtRunner&lt;/td&gt;
&lt;td&gt;Allows to start QApplication&lt;/td&gt;
&lt;td&gt;2450&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;UIQtThumbnailDialog&lt;/td&gt;
&lt;td&gt;Dialog with thumbnail images&lt;/td&gt;
&lt;td&gt;18615&lt;/td&gt;
&lt;td&gt;14&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;UIQtToolBar&lt;/td&gt;
&lt;td&gt;Tool bar for main window&lt;/td&gt;
&lt;td&gt;4276&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;UIQtTree&lt;/td&gt;
&lt;td&gt;Provides complex widgets like Scene tree and Property browser&lt;/td&gt;
&lt;td&gt;51216&lt;/td&gt;
&lt;td&gt;39&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;td&gt;UIQtWidget&lt;/td&gt;
&lt;td&gt;Common widget properties like focus and visibility&lt;/td&gt;
&lt;td&gt;5465&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;UIQt module refactoring&lt;/strong&gt; purpose was to replace old State API with new Environment API, which allows to achieve the same functionality with less code, i.e., makes development easier and faster.&lt;/p&gt;
&lt;p&gt;Refactoring started in July and should have been done the same month. However, we only finished the work in August. Initial plan assumed 28 hours would be enough, but we spent 65 instead. We estimated planned time by relying on the number of public API calls of each component. That worked fine for small components, because the number of their public API calls was roughly equal to the number of their features, and features themselves were very small. However, it totally failed for UIQtTree, which contains 39% of UIQt module code, because there was no direct connection between public API and features.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Feature based development approach&lt;/strong&gt; was born as a result of UIQtTree refactoring struggle. Since Qt uses MVC, UIQtTree component consists of several classes. By the time UIQtTree could display and manage a hierarchy of items, the component was already 27K in size. We noticed UIQtTree started to require abnormal amount of development time even for tiny features. This was an obvious &lt;a href="http://kornerr.blogspot.com/2012/04/complexity-conservation-law-complexity.html"&gt;quantitative complexity&lt;/a&gt; manifestation.&lt;/p&gt;
&lt;p&gt;We decided to separate UIQtTree into base part and additional ones. Base would only contain minimal code required by all features. Addition would contain specific feature code and could be safely modified. In the case of UIQtTree, item hierarchy display and modification is the minimal functionality, while item renaming is an addition.&lt;/p&gt;
&lt;p&gt;Here is a list of current UIQtTree features:&lt;/p&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;th&gt;**№**&lt;/th&gt;
&lt;th&gt;**Feature**&lt;/th&gt;
&lt;th&gt;**Description**&lt;/th&gt;
&lt;th&gt;**Size (B)**&lt;/th&gt;
&lt;th&gt;**Size (%)**&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Base&lt;/td&gt;
&lt;td&gt;Allows to construct item hierarchy, modify it, and display it&lt;/td&gt;
&lt;td&gt;26966&lt;/td&gt;
&lt;td&gt;52&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Item open state&lt;/td&gt;
&lt;td&gt;Keeps track of collapsed/expanded item properties&lt;/td&gt;
&lt;td&gt;3094&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Item renaming&lt;/td&gt;
&lt;td&gt;Allows to rename an item&lt;/td&gt;
&lt;td&gt;3471&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;Item selection&lt;/td&gt;
&lt;td&gt;Allows to get/set selected item&lt;/td&gt;
&lt;td&gt;2338&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;Item value&lt;/td&gt;
&lt;td&gt;Provides 2nd and the rest columns for items, used by Property browser&lt;/td&gt;
&lt;td&gt;1307&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;Item value editing&lt;/td&gt;
&lt;td&gt;Allows to edit item values with a default editor widget&lt;/td&gt;
&lt;td&gt;1996&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;Item value editing with combobox&lt;/td&gt;
&lt;td&gt;Provides combobox editor&lt;/td&gt;
&lt;td&gt;5819&lt;/td&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;Item value editing with spinner&lt;/td&gt;
&lt;td&gt;Provides spinbox editor&lt;/td&gt;
&lt;td&gt;5290&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;Menu&lt;/td&gt;
&lt;td&gt;Provides pop-up menu&lt;/td&gt;
&lt;td&gt;1248&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;

&lt;p&gt;Here's an example of UIQtTree Menu feature file: &lt;a href="https://bitbucket.org/ogstudio-history/mjin/src/0c4cc3c3213f4687c0f3bd6a5426a6054cadd79b/f/TREE_MENU.cpp?at=Studio+0.10&amp;amp;fileviewer=file-view-default"&gt;TREE_MENU&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Benefits of the approach&lt;/strong&gt; include:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Faster code reading/understanding due to small size&lt;/li&gt;
&lt;li&gt;Easier and safer modification due to isolated code&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;There's a drawback, too: new approach requires learning.&lt;/p&gt;
&lt;p&gt;That's it for the most important technical details about development in August: UIQt module, its refactoring, a new feature based development approach, and its benefits.&lt;/p&gt;</summary></entry><entry><title>Август 2016 кратко</title><link href="http://opengamestudio.org/2016-august-recap-ru.html" rel="alternate"></link><updated>2016-09-03T00:00:00+03:00</updated><author><name>Opensource Game Studio</name></author><id>tag:opengamestudio.org,2016-09-03:2016-august-recap-ru.html</id><summary type="html">&lt;p&gt;&lt;img alt="2016-august-recap" src="http://opengamestudio.org/2016-09-03_august-recap.png" /&gt;&lt;/p&gt;
&lt;p&gt;Эта статья описывает самые важные технические детали разработки за август: модуль UIQt, его переработку, новый подход к разработке на основе функционала и его преимущества.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Модуль UIQt&lt;/strong&gt; - это коллекция компонент UI на основе Qt. Сейчас используем лишь для интерфейса редактора.&lt;/p&gt;
&lt;p&gt;Список компонент модуля UIQt с описанием и размером кода:&lt;table&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;№&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Компонента&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Описание&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Размер (Б)&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Размер (%)&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;UIQtAction&lt;/td&gt;
&lt;td&gt;Действия (события) для меню&lt;/td&gt;
&lt;td&gt;11224&lt;/td&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;UIQtAux&lt;/td&gt;
&lt;td&gt;Инициализирует Qt и главное окно. Предоставляет поиск виджета по имени для других компонент&lt;/td&gt;
&lt;td&gt;15518&lt;/td&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;UIQtDock&lt;/td&gt;
&lt;td&gt;Виджет стыковки&lt;/td&gt;
&lt;td&gt;5273&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;UIQtFileDialog&lt;/td&gt;
&lt;td&gt;Диалог выбора файла&lt;/td&gt;
&lt;td&gt;8960&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;UIQtMenu&lt;/td&gt;
&lt;td&gt;Меню для главного окна и на ПКМ (вроде меню по добавлению/копированию/вставке/удалению узла)&lt;/td&gt;
&lt;td&gt;4566&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;UIQtMenuBar&lt;/td&gt;
&lt;td&gt;Панель меню для главного окна&lt;/td&gt;
&lt;td&gt;4222&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;UIQtRunner&lt;/td&gt;
&lt;td&gt;Позволяет запустить QApplication&lt;/td&gt;
&lt;td&gt;2450&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;UIQtThumbnailDialog&lt;/td&gt;
&lt;td&gt;Диалог с изображениями&lt;/td&gt;
&lt;td&gt;18615&lt;/td&gt;
&lt;td&gt;14&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;UIQtToolBar&lt;/td&gt;
&lt;td&gt;Панель инструментов для главого окна&lt;/td&gt;
&lt;td&gt;4276&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;UIQtTree&lt;/td&gt;
&lt;td&gt;Предоставляет сложные виджеты вроде Дерева сцены и Редактора свойств&lt;/td&gt;
&lt;td&gt;51216&lt;/td&gt;
&lt;td&gt;39&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;td&gt;UIQtWidget&lt;/td&gt;
&lt;td&gt;Общие свойства виджетов вроде фокуса и видимости&lt;/td&gt;
&lt;td&gt;5465&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Мы переработали модуль UIQt&lt;/strong&gt; для замены старого State API на новый Environment API, который позволяет делать то же самое лаконичнее, т.е. упрощает и ускоряет разработку.&lt;/p&gt;
&lt;p&gt;Переработку начали в июле и должны были закончить в том же месяце. Тем не менеe, работы завершили лишь в августе. Начальный план предполагал, что 28 часов должно хватить, но мы потратили 65. Мы оценивали необходимое время на основе количества вызовов публичного API каждой компоненты. Это хорошо сработало для небольших компонент, т.к. число вызовов их публичного API было примерно равно количеству их функционала, а сам функционал был очень маленький. Однако такой подход полностью провалился для компонеты UIQtTree, составляющей 39% кода модуля UIQt, потому что не было прямой связи между публичным API и функционалом.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Новый подход к разработке на основе функционала&lt;/strong&gt; родился после решения проблем с переработкой UIQtTree. Т.к. Qt использует MVC, компонента UIQtTree состоит из нескольких классов. К тому моменту, когда UIQtTree могла отображать и управлять иерархией элементов, компонента уже имела размер в 27К. Мы заметили, что UIQtTree стала потреблять непомерное количество времени разработки даже для мелкого функционала. Это было явным проявлением &lt;a href="http://rsdn.org/article/philosophy/Complexity.xml"&gt;количественной сложности&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Мы решили разбить UIQtTree на базовую часть и дополнительные. База содержит лишь необходимый минимум кода. Дополнение содержит код, специфичный для данного функционала, и может быть безболезненно изменено. В случае UIQtTree, отображение и управление иерархией элементов - это минимальный функционал, а переименование элементов - это дополнение.&lt;/p&gt;
&lt;p&gt;Текущий функционал UIQtTree состоит из следующих возможностей:&lt;/p&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;th&gt;**№**&lt;/th&gt;
&lt;th&gt;**Функционал**&lt;/th&gt;
&lt;th&gt;**Описание**&lt;/th&gt;
&lt;th&gt;**Размер (Б)**&lt;/th&gt;
&lt;th&gt;**Размер (%)**&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Base&lt;/td&gt;
&lt;td&gt;Создание, изменение, отображение иерархии элементов&lt;/td&gt;
&lt;td&gt;26966&lt;/td&gt;
&lt;td&gt;52&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Item open state&lt;/td&gt;
&lt;td&gt;Хранит состояние свойства скрыто/отображено элемента&lt;/td&gt;
&lt;td&gt;3094&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Item renaming&lt;/td&gt;
&lt;td&gt;Переименование элемента&lt;/td&gt;
&lt;td&gt;3471&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;Item selection&lt;/td&gt;
&lt;td&gt;Получение/установка выбранного элемента&lt;/td&gt;
&lt;td&gt;2338&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;Item value&lt;/td&gt;
&lt;td&gt;Предоставляет второй и последующие столбцы для элементов, используется Редактором свойств&lt;/td&gt;
&lt;td&gt;1307&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;Item value editing&lt;/td&gt;
&lt;td&gt;Редактирование значений элемента с помощью стандартного виджета&lt;/td&gt;
&lt;td&gt;1996&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;Item value editing with combobox&lt;/td&gt;
&lt;td&gt;Редактирование значений элемента с помощью виджета combobox&lt;/td&gt;
&lt;td&gt;5819&lt;/td&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;Item value editing with spinner&lt;/td&gt;
&lt;td&gt;Редактирование значений элемента с помощью виджета spinbox&lt;/td&gt;
&lt;td&gt;5290&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;Menu&lt;/td&gt;
&lt;td&gt;Меню на ПКМ&lt;/td&gt;
&lt;td&gt;1248&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;

&lt;p&gt;Пример файла функционала Menu для UIQtTree: &lt;a href="https://bitbucket.org/ogstudio-history/mjin/src/0c4cc3c3213f4687c0f3bd6a5426a6054cadd79b/f/TREE_MENU.cpp?at=Studio+0.10&amp;amp;fileviewer=file-view-default"&gt;TREE_MENU&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Преимущества подхода:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Более быстрое чтение/понимание благодаря небольшому размеру&lt;/li&gt;
&lt;li&gt;Более простое и безболезненное изменение благодаря изолированному коду&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Есть и недостаток: новый подход требует изучения.&lt;/p&gt;
&lt;p&gt;На этом мы заканчиваем описание самых важных технических деталей разработки за август: модуль UIQt, его переработку, новый подход к разработке на основе функционала и его преимущества.&lt;/p&gt;</summary></entry></feed>

+ 175
- 1
feeds/news.atom.xml 查看文件

@@ -411,4 +411,178 @@ We will publish live session materials later this week.&lt;/p&gt;
&lt;p&gt;Get ready for &lt;a href="https://www.livecoding.tv/kornerr"&gt;live session&lt;/a&gt;, it's about to happen in 24 hours!&lt;/p&gt;</summary></entry><entry><title>Live session: 25 September 2016</title><link href="http://opengamestudio.org/september-live-session-announcement.html" rel="alternate"></link><updated>2016-09-17T00:00:00+03:00</updated><author><name>Opensource Game Studio</name></author><id>tag:opengamestudio.org,2016-09-17:september-live-session-announcement.html</id><summary type="html">&lt;iframe width="560" height="315" src="https://www.youtube.com/embed/Y5hOGKcQ8wA" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;

&lt;p&gt;We will hold &lt;a href="https://www.livecoding.tv/kornerr"&gt;live session&lt;/a&gt; on &lt;a href="http://www.timeanddate.com/worldclock/fixedtime.html?msg=Open+Game+Studio+September+2016+live+session&amp;amp;iso=20160925T12&amp;amp;p1=37&amp;amp;ah=2"&gt;25 September 2016 at 12:00 CEST&lt;/a&gt;
It's time to create simple Mahjong solitaire game.&lt;/p&gt;</summary></entry></feed>
It's time to create simple Mahjong solitaire game.&lt;/p&gt;</summary></entry><entry><title>August 2016 recap</title><link href="http://opengamestudio.org/2016-august-recap.html" rel="alternate"></link><updated>2016-09-03T00:00:00+03:00</updated><author><name>Opensource Game Studio</name></author><id>tag:opengamestudio.org,2016-09-03:2016-august-recap.html</id><summary type="html">&lt;p&gt;&lt;img alt="2016-august-recap" src="http://opengamestudio.org/2016-09-03_august-recap.png" /&gt;&lt;/p&gt;
&lt;p&gt;This article explains the most important technical details about development in August: UIQt module, its refactoring, a new feature based development approach, and its benefits.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;UIQt module&lt;/strong&gt; is a collection of UI components backed by Qt. We only use it for Editor UI at the moment.&lt;/p&gt;
&lt;p&gt;Here is a list of UIQt module components with their description and current code size:&lt;table&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;№&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Component&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Description&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Size (B)&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Size (%)&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;UIQtAction&lt;/td&gt;
&lt;td&gt;Actions (events) for menus&lt;/td&gt;
&lt;td&gt;11224&lt;/td&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;UIQtAux&lt;/td&gt;
&lt;td&gt;Initializes Qt and main window. Provides widget resolution by name to other components&lt;/td&gt;
&lt;td&gt;15518&lt;/td&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;UIQtDock&lt;/td&gt;
&lt;td&gt;Widget docks&lt;/td&gt;
&lt;td&gt;5273&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;UIQtFileDialog&lt;/td&gt;
&lt;td&gt;File selection dialogs&lt;/td&gt;
&lt;td&gt;8960&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;UIQtMenu&lt;/td&gt;
&lt;td&gt;Menus for main window and pop-ups (like node's add/copy/paste/delete menu)&lt;/td&gt;
&lt;td&gt;4566&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;UIQtMenuBar&lt;/td&gt;
&lt;td&gt;Menu bar for main window&lt;/td&gt;
&lt;td&gt;4222&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;UIQtRunner&lt;/td&gt;
&lt;td&gt;Allows to start QApplication&lt;/td&gt;
&lt;td&gt;2450&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;UIQtThumbnailDialog&lt;/td&gt;
&lt;td&gt;Dialog with thumbnail images&lt;/td&gt;
&lt;td&gt;18615&lt;/td&gt;
&lt;td&gt;14&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;UIQtToolBar&lt;/td&gt;
&lt;td&gt;Tool bar for main window&lt;/td&gt;
&lt;td&gt;4276&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;UIQtTree&lt;/td&gt;
&lt;td&gt;Provides complex widgets like Scene tree and Property browser&lt;/td&gt;
&lt;td&gt;51216&lt;/td&gt;
&lt;td&gt;39&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;td&gt;UIQtWidget&lt;/td&gt;
&lt;td&gt;Common widget properties like focus and visibility&lt;/td&gt;
&lt;td&gt;5465&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;UIQt module refactoring&lt;/strong&gt; purpose was to replace old State API with new Environment API, which allows to achieve the same functionality with less code, i.e., makes development easier and faster.&lt;/p&gt;
&lt;p&gt;Refactoring started in July and should have been done the same month. However, we only finished the work in August. Initial plan assumed 28 hours would be enough, but we spent 65 instead. We estimated planned time by relying on the number of public API calls of each component. That worked fine for small components, because the number of their public API calls was roughly equal to the number of their features, and features themselves were very small. However, it totally failed for UIQtTree, which contains 39% of UIQt module code, because there was no direct connection between public API and features.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Feature based development approach&lt;/strong&gt; was born as a result of UIQtTree refactoring struggle. Since Qt uses MVC, UIQtTree component consists of several classes. By the time UIQtTree could display and manage a hierarchy of items, the component was already 27K in size. We noticed UIQtTree started to require abnormal amount of development time even for tiny features. This was an obvious &lt;a href="http://kornerr.blogspot.com/2012/04/complexity-conservation-law-complexity.html"&gt;quantitative complexity&lt;/a&gt; manifestation.&lt;/p&gt;
&lt;p&gt;We decided to separate UIQtTree into base part and additional ones. Base would only contain minimal code required by all features. Addition would contain specific feature code and could be safely modified. In the case of UIQtTree, item hierarchy display and modification is the minimal functionality, while item renaming is an addition.&lt;/p&gt;
&lt;p&gt;Here is a list of current UIQtTree features:&lt;/p&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;th&gt;**№**&lt;/th&gt;
&lt;th&gt;**Feature**&lt;/th&gt;
&lt;th&gt;**Description**&lt;/th&gt;
&lt;th&gt;**Size (B)**&lt;/th&gt;
&lt;th&gt;**Size (%)**&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Base&lt;/td&gt;
&lt;td&gt;Allows to construct item hierarchy, modify it, and display it&lt;/td&gt;
&lt;td&gt;26966&lt;/td&gt;
&lt;td&gt;52&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Item open state&lt;/td&gt;
&lt;td&gt;Keeps track of collapsed/expanded item properties&lt;/td&gt;
&lt;td&gt;3094&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Item renaming&lt;/td&gt;
&lt;td&gt;Allows to rename an item&lt;/td&gt;
&lt;td&gt;3471&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;Item selection&lt;/td&gt;
&lt;td&gt;Allows to get/set selected item&lt;/td&gt;
&lt;td&gt;2338&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;Item value&lt;/td&gt;
&lt;td&gt;Provides 2nd and the rest columns for items, used by Property browser&lt;/td&gt;
&lt;td&gt;1307&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;Item value editing&lt;/td&gt;
&lt;td&gt;Allows to edit item values with a default editor widget&lt;/td&gt;
&lt;td&gt;1996&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;Item value editing with combobox&lt;/td&gt;
&lt;td&gt;Provides combobox editor&lt;/td&gt;
&lt;td&gt;5819&lt;/td&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;Item value editing with spinner&lt;/td&gt;
&lt;td&gt;Provides spinbox editor&lt;/td&gt;
&lt;td&gt;5290&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;Menu&lt;/td&gt;
&lt;td&gt;Provides pop-up menu&lt;/td&gt;
&lt;td&gt;1248&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;

&lt;p&gt;Here's an example of UIQtTree Menu feature file: &lt;a href="https://bitbucket.org/ogstudio-history/mjin/src/0c4cc3c3213f4687c0f3bd6a5426a6054cadd79b/f/TREE_MENU.cpp?at=Studio+0.10&amp;amp;fileviewer=file-view-default"&gt;TREE_MENU&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Benefits of the approach&lt;/strong&gt; include:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Faster code reading/understanding due to small size&lt;/li&gt;
&lt;li&gt;Easier and safer modification due to isolated code&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;There's a drawback, too: new approach requires learning.&lt;/p&gt;
&lt;p&gt;That's it for the most important technical details about development in August: UIQt module, its refactoring, a new feature based development approach, and its benefits.&lt;/p&gt;</summary></entry></feed>

+ 20
- 0
index2.html 查看文件

@@ -227,6 +227,26 @@ It's time to create simple Mahjong solitaire game.</p><p class="subheader">Categ
<hr class="gradient"/>
</article>



<article>
<a href="http://opengamestudio.org/2016-august-recap.html"><h3 class="article-title">August 2016 recap</h3></a>
<h6 class="subheader" title="2016-09-03T00:00:00+03:00">Сб 03 Сентябрь 2016
<a class="button secondary small translation-button" href="http://opengamestudio.org/2016-august-recap-ru.html">ru</a>

</h6><p><img alt="2016-august-recap" src="http://opengamestudio.org/2016-09-03_august-recap.png" /></p>
<p>This article explains the most important technical details about development in August: UIQt module, its refactoring, a new feature based development approach, and its benefits.</p>
<p><strong>UIQt module</strong> is a collection of UI components backed by Qt. We only use it for Editor UI at the moment.</p>
<p>Here is a list ...</p><p class="subheader">Category: <a href="http://opengamestudio.org/category/news.html">News</a>

</p>


<a class="button radius secondary small right" href="http://opengamestudio.org/2016-august-recap.html">Read More</a>
<hr class="gradient"/>
</article>

<!-- /#posts-list -->
<div class="pagination-centered">
<h6 class="subheader">Page 2 of 2</h6>


+ 197
- 0
pelican/content/articles/2016-09-03_2016-august-recap-ru.md 查看文件

@@ -0,0 +1,197 @@
Title: Август 2016 кратко
Date: 2016-09-03 00:00
Category: News
Slug: 2016-august-recap
Lang: ru

![2016-august-recap][screenshot]


Эта статья описывает самые важные технические детали разработки за август: модуль UIQt, его переработку, новый подход к разработке на основе функционала и его преимущества.

**Модуль UIQt** - это коллекция компонент UI на основе Qt. Сейчас используем лишь для интерфейса редактора.

Список компонент модуля UIQt с описанием и размером кода:<table>
<tr>
<th>**№**</th>
<th>**Компонента**</th>
<th>**Описание**</th>
<th>**Размер (Б)**</th>
<th>**Размер (%)**</th>
</tr>
<tr>
<td>1</td>
<td>UIQtAction</td>
<td>Действия (события) для меню</td>
<td>11224</td>
<td>9</td>
</tr>
<tr>
<td>2</td>
<td>UIQtAux</td>
<td>Инициализирует Qt и главное окно. Предоставляет поиск виджета по имени для других компонент</td>
<td>15518</td>
<td>12</td>
</tr>
<tr>
<td>3</td>
<td>UIQtDock</td>
<td>Виджет стыковки</td>
<td>5273</td>
<td>4</td>
</tr>
<tr>
<td>4</td>
<td>UIQtFileDialog</td>
<td>Диалог выбора файла</td>
<td>8960</td>
<td>7</td>
</tr>
<tr>
<td>5</td>
<td>UIQtMenu</td>
<td>Меню для главного окна и на ПКМ (вроде меню по добавлению/копированию/вставке/удалению узла)</td>
<td>4566</td>
<td>3</td>
</tr>
<tr>
<td>6</td>
<td>UIQtMenuBar</td>
<td>Панель меню для главного окна</td>
<td>4222</td>
<td>3</td>
</tr>
<tr>
<td>7</td>
<td>UIQtRunner</td>
<td>Позволяет запустить QApplication</td>
<td>2450</td>
<td>2</td>
</tr>
<tr>
<td>8</td>
<td>UIQtThumbnailDialog</td>
<td>Диалог с изображениями</td>
<td>18615</td>
<td>14</td>
</tr>
<tr>
<td>9</td>
<td>UIQtToolBar</td>
<td>Панель инструментов для главого окна</td>
<td>4276</td>
<td>3</td>
</tr>
<tr>
<td>10</td>
<td>UIQtTree</td>
<td>Предоставляет сложные виджеты вроде Дерева сцены и Редактора свойств</td>
<td>51216</td>
<td>39</td>
</tr>
<tr>
<td>11</td>
<td>UIQtWidget</td>
<td>Общие свойства виджетов вроде фокуса и видимости</td>
<td>5465</td>
<td>4</td>
</tr>
</table>

**Мы переработали модуль UIQt** для замены старого State API на новый Environment API, который позволяет делать то же самое лаконичнее, т.е. упрощает и ускоряет разработку.

Переработку начали в июле и должны были закончить в том же месяце. Тем не менеe, работы завершили лишь в августе. Начальный план предполагал, что 28 часов должно хватить, но мы потратили 65. Мы оценивали необходимое время на основе количества вызовов публичного API каждой компоненты. Это хорошо сработало для небольших компонент, т.к. число вызовов их публичного API было примерно равно количеству их функционала, а сам функционал был очень маленький. Однако такой подход полностью провалился для компонеты UIQtTree, составляющей 39% кода модуля UIQt, потому что не было прямой связи между публичным API и функционалом.

**Новый подход к разработке на основе функционала** родился после решения проблем с переработкой UIQtTree. Т.к. Qt использует MVC, компонента UIQtTree состоит из нескольких классов. К тому моменту, когда UIQtTree могла отображать и управлять иерархией элементов, компонента уже имела размер в 27К. Мы заметили, что UIQtTree стала потреблять непомерное количество времени разработки даже для мелкого функционала. Это было явным проявлением [количественной сложности](http://rsdn.org/article/philosophy/Complexity.xml).

Мы решили разбить UIQtTree на базовую часть и дополнительные. База содержит лишь необходимый минимум кода. Дополнение содержит код, специфичный для данного функционала, и может быть безболезненно изменено. В случае UIQtTree, отображение и управление иерархией элементов - это минимальный функционал, а переименование элементов - это дополнение.

Текущий функционал UIQtTree состоит из следующих возможностей:

<table>
<tr>
<th>**№**</th>
<th>**Функционал**</th>
<th>**Описание**</th>
<th>**Размер (Б)**</th>
<th>**Размер (%)**</th>
</tr>
<tr>
<td>1</td>
<td>Base</td>
<td>Создание, изменение, отображение иерархии элементов</td>
<td>26966</td>
<td>52</td>
</tr>
<tr>
<td>2</td>
<td>Item open state</td>
<td>Хранит состояние свойства скрыто/отображено элемента</td>
<td>3094</td>
<td>6</td>
</tr>
<tr>
<td>3</td>
<td>Item renaming</td>
<td>Переименование элемента</td>
<td>3471</td>
<td>7</td>
</tr>
<tr>
<td>4</td>
<td>Item selection</td>
<td>Получение/установка выбранного элемента</td>
<td>2338</td>
<td>5</td>
</tr>
<tr>
<td>5</td>
<td>Item value</td>
<td>Предоставляет второй и последующие столбцы для элементов, используется Редактором свойств</td>
<td>1307</td>
<td>3</td>
</tr>
<tr>
<td>6</td>
<td>Item value editing</td>
<td>Редактирование значений элемента с помощью стандартного виджета</td>
<td>1996</td>
<td>4</td>
</tr>
<tr>
<td>7</td>
<td>Item value editing with combobox</td>
<td>Редактирование значений элемента с помощью виджета combobox</td>
<td>5819</td>
<td>11</td>
</tr>
<tr>
<td>8</td>
<td>Item value editing with spinner</td>
<td>Редактирование значений элемента с помощью виджета spinbox</td>
<td>5290</td>
<td>10</td>
</tr>
<tr>
<td>9</td>
<td>Menu</td>
<td>Меню на ПКМ</td>
<td>1248</td>
<td>2</td>
</tr>
</table>

Пример файла функционала Menu для UIQtTree: [TREE_MENU](https://bitbucket.org/ogstudio-history/mjin/src/0c4cc3c3213f4687c0f3bd6a5426a6054cadd79b/f/TREE_MENU.cpp?at=Studio+0.10&fileviewer=file-view-default).

**Преимущества подхода:**

0. Более быстрое чтение/понимание благодаря небольшому размеру
0. Более простое и безболезненное изменение благодаря изолированному коду



Есть и недостаток: новый подход требует изучения.

На этом мы заканчиваем описание самых важных технических деталей разработки за август: модуль UIQt, его переработку, новый подход к разработке на основе функционала и его преимущества.

[screenshot]: {attach}/images/2016-09-03_august-recap.png

+ 196
- 0
pelican/content/articles/2016-09-03_2016-august-recap.md 查看文件

@@ -0,0 +1,196 @@
Title: August 2016 recap
Date: 2016-09-03 00:00
Category: News
Slug: 2016-august-recap
Lang: en

![2016-august-recap][screenshot]


This article explains the most important technical details about development in August: UIQt module, its refactoring, a new feature based development approach, and its benefits.

**UIQt module** is a collection of UI components backed by Qt. We only use it for Editor UI at the moment.

Here is a list of UIQt module components with their description and current code size:<table>
<tr>
<th>**№**</th>
<th>**Component**</th>
<th>**Description**</th>
<th>**Size (B)**</th>
<th>**Size (%)**</th>
</tr>
<tr>
<td>1</td>
<td>UIQtAction</td>
<td>Actions (events) for menus</td>
<td>11224</td>
<td>9</td>
</tr>
<tr>
<td>2</td>
<td>UIQtAux</td>
<td>Initializes Qt and main window. Provides widget resolution by name to other components</td>
<td>15518</td>
<td>12</td>
</tr>
<tr>
<td>3</td>
<td>UIQtDock</td>
<td>Widget docks</td>
<td>5273</td>
<td>4</td>
</tr>
<tr>
<td>4</td>
<td>UIQtFileDialog</td>
<td>File selection dialogs</td>
<td>8960</td>
<td>7</td>
</tr>
<tr>
<td>5</td>
<td>UIQtMenu</td>
<td>Menus for main window and pop-ups (like node's add/copy/paste/delete menu)</td>
<td>4566</td>
<td>3</td>
</tr>
<tr>
<td>6</td>
<td>UIQtMenuBar</td>
<td>Menu bar for main window</td>
<td>4222</td>
<td>3</td>
</tr>
<tr>
<td>7</td>
<td>UIQtRunner</td>
<td>Allows to start QApplication</td>
<td>2450</td>
<td>2</td>
</tr>
<tr>
<td>8</td>
<td>UIQtThumbnailDialog</td>
<td>Dialog with thumbnail images</td>
<td>18615</td>
<td>14</td>
</tr>
<tr>
<td>9</td>
<td>UIQtToolBar</td>
<td>Tool bar for main window</td>
<td>4276</td>
<td>3</td>
</tr>
<tr>
<td>10</td>
<td>UIQtTree</td>
<td>Provides complex widgets like Scene tree and Property browser</td>
<td>51216</td>
<td>39</td>
</tr>
<tr>
<td>11</td>
<td>UIQtWidget</td>
<td>Common widget properties like focus and visibility</td>
<td>5465</td>
<td>4</td>
</tr>
</table>

**UIQt module refactoring** purpose was to replace old State API with new Environment API, which allows to achieve the same functionality with less code, i.e., makes development easier and faster.

Refactoring started in July and should have been done the same month. However, we only finished the work in August. Initial plan assumed 28 hours would be enough, but we spent 65 instead. We estimated planned time by relying on the number of public API calls of each component. That worked fine for small components, because the number of their public API calls was roughly equal to the number of their features, and features themselves were very small. However, it totally failed for UIQtTree, which contains 39% of UIQt module code, because there was no direct connection between public API and features.

**Feature based development approach** was born as a result of UIQtTree refactoring struggle. Since Qt uses MVC, UIQtTree component consists of several classes. By the time UIQtTree could display and manage a hierarchy of items, the component was already 27K in size. We noticed UIQtTree started to require abnormal amount of development time even for tiny features. This was an obvious [quantitative complexity](http://kornerr.blogspot.com/2012/04/complexity-conservation-law-complexity.html) manifestation.

We decided to separate UIQtTree into base part and additional ones. Base would only contain minimal code required by all features. Addition would contain specific feature code and could be safely modified. In the case of UIQtTree, item hierarchy display and modification is the minimal functionality, while item renaming is an addition.

Here is a list of current UIQtTree features:

<table>
<tr>
<th>**№**</th>
<th>**Feature**</th>
<th>**Description**</th>
<th>**Size (B)**</th>
<th>**Size (%)**</th>
</tr>
<tr>
<td>1</td>
<td>Base</td>
<td>Allows to construct item hierarchy, modify it, and display it</td>
<td>26966</td>
<td>52</td>
</tr>
<tr>
<td>2</td>
<td>Item open state</td>
<td>Keeps track of collapsed/expanded item properties</td>
<td>3094</td>
<td>6</td>
</tr>
<tr>
<td>3</td>
<td>Item renaming</td>
<td>Allows to rename an item</td>
<td>3471</td>
<td>7</td>
</tr>
<tr>
<td>4</td>
<td>Item selection</td>
<td>Allows to get/set selected item</td>
<td>2338</td>
<td>5</td>
</tr>
<tr>
<td>5</td>
<td>Item value</td>
<td>Provides 2nd and the rest columns for items, used by Property browser</td>
<td>1307</td>
<td>3</td>
</tr>
<tr>
<td>6</td>
<td>Item value editing</td>
<td>Allows to edit item values with a default editor widget</td>
<td>1996</td>
<td>4</td>
</tr>
<tr>
<td>7</td>
<td>Item value editing with combobox</td>
<td>Provides combobox editor</td>
<td>5819</td>
<td>11</td>
</tr>
<tr>
<td>8</td>
<td>Item value editing with spinner</td>
<td>Provides spinbox editor</td>
<td>5290</td>
<td>10</td>
</tr>
<tr>
<td>9</td>
<td>Menu</td>
<td>Provides pop-up menu</td>
<td>1248</td>
<td>2</td>
</tr>
</table>

Here's an example of UIQtTree Menu feature file: [TREE_MENU](https://bitbucket.org/ogstudio-history/mjin/src/0c4cc3c3213f4687c0f3bd6a5426a6054cadd79b/f/TREE_MENU.cpp?at=Studio+0.10&fileviewer=file-view-default).

**Benefits of the approach** include:

0. Faster code reading/understanding due to small size
0. Easier and safer modification due to isolated code


There's a drawback, too: new approach requires learning.

That's it for the most important technical details about development in August: UIQt module, its refactoring, a new feature based development approach, and its benefits.

[screenshot]: {attach}/images/2016-09-03_august-recap.png

二進制
pelican/content/images/2016-09-03_august-recap.png 查看文件

Before After
Width: 1025  |  Height: 588  |  Size: 172KB

Loading…
取消
儲存