tag:blogger.com,1999:blog-46782765065331500232024-03-14T06:31:45.770+03:00Life in the codeСвятослав Панкратовhttp://www.blogger.com/profile/13039405381364404095noreply@blogger.comBlogger20125tag:blogger.com,1999:blog-4678276506533150023.post-73660344155324390922014-02-22T11:55:00.000+04:002014-02-22T12:00:03.127+04:00Проблемы при запуске приложения после добавления Entity Framework 6.0.x через NuGet<div dir="ltr" style="text-align: left;" trbidi="on">
И снова очередная проблема с <b>Entity Framework 6.0.x</b> после добавления его в проект через <b>NuGet</b>.<br />
<br />
После запуска приложения, при первом обращении к данным, вылетает исключение следующего содержиния:<br />
<br />
<hr />
The Entity Framework provider type 'System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer' registered in the application config file for the ADO.NET provider with invariant name 'System.Data.SqlClient' could not be loaded. Make sure that the assembly-qualified name is used and that the assembly is available to the running application. See http://go.microsoft.com/fwlink/?LinkId=260882 for more information.<br />
<hr />
<br />
<a name='more'></a>Что говорит о том, что сборка <b>EntityFramework.SqlServer</b> не попадает в директорию сборки проекта. А ошибок при анализе кода Visual Studio не выдает, скорее всего, из-за того что <b>Entity Framework</b> использует позднее связывание с этой сборкой. Поэтому жестких ссылок на нее в коде E<b>ntity Framework</b> не содержит. А подцепляется она в момент обращения к данным. В результате чего и генерируется исключение, что не удалось найти требуемую сборку.<br />
<br />
Погуглив, понял, что проблема уже изъезженная. Например, <a href="http://robsneuron.blogspot.ru/2013/11/entity-framework-upgrade-to-6.html" target="_blank">тут</a>, Rob Lang привел возможные варианты решения возникшей проблемы. Например:<br />
<br />
<ol style="text-align: left;"><ol>
<li>Указать Visual Studio явно ложить эту сборку в выходную директорию проекта, куда он билдится.</li>
<li>Добавить в конструткор контекста данных Entity Framework строчку кода, где создавать пустую переменную со ссылкой на объект класса из этой сборки. И при сборке проекта, Visual Studio увидит эту зависимость и положить в выходную директорию нужную нам сборку.</li>
</ol>
</ol>
<div>
Второй вариант более предпочтительный, т.к. отказавшить от Entity Framework мы автоматом не будем получать в выходной директории проекта уже не нужную нам сборку. Поэтому, если погуглить, то большинство решений сводится к этому варианту.</div>
<div>
<br /></div>
<div>
Для фикса этой баги, я добавил статичный класс, в котором добавил метод, инициирующий переменную со ссылкой на объект типа из сборки <b>EntityFramework.SqlServer</b>. </div>
<pre style="background: #1e1e1e; color: gainsboro; font-family: Consolas; font-size: 13;"><span style="color: #569cd6;">public</span> <span style="color: #569cd6;">static</span> <span style="color: #569cd6;">class</span> <span style="color: #4ec9b0;">EF_FIX</span>
{
<span style="color: #569cd6;">public</span> <span style="color: #569cd6;">static</span> <span style="color: #569cd6;">void</span> <span style="color: white;">FixEfProviderServicesProblem</span>()
{
<span style="color: #608b4e;">//The Entity Framework provider type 'System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer'</span>
<span style="color: #608b4e;">//for the 'System.Data.SqlClient' ADO.NET provider could not be loaded. </span>
<span style="color: #608b4e;">//Make sure the provider assembly is available to the running application. </span>
<span style="color: #608b4e;">//See http://go.microsoft.com/fwlink/?LinkId=260882 for more information.</span>
<span style="color: #569cd6;">var</span> <span style="color: white;">instance</span> <span style="color: #b4b4b4;">=</span> <span style="color: white;">System</span><span style="color: #b4b4b4;">.</span><span style="color: white;">Data</span><span style="color: #b4b4b4;">.</span><span style="color: white;">Entity</span><span style="color: #b4b4b4;">.</span><span style="color: white;">SqlServer</span><span style="color: #b4b4b4;">.</span><span style="color: #4ec9b0;">SqlProviderServices</span><span style="color: #b4b4b4;">.</span><span style="color: white;">Instance</span>;
}
}</pre>
Дальше, нам необходимо прописать вызов этого метода в конструкторе контекста данных <b>Entity Framework</b>:<br />
<pre style="background: #1e1e1e; color: gainsboro; font-family: Consolas; font-size: 13;"><span style="color: #569cd6;">public</span> <span style="color: #569cd6;">partial</span> <span style="color: #569cd6;">class</span> <span style="color: #4ec9b0;">DB</span> : <span style="color: #4ec9b0;">DbContext</span>
{
<span style="color: #569cd6;">public</span> <span style="color: white;">DB</span>() : <span style="color: #569cd6;">base</span>(<span style="color: #d69d85;">"name=DB"</span>)
{
<span style="color: #4ec9b0;">EF_FIX</span><span style="color: #b4b4b4;">.</span><span style="color: white;">FixEfProviderServicesProblem</span>();
}</pre>
Но тут получаем еще одну не очень приятную вещь. После каждого обновления модели <b>Entity Framework</b> класс контекста данных будет обновляться и наша строчка кода будет пропадать. И нам ее надо будет в таких ситуациях не забывать каждый раз прописывать заново, что не удобно.<br />
<br />
В своей предыдущей статье <a href="http://svyatoslavpankratov.blogspot.ru/2014/02/entity-framework-60x.html#more" style="font-weight: bold;" target="_blank">Entity Framework 6.0.x и INotifyPropertyChanged</a> я описал как можно править код скриптов, генерирующих код модели и контекста данных. Сейчас нам как раз надо модифицировать файл <b>*.Content.tt</b>, в котором содержится код описывающий алогритм генерации контекста данных.<br />
<br />
Находим в нем следующие строчки и добавляем туда нужную нам строчку кода:<br />
<pre style="background-color: #1e1e1e; color: gainsboro; font-family: Consolas; font-size: 13px;"><span style="color: #4ec9b0;">EF_FIX</span><span style="color: #b4b4b4;">.</span><span style="color: white;">FixEfProviderServicesProblem</span>();</pre>
Получаем следующее:<br />
<pre style="background: #1e1e1e; color: gainsboro; font-family: Consolas; font-size: 13;"><#=Accessibility.ForType(container)#> partial class <#=code.Escape(container)#> : DbContext
{
public <#=code.Escape(container)#>()
: base("name=<#=container.Name#>")
{
EF_FIX.FixEfProviderServicesProblem();
<#
if (!loader.IsLazyLoadingEnabled(container))
{
#>
this.Configuration.LazyLoadingEnabled = false;
<#
}
</pre>
После сохранения код контекста данных обновится и в нем тоже появится наш заветный фикс бага.<br />
<br />
Теперь после любых изменений в модели данных, контекст данных будет всегода генерироваться нужным нам образом. Собственно, то что нам и надо.</div>
Святослав Панкратовhttp://www.blogger.com/profile/13039405381364404095noreply@blogger.com0Severodvinsk, Arkhangelsk Oblast, Russia64.5666667 39.81666670000004264.4575667 39.493943200000039 64.6757667 40.139390200000044tag:blogger.com,1999:blog-4678276506533150023.post-37597894744137990032014-02-21T10:45:00.000+04:002014-03-05T09:25:08.998+04:00Entity Framework 6.0.x и INotifyPropertyChanged<div dir="ltr" style="text-align: left;" trbidi="on">
При разработке очередного приложения с использованием WPF и <b>Entity Framework 6.0.2</b> наткнулся на проблему привязки данных. При связывании данных представления с моделью представления, в которой находится заполненная модель таблицы, не происходит обновление представления при изменении данных в привязанной модели таблицы.<br />
<br />
<a name='more'></a><div>
Причина стала понятна, когда я открыл код связываемой с представлением модели таблицы. Там не было реализации интерфейса <b>INotifyPropertyChanged</b>.</div>
<div>
<br /></div>
<div>
На моем последнем проекте из мира Silverlight / WPF, где я принимал участие, в качестве ORM использовался LINQ to SQL. Там, при генерации модели, генератором реализовывался интерфейс <b>INotifyPropertyChanged</b>. И при связывании данных, если к представлению напрямую привязывались поля из модели таблицы, проблем не возникало.<br />
<div>
<br /></div>
<div>
На еще одном другом моем проекте используется до сих пор <b>Entity Framework 5.x</b>. Дак вот там этот интерфейс тоже реализуется. Но там к модели не добавляется файл со скриптом шаблона по которому происходит генерация моделей таблиц, а в 6.0.x версии добавляется.</div>
</div>
<div>
<br /></div>
<div>
Почему Microsoft сделала такую подлянку, точно известно только им. Ну а мне надо искать пути решения возникшей ситуации.</div>
<div>
<br /></div>
<div>
Погуглив какое-то время, я пришел к выводу, что наиболее простым и безотказным способом будет модифицировать приложенный к модели файл с кодом скрипта, по которому генерируются модели таблиц.</div>
<div>
<br /></div>
<div>
После пары часов экспериментов, я убедился, что идея хорошая, т.к. скрипт выглядит довольно не сложно, хоть он и не маленьких размеров, порядка 800 - 900 строк. Он содержит в себе код на C# (зависит от языка проекта, в который добавляется этот скрипт) с помесью какого-то специального диалекта. После сохранения внесенных в код скрипта изменений, модели таблиц автоматически перестраиваются. И мы тут же можем наблюдать результат своих изменений. Что довольно удобно.</div>
<div>
<br /></div>
<div>
Нам надо модифицировать в скрипте генерацию следующих моментов:</div>
<div>
<ol style="text-align: left;">
<li>Модифицировать заголовок генерируемого класса (добавить наследование от интерфейса <b>INotifyPropertyChanged</b>).</li>
<li>Добавить реализацию интерфейса <b>INotifyPropertyChanged</b>.</li>
<li>Модифицировать реализацию свойств. В скрипте генерируются 3 типа свойств: </li>
</ol>
</div>
<div>
<ol style="text-align: left;"><ul>
<li>Обычные скалярные (поля в таблицах).</li>
<li>Навигационные, реализующие переходы по связям таблиц.</li>
<li>Свойства DbSet (с ними пока не разобрался, но вроде как их трогать тоже не надо).</li>
</ul>
</ol>
</div>
<div>
Раскрываем в дереве проекта файл <b>*.edmx</b>. И видим в нем еще 2 файла с расширением <b>tt</b>. Один <b>*.Content.tt </b>(он отвечает за генерацию контекста данных) и второй просто <b>*.tt</b> (он отвечает за генерацию модели данных). Нас интересует именно второй вариант (<b>*.tt</b>). Его то и надо модифицировать.</div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhPKV8nyACJvhXOqm-40cCKiHDCdKA34mJn3oSSNHM04riV7NoADh1LmgHdBE9yJUoOs2cAZYMxg91mm-F6S2V0XxZ9y9NPEa8Y-gXFJrok2n4r8St3iKCGb8H2MaJXTJEMLW0uOZE6eW0/s1600/Capture.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhPKV8nyACJvhXOqm-40cCKiHDCdKA34mJn3oSSNHM04riV7NoADh1LmgHdBE9yJUoOs2cAZYMxg91mm-F6S2V0XxZ9y9NPEa8Y-gXFJrok2n4r8St3iKCGb8H2MaJXTJEMLW0uOZE6eW0/s1600/Capture.PNG" /></a></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
Делаем резервную копию файла. И начинаем вносить изменения в код скрипта. По пунктам.</div>
<div>
<br /></div>
<div>
<b>1.</b> <b>Заголовок генерируемого класса.</b></div>
<div>
Находим в коде скрипта метод:</div>
<div>
<pre style="background: #1e1e1e; color: gainsboro; font-family: Consolas; font-size: 13;"> public string EntityClassOpening(EntityType entity)
</pre>
</div>
<div>
И модифицируем его следующим образом:<br />
<pre style="background: #1e1e1e; color: gainsboro; font-family: Consolas; font-size: 13;">
public string EntityClassOpening(EntityType entity)
{
return string.Format(
CultureInfo.InvariantCulture,
@"{0} {1}partial class {2} : System.ComponentModel.INotifyPropertyChanged{3}",
Accessibility.ForType(entity),
_code.SpaceAfter(_code.AbstractOption(entity)),
_code.Escape(entity),
_code.StringBefore(" , ", _typeMapper.GetTypeName(entity.BaseType)));
}</pre>
Как видно, я всего лишь дописал к генерируемому типу класса наследование от нужного мне интерфейса <b>INotifyPropertyChanged</b> и перенес добавление дополнительных наследуемых типов в конец.</div>
<div>
Сохраняем и видим, что в наших моделях таблиц в классах появилось наследование от интерфейса <b>INotifyPropertyChanged</b>. То что нам нужно.</div>
<div>
<br /></div>
<div>
<b>2. Реализация интерфейса INotifyPropertyChanged.</b></div>
<div>
Находим в коде скрипта следующие две строчки:<br />
<pre style="background: #1e1e1e; color: gainsboro; font-family: Consolas; font-size: 13;"><#=codeStringGenerator.UsingDirectives(inHeader: false)#>
<#=codeStringGenerator.EntityClassOpening(entity)#></pre>
</div>
<div>
И вносим после этих двух строчек и следующей после фигурной скобки следующие изменения:</div>
<div>
<pre style="background: #1e1e1e; color: gainsboro; font-family: Consolas; font-size: 13;"><#=codeStringGenerator.UsingDirectives(inHeader: false)#>
<#=codeStringGenerator.EntityClassOpening(entity)#>
{
#region Implement INotifyPropertyChanged
public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
}
}
#endregion
<#
var propertiesWithDefaultValues = typeMapper.GetPropertiesWithDefaultValues(entity);
var collectionNavigationProperties = typeMapper.GetCollectionNavigationProperties(entity);
var complexProperties = typeMapper.GetComplexProperties(entity);
if (propertiesWithDefaultValues.Any() || collectionNavigationProperties.Any() || complexProperties.Any())
{
#></pre>
</div>
<div>
Сохраняем и любуемся перегенерированными классами моделей таблиц. У нас появилась реализация интерфейса <b>INotifyPropertyChanged</b>.</div>
<div>
<br /></div>
<div>
<b>3. Генерируемые свойства.</b></div>
<div>
<ul style="text-align: left;">
<li><b>Скалярные свойства.</b></li>
</ul>
Находим в коде скрипта метод:</div>
<div>
<pre style="background: #1e1e1e; color: gainsboro; font-family: Consolas; font-size: 13;"> public string Property(EdmProperty edmProperty)
</pre>
</div>
<div>
И модифицируем его следующим образом:</div>
<div>
<pre style="background: #1e1e1e; color: gainsboro; font-family: Consolas; font-size: 13;"> public string Property(EdmProperty edmProperty)
{
return string.Format(
CultureInfo.InvariantCulture,
@"private {1} _{2};
{0} {1} {2}
{{
{3}get
{{
return _{2};
}}
{4}set
{{
if(_{2} != value)
{{
_{2} = value;
OnPropertyChanged(""{2}"");
}}
}}
}}
",
Accessibility.ForProperty(edmProperty),
_typeMapper.GetTypeName(edmProperty.TypeUsage),
_code.Escape(edmProperty),
_code.SpaceAfter(Accessibility.ForGetter(edmProperty)),
_code.SpaceAfter(Accessibility.ForSetter(edmProperty)));
}</pre>
</div>
<div>
Сохраняем и видим, что в наших моделях таблиц в скалярных свойствах появилось использование реализации интерфейса <b>INotifyPropertyChanged</b>.<br />
<div>
До изменений шаблон свойства выглядел примерно следующим образом:<br />
<pre style="background: #1e1e1e; color: gainsboro; font-family: Consolas; font-size: 13;">@"{0} {1} {2} {{ get; set; }}"
</pre>
Как видно, я всего лишь его чутка дописал до нужного мне вида.</div>
</div>
<div>
<br />
<br />
<ul style="text-align: left;">
<li><b>Навигационные свойства</b></li>
</ul>
<br />
Находим в коде скрипта метод:<br />
<pre style="background: #1e1e1e; color: gainsboro; font-family: Consolas; font-size: 13;"> public string NavigationProperty(NavigationProperty navigationProperty)
</pre>
И модифицируем его как указано ниже:<br />
<pre style="background: #1e1e1e; color: gainsboro; font-family: Consolas; font-size: 13;"> public string NavigationProperty(NavigationProperty navigationProperty)
{
var endType = _typeMapper.GetTypeName(navigationProperty.ToEndMember.GetEntityType());
return string.Format(
CultureInfo.InvariantCulture,
@"private {1} _{2};
{0} {1} {2}
{{
{3}get
{{
return _{2};
}}
{4}set
{{
if(_{2} != value)
{{
_{2} = value;
OnPropertyChanged(""{2}"");
}}
}}
}}
",
AccessibilityAndVirtual(Accessibility.ForProperty(navigationProperty)),
navigationProperty.ToEndMember.RelationshipMultiplicity == RelationshipMultiplicity.Many ? ("ICollection<" + endType + ">") : endType,
_code.Escape(navigationProperty),
_code.SpaceAfter(Accessibility.ForGetter(navigationProperty)),
_code.SpaceAfter(Accessibility.ForSetter(navigationProperty)));
}</pre>
Сохраняем и наблюдаем, как в наших моделях таблиц навигационные свойства перестроились нужным нам образом, чтобы уведомлять своих подписчиках об изменениях в связях между таблицами.<br />
<br /></div>
<div>
Собственно вот и все. Таким образом можно заставить <b>Entity Framework 6.0.x </b>генерировать модель таблиц любым, необходимым Вам образом.</div>
</div>
Святослав Панкратовhttp://www.blogger.com/profile/13039405381364404095noreply@blogger.com5Архангельск, Архангельская область, Россия64.5333333 40.53333329999998164.096798299999989 39.242439799999978 64.9698683 41.824226799999984tag:blogger.com,1999:blog-4678276506533150023.post-18807630972273744072012-02-29T12:19:00.001+04:002012-02-29T12:22:16.361+04:00Настройка Reporting Services в Microsoft SQL Server 2008 R2<div dir="ltr" style="text-align: left;" trbidi="on">
Всем привет!<br />
<br />
Как оказалось процесс настройки Reporting Services сделан через одно место. Опишу, что я делал, что получал и как в итоге решил проблему.<br />
<br />
<a name='more'></a><br />
Для начала надо проверить, что служба SQL Server Reporting Services включена:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg6Tu_LVk_25YeO4MqagVmZCwtt3rSH2emb4MSRlzluz3GvZ0JpKwboA-12cxclHqgTuCJzvCyEeFY-mkPoP_au43pKBKUMJwnNQbD1q9jahi7xLyrc2iX30e5lhA1gEbuO_BA034b2vXg/s1600/3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="245" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg6Tu_LVk_25YeO4MqagVmZCwtt3rSH2emb4MSRlzluz3GvZ0JpKwboA-12cxclHqgTuCJzvCyEeFY-mkPoP_au43pKBKUMJwnNQbD1q9jahi7xLyrc2iX30e5lhA1gEbuO_BA034b2vXg/s400/3.png" width="400" /></a></div>
<br />
После чего можно попробовать открыть Microsoft SQL Server 2008 R2 Reporting Services Configuration Manager и щелкнуть по линке на закладке Report Manager URL:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiydyBgIlrkN-QZFL-oOlqjw0-e75FBsI0i_cPR-SFEe1VhUEhqp-vLKIur7RQZmQwfNOXA_QaKDyYJ6_48wpj9gr9BokmKAS4CE1cG7Xwfk_fRZhfbi0YW4JsxrkDmOFFo2ckXG0XgHyU/s1600/4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="303" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiydyBgIlrkN-QZFL-oOlqjw0-e75FBsI0i_cPR-SFEe1VhUEhqp-vLKIur7RQZmQwfNOXA_QaKDyYJ6_48wpj9gr9BokmKAS4CE1cG7Xwfk_fRZhfbi0YW4JsxrkDmOFFo2ckXG0XgHyU/s400/4.png" width="400" /></a></div>
<br />
После чего будет предложено авторизоваться. Но какого-бы пользователя вы не ввели, вы будете получать ошибку следующего содержания:<br />
SQL Server Reporting Services Error. User does not have required permissions. Verify that sufficient permissions have been granted and Windows User Account Control (UAC) restrictions have been addressed.<br />
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg1Qt_ztJUSB0u7GrdsVIv9jkCgIZH1rHUTg0-d-L5co6VQQU-OxO-mIR5_n-Z6dfGJEjKFCaM6lKuFiui-zk4zs0ucioEzlIH98Jf4WpyzwBrzS3kYF2bydrm8wBywfM7wKT-YRgeeyk0/s1600/2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="122" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg1Qt_ztJUSB0u7GrdsVIv9jkCgIZH1rHUTg0-d-L5co6VQQU-OxO-mIR5_n-Z6dfGJEjKFCaM6lKuFiui-zk4zs0ucioEzlIH98Jf4WpyzwBrzS3kYF2bydrm8wBywfM7wKT-YRgeeyk0/s400/2.png" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgTm4CqUe8d515IHmq1mh88OVCCqM__0jaIjV8_9nClTdOCTZeaOa1n9lgf_eDjKtY-t4YbW4jYXec6xa2cb8G70g4q1pDwsMZV-gt4Zb6JBF33LTQhjESkjuHxGlTA7CfRlpCw9S_R45o/s1600/7.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="103" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgTm4CqUe8d515IHmq1mh88OVCCqM__0jaIjV8_9nClTdOCTZeaOa1n9lgf_eDjKtY-t4YbW4jYXec6xa2cb8G70g4q1pDwsMZV-gt4Zb6JBF33LTQhjESkjuHxGlTA7CfRlpCw9S_R45o/s400/7.png" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<b>Решение:</b></div>
<div class="separator" style="clear: both; text-align: left;">
Первым делом надо включить встроенную учетную запись Администратора.</div>
<div class="separator" style="clear: both; text-align: left;">
Делаем так:</div>
<br />
<blockquote class="tr_bq">
<span style="color: #666666; font-family: Times, 'Times New Roman', serif;">1. Нажмите кнопку Пуск и введите в поле поиска строку cmd.<br /> В списке результатов поиска щелкните правой кнопкой пункт cmd и выберите вариант Запуск от имени администратора.<br />2. В командной строке введите команду:<br />Для англоязычной Windows: <b>net user administrator /active:yes</b> и нажмите клавишу ВВОД.<br />Для русскоязычной Windows: <b>net user администратор /active:yes</b> и нажмите клавишу ВВОД.<br />3. В командной строке введите команду:<br />Для англоязычной Windows: <b>net user administrator <пароль></b> и нажмите клавишу ВВОД.<br />Для русскоязычной Windows: <b>net user администратор <пароль></b> и нажмите клавишу ВВОД.<br /><br /><b>Примечание.</b> Тэг <пароль> замените паролем, который следует установить для учетной записи администратора.</span></blockquote>
<br />
<div class="separator" style="clear: both;">
Далее<span style="color: #666666;">, </span>выходим из под учетки текущего пользователя и заходим из под Администратора. Пробуем зайти по вышеупомянутому адресу еще раз. Логинимся из под Администратора. Авторизация должна пройти успешно и должна открыться панель админки.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjT9a4p5GckrLWhI3fvEvxtE2YDtd-Hk089J7PzaR3m6ISCp3zx_zfzKghC7KpQ-OAH2U-zp5mvA74ggc5E4C_Oj0EOYXVr-WqySnYceFaiWwfpp2bUNGsSzbhZv6uA68u_WXUSyzyW6Jc/s1600/5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="246" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjT9a4p5GckrLWhI3fvEvxtE2YDtd-Hk089J7PzaR3m6ISCp3zx_zfzKghC7KpQ-OAH2U-zp5mvA74ggc5E4C_Oj0EOYXVr-WqySnYceFaiWwfpp2bUNGsSzbhZv6uA68u_WXUSyzyW6Jc/s400/5.png" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Если открылась главная страница, то просто перейдите с нее в Folder Settings.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Добавьте New Role Assignment. Это будет новый пользователь (те вы сами), которому станет доступна возможность авторизоваться.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Теперь выйдете из под учетной записи Администратор и войдите в свою учетную запись.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
По идее, теперь вы должны пройти авторизацию на web-страничке Reporting Services.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhsnwhG5-imFdSw4T4q_xSAQMYR1K95GbQRl5GDraiaZDO6Gv3kofQAbM76Potwh2HTyee6kh7LYBfBEmO6dL76WrN9LoNUQL4WhrqFSJt_Z0A8J5c4XBnxQAPwZpHGnh3-iJseLzZTnRI/s1600/6.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="230" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhsnwhG5-imFdSw4T4q_xSAQMYR1K95GbQRl5GDraiaZDO6Gv3kofQAbM76Potwh2HTyee6kh7LYBfBEmO6dL76WrN9LoNUQL4WhrqFSJt_Z0A8J5c4XBnxQAPwZpHGnh3-iJseLzZTnRI/s400/6.png" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
P.S.: Чтобы отключить обратно встроенную учетную запись Администратора, достаточно:</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<blockquote class="tr_bq">
<span style="color: #666666; font-family: Times, 'Times New Roman', serif;">1. Нажмите кнопку Пуск и введите в поле поиска строку cmd.<br /> В списке результатов поиска щелкните правой кнопкой пункт cmd и выберите вариант Запуск от имени администратора.<br />2. В командной строке введите команду:<br />Для англоязычной Windows: <b>net user administrator /active:no</b> и нажмите клавишуВВОД.<br />Для русскоязычной Windows: <b>net user администратор /active:no</b> и нажмите клавишу ВВОД.</span></blockquote>
<br />Советую записать где-нить введенный пароль, чтобы не забыть его.<br />
<br /></div>Святослав Панкратовhttp://www.blogger.com/profile/13039405381364404095noreply@blogger.com0tag:blogger.com,1999:blog-4678276506533150023.post-63877676778651062542011-12-29T14:39:00.000+04:002011-12-29T14:43:09.195+04:00Документальный фильм про Стива Джобса и его стартап, компанию NEXT, которую он основал после ухода из Apple.<p>Попался один очень интересный фильм про Стива Джобса и его компанию NEXT. На скока я понял, в фильме настоящие кадры некоторых моментов жизни этой компании. Рекомендую к просмотру всем. Кстати, фильм снят в 1986 году.</p><object style="height: 390px; width: 640px"><param name="movie" value="http://www.youtube.com/v/b63LewGwf3I?version=3&feature=player_detailpage"><param name="allowFullScreen" value="true"><param name="allowScriptAccess" value="always"><embed src="http://www.youtube.com/v/b63LewGwf3I?version=3&feature=player_detailpage" type="application/x-shockwave-flash" allowfullscreen="true" allowScriptAccess="always" width="640" height="360"></object> Святослав Панкратовhttp://www.blogger.com/profile/13039405381364404095noreply@blogger.com0tag:blogger.com,1999:blog-4678276506533150023.post-36065123608172197152011-11-25T11:59:00.001+04:002014-03-12T14:14:09.245+04:00Основы MVVM Pattern’а<div dir="ltr" style="text-align: left;" trbidi="on">
<br />
Хочу описать процесс создания простенького WPF приложения по MVVM шаблону. Этот шаблон используется на проекте, на котором я работаю в текущее время. Такое желание у меня возникло после того, как я убедился в проблематичности его освоения на собственном опыте и на опыте наблюдения за окружающими программистами, которые впервые сталкиваются с этим шаблоном.<br />
<br />
Проблема в том, что информации в интернете по нему очень много, но она вся как-то разбросана. И уходит очень много времени для того, чтобы сформировать в голове цельную картинку об этом шаблоне и о том как ему следовать при написании своих программ.<br />
<a name='more'></a><div align="justify">
<div align="justify">
<br />
Этот шаблон очень распространен среди Silverlight приложений и приложений WPF. <br />
<br /></div>
<div align="justify">
MVVM удобно использовать вместо классического <a href="http://ru.wikipedia.org/wiki/MVC">MVC</a> и ему подобных в тех случаях, когда в платформе, на которой ведется разработка, присутствует <a href="http://msdn.microsoft.com/ru-ru/library/cc278072(v=vs.95).aspx" target="_blank">«связывание данных»</a>. <br />
<br /></div>
В <a href="http://ru.wikipedia.org/wiki/MVC">MVC</a>/<a href="http://ru.wikipedia.org/wiki/Model-View-Presenter">MVP</a> изменения в пользовательском интерфейсе не влияют непосредственно на модель, а предварительно идут через Контроллер/Presenter. В таких технологиях как WPF и Silverlight есть концепция <a href="http://msdn.microsoft.com/ru-ru/library/cc278072(v=vs.95).aspx" target="_blank">«связывание данных»</a>, позволяющая связывать данные с визуальными элементами в обе стороны. Следовательно при использовании этого приема применение паттерна <a href="http://ru.wikipedia.org/wiki/MVC">MVC</a> становится крайне неудобным из-за того, что привязка данных к представлению напрямую не укладывается в концепцию <a href="http://ru.wikipedia.org/wiki/MVC">MVC</a>/<a href="http://ru.wikipedia.org/wiki/Model-View-Presenter">MVP</a>. <br />
<br />
<div align="justify">
Основная идея MVVM Pattern’а – отделить View, он же (UI) от логики, которая может происходить в рамках формы (View) и произвести <a href="http://msdn.microsoft.com/ru-ru/library/cc278072(v=vs.95).aspx" target="_blank">«связывание данных»</a> между этими двумя слоями. Это необходимо, так как позволяет изменять их отдельно друг от друга. Например, программист задает логику работы с данными, а дизайнер соответственно работает с пользовательским интерфейсом. <br />
<br /></div>
<div align="justify">
Схематично это выглядит так: <br />
<br /></div>
<img border="0" src="http://lh6.ggpht.com/-BFtk38KC-yQ/TuxoqbvU-1I/AAAAAAAAAIA/5eJsOKnwYfY/image_thumb%25255B4%25255D.png?imgmax=800" /><br />
<br />
Паттерн MVVM делится на три части: <br />
<ul>
<li><b>Модель</b> (Model), так же, как в классическом паттерне <a href="http://ru.wikipedia.org/wiki/MVC">MVC</a>, Модель представляет собой фундаментальные данные, необходимые для работы приложения (классы, структуры). </li>
<li><b>Вид/Представление</b> (View) так же, как в классическом паттерне <a href="http://ru.wikipedia.org/wiki/MVC">MVC</a>, Вид — это графический интерфейс, то есть окно, кнопки и.т.п. </li>
<li><b>Модель вида</b> (ViewModel, что означает «Model of View») является с одной стороны абстракцией Вида, а с другой предоставляет обертку данных из Модели, которые подлежат связыванию. То есть она содержит Модель, которая преобразована к Виду, а так же содержит в себе команды, которыми может пользоваться Вид, чтобы влиять на Модель.</li>
</ul>
<div align="justify">
<br />
Здесь интересен момент – как наш UI может отобразить наши данные из наших моделей? <br />
<br /></div>
<div align="justify">
В двух словах <a href="http://msdn.microsoft.com/ru-ru/library/cc278072(v=vs.95).aspx" target="_blank">«связывание данных»</a> – <a href="http://msdn.microsoft.com/ru-ru/library/cc278072(v=vs.95).aspx">Binding</a> говорит какому-либо свойству объекта на форме, из какого свойства DataContext’а взять данные.<br />
<br /></div>
DataContext – это свойство. Оно есть у каждого UI-объекта, те объекта имеющего визуальную составляющую. К этому свойству как раз и цепляют ViewModel. Таким образом вся эта цепочка начинает работать. При этом мы полностью отделяем всю логику приложения от его визуальной составляющей. Наша модель ничего не знает о том как она будет отображаться, а представление не знает что она будет отображать. Это свойство наследуется на все дочерние элементы. Поэтому его можно указать один раз на весь контрол и использовать на всей форме. <br />
Теперь, чтобы было все понятно, давайте напишем простенькое WPF приложение по MVVM шаблону.<br />
<br />
Сразу после создания пустого WPF проекта, дерево решения выглядит следующим образом:<br />
<br />
<div style="text-align: center;">
<div style="text-align: left;">
<a href="http://lh5.ggpht.com/-TL4V0X77KSY/TuxorFXonfI/AAAAAAAAAIE/MFepckC2fZI/s1600-h/image2.png"><img border="0" src="http://lh4.ggpht.com/-q_oboumtCwY/Tuxor0uETCI/AAAAAAAAAIQ/APx_4tp4Re0/image_thumb.png?imgmax=800" /></a></div>
</div>
<br />
Добавим в него 3 папки: View, Model и ViewModel.<br />
<br />
<div style="text-align: center;">
<div style="text-align: left;">
<a href="http://lh4.ggpht.com/-8pc27ecZNeE/TuxosqbtztI/AAAAAAAAAIU/EvGLCWwDYFw/s1600-h/image5.png"><img border="0" src="http://lh6.ggpht.com/-meUJ8yVgG3I/TuxotUcAX4I/AAAAAAAAAIg/s5zb2QlH59A/image_thumb1.png?imgmax=800" /></a></div>
</div>
<br />
В папке View у нас будут находиться только одни формы. Поэтому перенесем нашу главную форму в папку View.<br />
Теперь нам надо изменить namespace у этой формы и имя класса, чтобы из него было понятно к какой группе принадлежит наш класс.</div>
<div align="justify">
<br />
<br />
<b><u>MainWindow.xaml</u></b><br />
<pre style="background-color: white; background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 13px;"><span style="color: blue;"><</span><span style="color: #a31515;">Window</span><span style="color: red;"> x</span><span style="color: blue;">:</span><span style="color: red;">Class</span><span style="color: blue;">=</span><span style="color: blue;">"WpfApplication.View.MainWindowView"</span>
<span style="color: red;"> xmlns</span><span style="color: blue;">=</span><span style="color: blue;">"http://schemas.microsoft.com/winfx/2006/xaml/presentation"</span>
<span style="color: red;"> xmlns</span><span style="color: blue;">:</span><span style="color: red;">x</span><span style="color: blue;">=</span><span style="color: blue;">"http://schemas.microsoft.com/winfx/2006/xaml"</span>
<span style="color: red;"> Title</span><span style="color: blue;">=</span><span style="color: blue;">"MainWindow"</span><span style="color: red;"> Height</span><span style="color: blue;">=</span><span style="color: blue;">"170"</span><span style="color: red;"> Width</span><span style="color: blue;">=</span><span style="color: blue;">"400"</span><span style="color: blue;">></span>
<span style="color: #a31515;"> </span><span style="color: blue;"><</span><span style="color: #a31515;">Grid</span><span style="color: blue;">></span>
<span style="color: #a31515;"> </span><span style="color: blue;"></</span><span style="color: #a31515;">Grid</span><span style="color: blue;">></span>
<span style="color: blue;"></</span><span style="color: #a31515;">Window</span><span style="color: blue;">></span>
</pre>
<br />
<br />
<b><u>MainWindow.xaml.cs</u></b><br />
<div align="justify">
<pre style="background-color: white; background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 13px;"><span style="color: blue;">using</span> System.Windows;
<span style="color: blue;">namespace</span> WpfApplication.View
{
<span style="color: grey;">///</span><span style="color: green;"> </span><span style="color: grey;"><summary></span>
<span style="color: grey;">///</span><span style="color: green;"> Interaction logic for MainWindow.xaml</span>
<span style="color: grey;">///</span><span style="color: green;"> </span><span style="color: grey;"></summary></span>
<span style="color: blue;">public</span> <span style="color: blue;">partial</span> <span style="color: blue;">class</span> <span style="color: #2b91af;">MainWindowView</span> : <span style="color: #2b91af;">Window</span>
{
<span style="color: blue;">public</span> MainWindowView()
{
InitializeComponent();
}
}
}
</pre>
</div>
<br />
<br />
Дерево нашего решения примет следующий вид:<br />
<br />
<img border="0" src="http://lh6.ggpht.com/-a4ZhaTbIPJ4/TuxovjxT_BI/AAAAAAAAAIw/6DrZamTXIdo/image_thumb3.png?imgmax=800" /><br />
<br />
В файле App.xaml прописан путь к форме, которая запускается по умолчанию при старте программы. Так как мы перенесли нашу форму в другой namespace и в добавок к этому переименовали ее, то путь необходимо изменить:<br />
<br />
<br />
<b><u>App.xaml</u></b><br />
<pre style="background-color: white; background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 13px;"><span style="color: blue;"><</span><span style="color: #a31515;">Application</span><span style="color: red;"> x</span><span style="color: blue;">:</span><span style="color: red;">Class</span><span style="color: blue;">=</span><span style="color: blue;">"WpfApplication.App"</span>
<span style="color: red;"> xmlns</span><span style="color: blue;">=</span><span style="color: blue;">"http://schemas.microsoft.com/winfx/2006/xaml/presentation"</span>
<span style="color: red;"> xmlns</span><span style="color: blue;">:</span><span style="color: red;">x</span><span style="color: blue;">=</span><span style="color: blue;">"http://schemas.microsoft.com/winfx/2006/xaml"</span>
<span style="color: red;"> StartupUri</span><span style="color: blue;">=</span><span style="color: blue;">"View/MainWindowView.xaml"</span><span style="color: blue;">></span>
<span style="color: #a31515;"> </span><span style="color: blue;"><</span><span style="color: #a31515;">Application.Resources</span><span style="color: blue;">></span>
<span style="color: #a31515;"> </span>
<span style="color: #a31515;"> </span><span style="color: blue;"></</span><span style="color: #a31515;">Application.Resources</span><span style="color: blue;">></span>
<span style="color: blue;"></</span><span style="color: #a31515;">Application</span><span style="color: blue;">></span></pre>
<br />
<br />
Теперь, если мы запустим наше приложение, оно должно запуститься:<br />
<br />
<img border="0" src="http://lh6.ggpht.com/-XuqvkLb3WXE/TuxoxFy9VJI/AAAAAAAAAJA/qvQiaCS2J4A/image_thumb5.png?imgmax=800" /><br />
<br />
Теперь добавим в наш проект простенькую модель. Например, это будет класс человека:<br />
<div align="justify">
<br />
<br />
<b><u>PeopleModel.cs</u></b></div>
<div align="justify">
<pre style="background-color: white; background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 13px;"><span style="color: blue;">namespace</span> WpfApplication.Model
{
<span style="color: blue;">class</span> <span style="color: #2b91af;">PeopleModel</span>
{
<span style="color: blue;"> #region</span> Properties
<span style="color: grey;">///</span><span style="color: green;"> </span><span style="color: grey;"><summary></span>
<span style="color: grey;">///</span><span style="color: green;"> Get or set first name.</span>
<span style="color: grey;">///</span><span style="color: green;"> </span><span style="color: grey;"></summary></span>
<span style="color: blue;">public</span> <span style="color: blue;">string</span> FirstName { <span style="color: blue;">get</span>; <span style="color: blue;">set</span>; }
<span style="color: grey;">///</span><span style="color: green;"> </span><span style="color: grey;"><summary></span>
<span style="color: grey;">///</span><span style="color: green;"> Get or set last name.</span>
<span style="color: grey;">///</span><span style="color: green;"> </span><span style="color: grey;"></summary></span>
<span style="color: blue;">public</span> <span style="color: blue;">string</span> LastName { <span style="color: blue;">get</span>; <span style="color: blue;">set</span>; }
<span style="color: blue;"> #endregion</span>
}
}
</pre>
</div>
<br />
<br />
<img border="0" src="http://lh6.ggpht.com/-VQ_hq2udYfQ/TuxozBt12MI/AAAAAAAAAJM/ucNZ29l3b-w/image_thumb7.png?imgmax=800" /><br />
<br />
Далее нам надо создать связующее звено между нашей формой и моделью. Это будет MainWindowViewModel, в котором будет свойство типа нашей модели:<br />
<div align="justify">
<br />
<br />
<b><u>MainWindowViewModel.cs</u></b></div>
<div align="justify">
<pre style="background-color: white; background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 13px;"><span style="color: blue;">using</span> System.Windows;
<span style="color: blue;">using</span> System.Windows.Input;
<span style="color: blue;">using</span> WpfApplication.Model;
<span style="color: blue;">namespace</span> WpfApplication.ViewModel
{
<span style="color: blue;">class</span> <span style="color: #2b91af;">MainViewModel</span>
{
<span style="color: blue;"> #region</span> Constructor
<span style="color: grey;">///</span><span style="color: green;"> </span><span style="color: grey;"><summary></span>
<span style="color: grey;">///</span><span style="color: green;"> Constructor.</span>
<span style="color: grey;">///</span><span style="color: green;"> </span><span style="color: grey;"></summary></span>
<span style="color: blue;">public</span> MainViewModel()
{
People = <span style="color: blue;">new</span> <span style="color: #2b91af;">PeopleModel</span>
{
FirstName = <span style="color: #a31515;">"First name"</span>,
LastName = <span style="color: #a31515;">"Last name"</span>
};
}
<span style="color: blue;"> #endregion</span>
<span style="color: blue;"> #region</span> Properties
<span style="color: grey;">///</span><span style="color: green;"> </span><span style="color: grey;"><summary></span>
<span style="color: grey;">///</span><span style="color: green;"> Get or set people.</span>
<span style="color: grey;">///</span><span style="color: green;"> </span><span style="color: grey;"></summary></span>
<span style="color: blue;">public</span> <span style="color: #2b91af;">PeopleModel</span> People { <span style="color: blue;">get</span>; <span style="color: blue;">set</span>; }
<span style="color: blue;"> #endregion</span>
}
}
</pre>
<pre style="background-color: white; background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 13px;"></pre>
</div>
<br />
<img border="0" src="http://lh6.ggpht.com/-3-xJabjH59Q/Tuxo0fXs11I/AAAAAAAAAJc/0eZaHwaVkjk/image_thumb8.png?imgmax=800" /><br />
<br />
Теперь давайте набросаем на форме контролов, чтобы все это отображать:<br />
<br />
<br />
<b><u>MainWindowView.xaml</u></b><br />
<pre style="background-color: white; background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 13px;"><span style="color: blue;"><</span><span style="color: #a31515;">Window</span><span style="color: red;"> x</span><span style="color: blue;">:</span><span style="color: red;">Class</span><span style="color: blue;">=</span><span style="color: blue;">"WpfApplication.View.MainWindowView"</span>
<span style="color: red;"> xmlns</span><span style="color: blue;">=</span><span style="color: blue;">"http://schemas.microsoft.com/winfx/2006/xaml/presentation"</span>
<span style="color: red;"> xmlns</span><span style="color: blue;">:</span><span style="color: red;">x</span><span style="color: blue;">=</span><span style="color: blue;">"http://schemas.microsoft.com/winfx/2006/xaml"</span>
<span style="color: red;"> Title</span><span style="color: blue;">=</span><span style="color: blue;">"MainWindow"</span><span style="color: red;"> Height</span><span style="color: blue;">=</span><span style="color: blue;">"170"</span><span style="color: red;"> Width</span><span style="color: blue;">=</span><span style="color: blue;">"400"</span><span style="color: blue;">></span>
<span style="color: #a31515;"> </span><span style="color: blue;"><</span><span style="color: #a31515;">Grid</span><span style="color: blue;">></span>
<span style="color: #a31515;"> </span><span style="color: blue;"><</span><span style="color: #a31515;">TextBlock</span><span style="color: red;"> HorizontalAlignment</span><span style="color: blue;">=</span><span style="color: blue;">"Left"</span><span style="color: red;"> VerticalAlignment</span><span style="color: blue;">=</span><span style="color: blue;">"Top"</span><span style="color: red;"> Margin</span><span style="color: blue;">=</span><span style="color: blue;">"12,12,0,0"</span>
<span style="color: red;"> Text</span><span style="color: blue;">=</span><span style="color: blue;">"First name"</span><span style="color: blue;">/></span>
<span style="color: #a31515;"> </span><span style="color: blue;"><</span><span style="color: #a31515;">TextBlock</span><span style="color: red;"> HorizontalAlignment</span><span style="color: blue;">=</span><span style="color: blue;">"Left"</span><span style="color: red;"> VerticalAlignment</span><span style="color: blue;">=</span><span style="color: blue;">"Top"</span><span style="color: red;"> Margin</span><span style="color: blue;">=</span><span style="color: blue;">"12,52,0,0"</span>
<span style="color: red;"> Text</span><span style="color: blue;">=</span><span style="color: blue;">"Last name"</span><span style="color: blue;">/></span>
<span style="color: #a31515;"> </span><span style="color: blue;"><</span><span style="color: #a31515;">TextBox</span><span style="color: red;"> HorizontalAlignment</span><span style="color: blue;">=</span><span style="color: blue;">"Left"</span><span style="color: red;"> VerticalAlignment</span><span style="color: blue;">=</span><span style="color: blue;">"Top"</span><span style="color: red;"> Margin</span><span style="color: blue;">=</span><span style="color: blue;">"90,9,0,0"</span><span style="color: red;"> Width</span><span style="color: blue;">=</span><span style="color: blue;">"120"</span>
<span style="color: red;"> Text</span><span style="color: blue;">="{</span><span style="color: #a31515;">Binding</span><span style="color: red;"> Path</span><span style="color: blue;">=</span><span style="color: blue;">People</span><span style="color: blue;">.</span><span style="color: blue;">FirstName</span><span style="color: blue;">,</span><span style="color: red;"> Mode</span><span style="color: blue;">=</span><span style="color: blue;">TwoWay</span><span style="color: blue;">}</span><span style="color: blue;">"</span><span style="color: blue;">/></span>
<span style="color: #a31515;"> </span><span style="color: blue;"><</span><span style="color: #a31515;">TextBox</span><span style="color: red;"> HorizontalAlignment</span><span style="color: blue;">=</span><span style="color: blue;">"Left"</span><span style="color: red;"> VerticalAlignment</span><span style="color: blue;">=</span><span style="color: blue;">"Top"</span><span style="color: red;"> Margin</span><span style="color: blue;">=</span><span style="color: blue;">"90,49,0,0"</span><span style="color: red;"> Width</span><span style="color: blue;">=</span><span style="color: blue;">"120"</span>
<span style="color: red;"> Text</span><span style="color: blue;">="{</span><span style="color: #a31515;">Binding</span><span style="color: red;"> Path</span><span style="color: blue;">=</span><span style="color: blue;">People</span><span style="color: blue;">.</span><span style="color: blue;">LastName</span><span style="color: blue;">,</span><span style="color: red;"> Mode</span><span style="color: blue;">=</span><span style="color: blue;">TwoWay</span><span style="color: blue;">}</span><span style="color: blue;">"</span><span style="color: blue;">/></span>
<span style="color: #a31515;"> </span><span style="color: blue;"><</span><span style="color: #a31515;">TextBox</span><span style="color: red;"> HorizontalAlignment</span><span style="color: blue;">=</span><span style="color: blue;">"Left"</span><span style="color: red;"> VerticalAlignment</span><span style="color: blue;">=</span><span style="color: blue;">"Top"</span><span style="color: red;"> Margin</span><span style="color: blue;">=</span><span style="color: blue;">"246,9,0,0"</span><span style="color: red;"> Width</span><span style="color: blue;">=</span><span style="color: blue;">"120"</span>
<span style="color: red;"> Text</span><span style="color: blue;">="{</span><span style="color: #a31515;">Binding</span><span style="color: red;"> Path</span><span style="color: blue;">=</span><span style="color: blue;">People</span><span style="color: blue;">.</span><span style="color: blue;">FirstName</span><span style="color: blue;">,</span><span style="color: red;"> Mode</span><span style="color: blue;">=</span><span style="color: blue;">TwoWay</span><span style="color: blue;">}</span><span style="color: blue;">"</span><span style="color: red;"> IsReadOnly</span><span style="color: blue;">=</span><span style="color: blue;">"True"</span><span style="color: blue;"> /></span>
<span style="color: #a31515;"> </span><span style="color: blue;"><</span><span style="color: #a31515;">TextBox</span><span style="color: red;"> HorizontalAlignment</span><span style="color: blue;">=</span><span style="color: blue;">"Left"</span><span style="color: red;"> VerticalAlignment</span><span style="color: blue;">=</span><span style="color: blue;">"Top"</span><span style="color: red;"> Margin</span><span style="color: blue;">=</span><span style="color: blue;">"246,49,0,0"</span><span style="color: red;"> Width</span><span style="color: blue;">=</span><span style="color: blue;">"120"</span>
<span style="color: red;"> Text</span><span style="color: blue;">="{</span><span style="color: #a31515;">Binding</span><span style="color: red;"> Path</span><span style="color: blue;">=</span><span style="color: blue;">People</span><span style="color: blue;">.</span><span style="color: blue;">LastName</span><span style="color: blue;">,</span><span style="color: red;"> Mode</span><span style="color: blue;">=</span><span style="color: blue;">TwoWay</span><span style="color: blue;">}</span><span style="color: blue;">"</span><span style="color: red;"> IsReadOnly</span><span style="color: blue;">=</span><span style="color: blue;">"True"</span><span style="color: blue;"> /></span>
<span style="color: #a31515;"> </span><span style="color: blue;"><</span><span style="color: #a31515;">Button</span><span style="color: red;"> Content</span><span style="color: blue;">=</span><span style="color: blue;">"Click me"</span><span style="color: red;"> HorizontalAlignment</span><span style="color: blue;">=</span><span style="color: blue;">"Left"</span><span style="color: red;"> Margin</span><span style="color: blue;">=</span><span style="color: blue;">"291,97,0,0"</span><span style="color: red;"> VerticalAlignment</span><span style="color: blue;">=</span><span style="color: blue;">"Top"</span><span style="color: red;"> Width</span><span style="color: blue;">=</span><span style="color: blue;">"75"</span><span style="color: blue;"> /></span>
<span style="color: #a31515;"> </span><span style="color: blue;"></</span><span style="color: #a31515;">Grid</span><span style="color: blue;">></span>
<span style="color: blue;"></</span><span style="color: #a31515;">Window</span><span style="color: blue;">></span>
</pre>
<div class="csharpcode">
<pre class="alt"></pre>
</div>
<br />
<br />
<img border="0" src="http://lh6.ggpht.com/--uGVtqbF154/Tuxo2BtNzZI/AAAAAAAAAJw/wkJ06DA-4N4/image_thumb10.png?imgmax=800" /><br />
<br />
Теперь, если мы запустим наше приложение, оно будет выглядеть так:<br />
<br />
<img border="0" src="http://lh4.ggpht.com/-geH3uEDofY8/Tuxo32WIc1I/AAAAAAAAAKA/-iY2d2nmUY4/image_thumb12.png?imgmax=800" /><br />
<br />
Теперь самое важное. Как наша форма будет брать данные из связующего звена – ViewModel?<br />
<br />
Для этого мы должны вначале указать форме какой объект будет являться для нее ViewModel’лью. Ссылка на этот объект должна находиться в DataContext’е формы. <br />
<br />
DataContext у формы должен задаваться при создании формы. Поэтому мы немного изменим App.xaml и App.xaml.cs следующим образом:<br />
<br />
<br />
<b><u>App.xaml</u></b><br />
<div align="justify">
<span style="color: blue; font-family: Consolas; font-size: 13px; text-align: left;"><</span><span style="color: #a31515; font-family: Consolas; font-size: 13px; text-align: left;">Application</span><span style="color: red; font-family: Consolas; font-size: 13px; text-align: left;"> x</span><span style="color: blue; font-family: Consolas; font-size: 13px; text-align: left;">:</span><span style="color: red; font-family: Consolas; font-size: 13px; text-align: left;">Class</span><span style="color: blue; font-family: Consolas; font-size: 13px; text-align: left;">=</span><span style="color: blue; font-family: Consolas; font-size: 13px; text-align: left;">"WpfApplication.App"</span></div>
<div align="justify">
<pre style="background-color: white; background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 13px;"> <span style="color: red;"> xmlns</span><span style="color: blue;">=</span><span style="color: blue;">"http://schemas.microsoft.com/winfx/2006/xaml/presentation"</span>
<span style="color: red;"> xmlns</span><span style="color: blue;">:</span><span style="color: red;">x</span><span style="color: blue;">=</span><span style="color: blue;">"http://schemas.microsoft.com/winfx/2006/xaml"</span><span style="color: blue;">></span>
<span style="color: #a31515;"> </span><span style="color: blue;"><</span><span style="color: #a31515;">Application.Resources</span><span style="color: blue;">></span>
<span style="color: #a31515;"> </span>
<span style="color: #a31515;"> </span><span style="color: blue;"></</span><span style="color: #a31515;">Application.Resources</span><span style="color: blue;">></span>
<span style="color: blue;"></</span><span style="color: #a31515;">Application</span><span style="color: blue;">></span></pre>
</div>
<br />
<br />
<b><u>App.xaml.cs</u></b><br />
<div class="csharpcode">
<pre class="alt"></pre>
<pre class="alt"><pre style="background-color: white; background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 13px;"><span style="color: blue;">using</span> System.Windows;
<span style="color: blue;">using</span> WpfApplication.View;
<span style="color: blue;">using</span> WpfApplication.ViewModel;
<span style="color: blue;">namespace</span> WpfApplication
{
<span style="color: grey;">///</span><span style="color: green;"> </span><span style="color: grey;"><summary></span>
<span style="color: grey;">///</span><span style="color: green;"> Interaction logic for App.xaml</span>
<span style="color: grey;">///</span><span style="color: green;"> </span><span style="color: grey;"></summary></span>
<span style="color: blue;">public</span> <span style="color: blue;">partial</span> <span style="color: blue;">class</span> <span style="color: #2b91af;">App</span> : <span style="color: #2b91af;">Application</span>
{
<span style="color: blue;">public</span> App()
{
<span style="color: blue;">var</span> mw = <span style="color: blue;">new</span> <span style="color: #2b91af;">MainWindowView</span>
{
DataContext = <span style="color: blue;">new</span> <span style="color: #2b91af;">MainViewModel</span>()
};
mw.Show();
}
}
}</pre>
</pre>
<pre class="alt"></pre>
</div>
То есть мы тут убираем из разметки запускаемую по умолчанию форму и в коде, в конструкторе, сами ручками прописываем создание формы, задание у нее DataContext’а и непосредственно отображение.<br />
<br />
Теперь мы должны привязать элементы на форме к конкретным свойствам модели. Для этого мы должны описать эти привязки в разметке. Например:<br />
<br />
<br />
<b><u>MainWindowView.xaml</u></b><br />
<pre style="background-color: white; background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 13px;"><span style="color: blue;"><</span><span style="color: #a31515;">TextBox</span><span style="color: red;"> HorizontalAlignment</span><span style="color: blue;">=</span><span style="color: blue;">"Left"</span><span style="color: red;"> VerticalAlignment</span><span style="color: blue;">=</span><span style="color: blue;">"Top"</span><span style="color: red;"> Margin</span><span style="color: blue;">=</span><span style="color: blue;">"90,9,0,0"</span><span style="color: red;"> Width</span><span style="color: blue;">=</span><span style="color: blue;">"120"</span> <span style="color: red;">Text</span><span style="color: blue;">="{</span><span style="color: #a31515;">Binding</span><span style="color: red;"> Path</span><span style="color: blue;">=</span><span style="color: blue;">People</span><span style="color: blue;">.</span><span style="color: blue;">FirstName</span><span style="color: blue;">,</span><span style="color: red;"> Mode</span><span style="color: blue;">=</span><span style="color: blue;">TwoWay</span><span style="color: blue;">}</span><span style="color: blue;">"</span><span style="color: blue;">/></span></pre>
<br />
<br />
Тут мы привязали у TextBox’а свойство Text к свойству People.FirstName у ViewModel. Так же мы указали настройку привязки. Мы сказали, что она будет двусторонняя. То есть, если мы изменяем на форме значение в TextBox’е, то это значение изменится и в свойстве модели. И наоборот.<br />
<br />
Таким образом мы привязываем все элементы на нашей форме к модели через ViewModel:<br />
<div align="justify">
<br />
<br />
<b><u>MainWindowView.xaml</u></b></div>
<div align="justify">
<pre style="background-color: white; background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 13px;"><span style="color: blue;"><</span><span style="color: #a31515;">Window</span><span style="color: red;"> x</span><span style="color: blue;">:</span><span style="color: red;">Class</span><span style="color: blue;">=</span><span style="color: blue;">"WpfApplication.View.MainWindowView"</span>
<span style="color: red;"> xmlns</span><span style="color: blue;">=</span><span style="color: blue;">"http://schemas.microsoft.com/winfx/2006/xaml/presentation"</span>
<span style="color: red;"> xmlns</span><span style="color: blue;">:</span><span style="color: red;">x</span><span style="color: blue;">=</span><span style="color: blue;">"http://schemas.microsoft.com/winfx/2006/xaml"</span>
<span style="color: red;"> Title</span><span style="color: blue;">=</span><span style="color: blue;">"MainWindow"</span><span style="color: red;"> Height</span><span style="color: blue;">=</span><span style="color: blue;">"170"</span><span style="color: red;"> Width</span><span style="color: blue;">=</span><span style="color: blue;">"400"</span><span style="color: blue;">></span>
<span style="color: #a31515;"> </span><span style="color: blue;"><</span><span style="color: #a31515;">Grid</span><span style="color: blue;">></span>
<span style="color: #a31515;"> </span><span style="color: blue;"><</span><span style="color: #a31515;">TextBlock</span><span style="color: red;"> HorizontalAlignment</span><span style="color: blue;">=</span><span style="color: blue;">"Left"</span><span style="color: red;"> VerticalAlignment</span><span style="color: blue;">=</span><span style="color: blue;">"Top"</span><span style="color: red;"> Margin</span><span style="color: blue;">=</span><span style="color: blue;">"12,12,0,0"</span>
<span style="color: red;"> Text</span><span style="color: blue;">=</span><span style="color: blue;">"First name"</span><span style="color: blue;">/></span>
<span style="color: #a31515;"> </span><span style="color: blue;"><</span><span style="color: #a31515;">TextBlock</span><span style="color: red;"> HorizontalAlignment</span><span style="color: blue;">=</span><span style="color: blue;">"Left"</span><span style="color: red;"> VerticalAlignment</span><span style="color: blue;">=</span><span style="color: blue;">"Top"</span><span style="color: red;"> Margin</span><span style="color: blue;">=</span><span style="color: blue;">"12,52,0,0"</span>
<span style="color: red;"> Text</span><span style="color: blue;">=</span><span style="color: blue;">"Last name"</span><span style="color: blue;">/></span>
<span style="color: #a31515;"> </span><span style="color: blue;"><</span><span style="color: #a31515;">TextBox</span><span style="color: red;"> HorizontalAlignment</span><span style="color: blue;">=</span><span style="color: blue;">"Left"</span><span style="color: red;"> VerticalAlignment</span><span style="color: blue;">=</span><span style="color: blue;">"Top"</span><span style="color: red;"> Margin</span><span style="color: blue;">=</span><span style="color: blue;">"90,9,0,0"</span><span style="color: red;"> Width</span><span style="color: blue;">=</span><span style="color: blue;">"120"</span>
<span style="color: red;"> Text</span><span style="color: blue;">="{</span><span style="color: #a31515;">Binding</span><span style="color: red;"> Path</span><span style="color: blue;">=</span><span style="color: blue;">People</span><span style="color: blue;">.</span><span style="color: blue;">FirstName</span><span style="color: blue;">,</span><span style="color: red;"> Mode</span><span style="color: blue;">=</span><span style="color: blue;">TwoWay</span><span style="color: blue;">}</span><span style="color: blue;">"</span><span style="color: blue;">/></span>
<span style="color: #a31515;"> </span><span style="color: blue;"><</span><span style="color: #a31515;">TextBox</span><span style="color: red;"> HorizontalAlignment</span><span style="color: blue;">=</span><span style="color: blue;">"Left"</span><span style="color: red;"> VerticalAlignment</span><span style="color: blue;">=</span><span style="color: blue;">"Top"</span><span style="color: red;"> Margin</span><span style="color: blue;">=</span><span style="color: blue;">"90,49,0,0"</span><span style="color: red;"> Width</span><span style="color: blue;">=</span><span style="color: blue;">"120"</span>
<span style="color: red;"> Text</span><span style="color: blue;">="{</span><span style="color: #a31515;">Binding</span><span style="color: red;"> Path</span><span style="color: blue;">=</span><span style="color: blue;">People</span><span style="color: blue;">.</span><span style="color: blue;">LastName</span><span style="color: blue;">,</span><span style="color: red;"> Mode</span><span style="color: blue;">=</span><span style="color: blue;">TwoWay</span><span style="color: blue;">}</span><span style="color: blue;">"</span><span style="color: blue;">/></span>
<span style="color: #a31515;"> </span><span style="color: blue;"><</span><span style="color: #a31515;">TextBox</span><span style="color: red;"> HorizontalAlignment</span><span style="color: blue;">=</span><span style="color: blue;">"Left"</span><span style="color: red;"> VerticalAlignment</span><span style="color: blue;">=</span><span style="color: blue;">"Top"</span><span style="color: red;"> Margin</span><span style="color: blue;">=</span><span style="color: blue;">"246,9,0,0"</span><span style="color: red;"> Width</span><span style="color: blue;">=</span><span style="color: blue;">"120"</span>
<span style="color: red;"> Text</span><span style="color: blue;">="{</span><span style="color: #a31515;">Binding</span><span style="color: red;"> Path</span><span style="color: blue;">=</span><span style="color: blue;">People</span><span style="color: blue;">.</span><span style="color: blue;">FirstName</span><span style="color: blue;">,</span><span style="color: red;"> Mode</span><span style="color: blue;">=</span><span style="color: blue;">TwoWay</span><span style="color: blue;">}</span><span style="color: blue;">"</span><span style="color: red;"> IsReadOnly</span><span style="color: blue;">=</span><span style="color: blue;">"True"</span><span style="color: blue;"> /></span>
<span style="color: #a31515;"> </span><span style="color: blue;"><</span><span style="color: #a31515;">TextBox</span><span style="color: red;"> HorizontalAlignment</span><span style="color: blue;">=</span><span style="color: blue;">"Left"</span><span style="color: red;"> VerticalAlignment</span><span style="color: blue;">=</span><span style="color: blue;">"Top"</span><span style="color: red;"> Margin</span><span style="color: blue;">=</span><span style="color: blue;">"246,49,0,0"</span><span style="color: red;"> Width</span><span style="color: blue;">=</span><span style="color: blue;">"120"</span>
<span style="color: red;"> Text</span><span style="color: blue;">="{</span><span style="color: #a31515;">Binding</span><span style="color: red;"> Path</span><span style="color: blue;">=</span><span style="color: blue;">People</span><span style="color: blue;">.</span><span style="color: blue;">LastName</span><span style="color: blue;">,</span><span style="color: red;"> Mode</span><span style="color: blue;">=</span><span style="color: blue;">TwoWay</span><span style="color: blue;">}</span><span style="color: blue;">"</span><span style="color: red;"> IsReadOnly</span><span style="color: blue;">=</span><span style="color: blue;">"True"</span><span style="color: blue;"> /></span>
<span style="color: #a31515;"> </span><span style="color: blue;"><</span><span style="color: #a31515;">Button</span><span style="color: red;"> Content</span><span style="color: blue;">=</span><span style="color: blue;">"Click me"</span><span style="color: red;"> HorizontalAlignment</span><span style="color: blue;">=</span><span style="color: blue;">"Left"</span><span style="color: red;"> Margin</span><span style="color: blue;">=</span><span style="color: blue;">"291,97,0,0"</span><span style="color: red;"> VerticalAlignment</span><span style="color: blue;">=</span><span style="color: blue;">"Top"</span><span style="color: red;"> Width</span><span style="color: blue;">=</span><span style="color: blue;">"75"</span><span style="color: blue;"> /></span>
<span style="color: #a31515;"> </span><span style="color: blue;"></</span><span style="color: #a31515;">Grid</span><span style="color: blue;">></span>
<span style="color: blue;"></</span><span style="color: #a31515;">Window</span><span style="color: blue;">></span></pre>
</div>
<div align="justify">
<br />
<br /></div>
Теперь, если мы запустим наше приложение, то мы увидим на форме наши данные, которые мы проинициализировали в конструкторе нашей MainViewModel.<br />
<br />
<img border="0" src="http://lh6.ggpht.com/-UzqyY5AcbUg/Tuxo5ipDp-I/AAAAAAAAAKQ/sGT71rTFwvs/image_thumb14.png?imgmax=800" /><br />
<br />
Если вы измените текст в каком-либо из TextBox’ов первого столбика, то значение TextBox’а напротив тоже изменится:<br />
<br />
<img border="0" src="http://lh6.ggpht.com/-n_wP0jn6LTQ/Tuxo7QLkOcI/AAAAAAAAAKc/Yio2S-Bjktg/image_thumb16.png?imgmax=800" /><br />
<br />
Это происходит благодаря тому, что оба TextBox’а привязаны к одним и тем-же полям модели.</div>
<div align="justify">
<br />
Теперь давайте сделаем привязку команды у кнопки к нашей MainViewModel. <br />
<br />
Логика такая: <b>Кнопка –> Команда –> Метод.</b><br />
<br />
Для этого нам надо добавить свойство команды в MainViewModel. И написать собственно сам метод, который будет вызываться при срабатывании команды:<br />
<br />
<br />
<b><u>MainWindowViewModel.cs</u></b><br />
<pre style="background-color: white; background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 13px;"><span style="color: blue;">using</span> System.Windows;
<span style="color: blue;">using</span> System.Windows.Input;
<span style="color: blue;">using</span> WpfApplication.Model;
<span style="color: blue;">namespace</span> WpfApplication.ViewModel
{
<span style="color: blue;">class</span> <span style="color: #2b91af;">MainViewModel</span>
{
<span style="color: blue;"> #region</span> Constructor
<span style="color: grey;">///</span><span style="color: green;"> </span><span style="color: grey;"><summary></span>
<span style="color: grey;">///</span><span style="color: green;"> Constructor.</span>
<span style="color: grey;">///</span><span style="color: green;"> </span><span style="color: grey;"></summary></span>
<span style="color: blue;">public</span> MainViewModel()
{
People = <span style="color: blue;">new</span> <span style="color: #2b91af;">PeopleModel</span>
{
FirstName = <span style="color: #a31515;">"First name"</span>,
LastName = <span style="color: #a31515;">"Last name"</span>
};
}
<span style="color: blue;"> #endregion</span>
<span style="color: blue;"> #region</span> Properties
<span style="color: grey;">///</span><span style="color: green;"> </span><span style="color: grey;"><summary></span>
<span style="color: grey;">///</span><span style="color: green;"> Get or set people.</span>
<span style="color: grey;">///</span><span style="color: green;"> </span><span style="color: grey;"></summary></span>
<span style="color: blue;">public</span> <span style="color: #2b91af;">PeopleModel</span> People { <span style="color: blue;">get</span>; <span style="color: blue;">set</span>; }
<span style="color: blue;"> #endregion</span>
<span style="color: blue;"> #region</span> Commands
<span style="color: grey;">///</span><span style="color: green;"> </span><span style="color: grey;"><summary></span>
<span style="color: grey;">///</span><span style="color: green;"> Get or set ClickCommand.</span>
<span style="color: grey;">///</span><span style="color: green;"> </span><span style="color: grey;"></summary></span>
<span style="color: blue;">public</span> <span style="color: #2b91af;">ICommand</span> ClickCommand { <span style="color: blue;">get</span>; <span style="color: blue;">set</span>; }
<span style="color: blue;"> #endregion</span>
<span style="color: blue;"> #region</span> Methods
<span style="color: grey;">///</span><span style="color: green;"> </span><span style="color: grey;"><summary></span>
<span style="color: grey;">///</span><span style="color: green;"> Click method.</span>
<span style="color: grey;">///</span><span style="color: green;"> </span><span style="color: grey;"></summary></span>
<span style="color: blue;">private</span> <span style="color: blue;">void</span> ClickMethod()
{
<span style="color: #2b91af;">MessageBox</span>.Show(<span style="color: #a31515;">"This is click command."</span>);
}
<span style="color: blue;"> #endregion</span>
}
}</pre>
<br />
<br />
Для того, чтобы нам привязать метод к команде, необходимо создать класс, реализующий интерфейс <a href="http://msdn.microsoft.com/ru-ru/library/system.windows.input.icommand.aspx" target="_blank">ICommand</a>:<br />
<br />
<br />
<b><u>Command.cs</u></b><br />
<pre style="background-color: white; background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 13px;"><span style="color: blue;">using</span> System;
<span style="color: blue;">using</span> System.Windows.Input;
<span style="color: blue;">namespace</span> WpfApplication.ViewModel
{
<span style="color: blue;">public</span> <span style="color: blue;">class</span> <span style="color: #2b91af;">Command</span> : <span style="color: #2b91af;">ICommand</span>
{
<span style="color: blue;"> #region</span> Constructor
<span style="color: blue;">public</span> Command(<span style="color: #2b91af;">Action</span><<span style="color: blue;">object</span>> action)
{
ExecuteDelegate = action;
}
<span style="color: blue;"> #endregion</span>
<span style="color: blue;"> #region</span> Properties
<span style="color: blue;">public</span> <span style="color: #2b91af;">Predicate</span><<span style="color: blue;">object</span>> CanExecuteDelegate { <span style="color: blue;">get</span>; <span style="color: blue;">set</span>; }
<span style="color: blue;">public</span> <span style="color: #2b91af;">Action</span><<span style="color: blue;">object</span>> ExecuteDelegate { <span style="color: blue;">get</span>; <span style="color: blue;">set</span>; }
<span style="color: blue;"> #endregion</span>
<span style="color: blue;"> #region</span> ICommand Members
<span style="color: blue;">public</span> <span style="color: blue;">bool</span> CanExecute(<span style="color: blue;">object</span> parameter)
{
<span style="color: blue;">if</span> (CanExecuteDelegate != <span style="color: blue;">null</span>)
{
<span style="color: blue;">return</span> CanExecuteDelegate(parameter);
}
<span style="color: blue;">return</span> <span style="color: blue;">true</span>;
}
<span style="color: blue;">public</span> <span style="color: blue;">event</span> <span style="color: #2b91af;">EventHandler</span> CanExecuteChanged
{
<span style="color: blue;">add</span> { <span style="color: #2b91af;">CommandManager</span>.RequerySuggested += <span style="color: blue;">value</span>; }
<span style="color: blue;">remove</span> { <span style="color: #2b91af;">CommandManager</span>.RequerySuggested -= <span style="color: blue;">value</span>; }
}
<span style="color: blue;">public</span> <span style="color: blue;">void</span> Execute(<span style="color: blue;">object</span> parameter)
{
<span style="color: blue;">if</span> (ExecuteDelegate != <span style="color: blue;">null</span>)
{
ExecuteDelegate(parameter);
}
}
<span style="color: blue;"> #endregion</span>
}
}
</pre>
<br />
<br />
<img border="0" src="http://lh5.ggpht.com/-5wHXKbHm50g/Tuxo85FFOjI/AAAAAAAAAKs/eM7ejfx6E70/image_thumb17.png?imgmax=800" /><br />
<br />
Суть этого класса в следующем. Когда мы нажимаем кнопку на форме, происходит попытка вызова метода Execute интерфейса ICommand. Поэтому мы должны сделать так, чтобы при вызове этого метода, внутри него происходил вызов нашего метода через делегат, который мы передаем в конструкторе класса. При необходимости этот класс легко расширить и сделать вызов любого количества пользовательских методов при срабатывании команды.</div>
<div align="justify">
<br />
Теперь в конструкторе MainViewModel привяжем метод к команде:<br />
<br />
<br />
<b><u>MainWindowViewModel.cs</u></b><br />
<div class="csharpcode">
<pre class="alt"><pre><pre style="background-color: white; font-family: Consolas; font-size: 13px;"><span style="color: blue;">#region</span> Constructor
<span style="color: grey;">///</span><span style="color: green;"> </span><span style="color: grey;"><summary></span>
<span style="color: grey;">///</span><span style="color: green;"> Constructor.</span>
<span style="color: grey;">///</span><span style="color: green;"> </span><span style="color: grey;"></summary></span>
<span style="color: blue;">public</span> MainViewModel()
{
ClickCommand = <span style="color: blue;">new</span> <span style="color: #2b91af;">Command</span>(arg => ClickMethod());
People = <span style="color: blue;">new</span> <span style="color: #2b91af;">PeopleModel</span>
{
FirstName = <span style="color: #a31515;">"First name"</span>,
LastName = <span style="color: #a31515;">"Last name"</span>
};
}
<span style="color: blue;">#endregion</span><span style="background-color: transparent; text-align: left;"> </span></pre>
</pre>
</pre>
</div>
</div>
Теперь нам осталось привязать нашу команду к кнопке.<br />
<b><u><br /></u></b>
<b><u><br /></u></b>
<b><u>MainWindowView.xaml</u></b><br />
<div class="csharpcode">
<pre class="alt"><pre><span style="background-color: white; color: blue; font-family: Consolas; font-size: 13px;"><</span><span style="background-color: white; color: #a31515; font-family: Consolas; font-size: 13px;">Button</span><span style="background-color: white; color: red; font-family: Consolas; font-size: 13px;"> Content</span><span style="background-color: white; color: blue; font-family: Consolas; font-size: 13px;">=</span><span style="background-color: white; color: blue; font-family: Consolas; font-size: 13px;">"Click me"</span><span style="background-color: white; color: red; font-family: Consolas; font-size: 13px;"> HorizontalAlignment</span><span style="background-color: white; color: blue; font-family: Consolas; font-size: 13px;">=</span><span style="background-color: white; color: blue; font-family: Consolas; font-size: 13px;">"Left"</span><span style="background-color: white; color: red; font-family: Consolas; font-size: 13px;"> Margin</span><span style="background-color: white; color: blue; font-family: Consolas; font-size: 13px;">=</span><span style="background-color: white; color: blue; font-family: Consolas; font-size: 13px;">"291,97,0,0"</span><span style="background-color: white; color: red; font-family: Consolas; font-size: 13px;"> </span><span style="background-color: white; color: red; font-family: Consolas; font-size: 13px; text-align: left;">VerticalAlignment</span><span style="background-color: white; color: blue; font-family: Consolas; font-size: 13px; text-align: left;">=</span><span style="background-color: white; color: blue; font-family: Consolas; font-size: 13px; text-align: left;">"Top"</span><span style="background-color: white; color: red; font-family: Consolas; font-size: 13px; text-align: left;"> Width</span><span style="background-color: white; color: blue; font-family: Consolas; font-size: 13px; text-align: left;">=</span><span style="background-color: white; color: blue; font-family: Consolas; font-size: 13px; text-align: left;">"75"</span><span style="background-color: white; font-family: Consolas; font-size: 13px; text-align: left;"> </span><span style="background-color: white; color: red; font-family: Consolas; font-size: 13px; text-align: left;">Command</span><span style="background-color: white; color: blue; font-family: Consolas; font-size: 13px; text-align: left;">="{</span><span style="background-color: white; color: #a31515; font-family: Consolas; font-size: 13px; text-align: left;">Binding</span><span style="background-color: white; color: red; font-family: Consolas; font-size: 13px; text-align: left;"> ClickCommand</span><span style="background-color: white; color: blue; font-family: Consolas; font-size: 13px; text-align: left;">}</span><span style="background-color: white; color: blue; font-family: Consolas; font-size: 13px; text-align: left;">"</span><span style="background-color: white; color: blue; font-family: Consolas; font-size: 13px; text-align: left;">/></span>
</pre>
</pre>
</div>
<br />
И можно проверить, что все это работает.<br />
<br />
<pre><img border="0" src="http://lh4.ggpht.com/-lc_j538u8_E/Tuxo-eESdmI/AAAAAAAAALA/2Rzelb4O8aY/image_thumb20.png?imgmax=800" /></pre>
<br />
Если нам необходимо, изменять значения свойств в коде. И, при этом, форма должна автоматически обновляться. То модель, значения свойств которой должны автоматически обноляться на форме, надо немного модернезировать.<br />
<br />
Для этого эта модель должна реализовывать интерфейс <span style="background-color: white; color: #2b91af; font-family: Consolas; font-size: 13px;"><a href="http://msdn.microsoft.com/ru-ru/library/system.componentmodel.inotifypropertychanged(v=vs.110).aspx" target="_blank">INotifyPropertyChanged</a></span><br />
<br />
Этот интерфейс описывает "механизм уведомления", всех привязанных к свойству "клиентов", о том, что значение свойства изменилось.<br />
<br />
Работает это следующим образом.<br />
<br />
Каждое свойство, при изменении его значения, должно "уведомлять" всех "клиентов" о том, что его значение изменилось. А "клиенты", в свою очередь, выполнять всю необходимую им логику, при обновлении "источника". Например, считать значение обновленного свойства и вывести это значение на форму.<br />
<br />
Это "уведомление" происходит через вызов метода <span style="background-color: white; font-family: Consolas; font-size: 13px;">OnPropertyChanged</span> реализация которого делает попытку вызова события <span style="background-color: white; font-family: Consolas; font-size: 13px;">PropertyChanged</span> на которое подписываются все "клиенты".<br />
<br />
Это событие и метод как раз описаны в интерфейсе <a href="http://msdn.microsoft.com/ru-ru/library/system.componentmodel.inotifypropertychanged(v=vs.110).aspx" style="font-family: Consolas; font-size: 13px;" target="_blank">INotifyPropertyChanged</a>.<br />
<br />
Реализация всего этого тут довольно простая:<br />
<br />
<br />
<b><u>PeopleModel.cs</u></b><br />
<pre style="background-color: white; background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 13px;"><span style="color: blue;">class</span> <span style="color: #2b91af;">PeopleModel</span> : <span style="color: #2b91af;">INotifyPropertyChanged</span>
{
<span style="color: blue;"> #region</span> Implement INotyfyPropertyChanged members
<span style="color: blue;">public</span> <span style="color: blue;">event</span> <span style="color: #2b91af;">PropertyChangedEventHandler</span> PropertyChanged;
<span style="color: blue;">protected</span> <span style="color: blue;">virtual</span> <span style="color: blue;">void</span> OnPropertyChanged(<span style="color: blue;">string</span> propertyName)
{
<span style="color: blue;">if</span> (PropertyChanged != <span style="color: blue;">null</span>)
{
PropertyChanged(<span style="color: blue;">this</span>, <span style="color: blue;">new</span> <span style="color: #2b91af;">PropertyChangedEventArgs</span>(propertyName));
}
}
<span style="color: blue;"> #endregion</span>
<span style="color: blue;"> #region</span> Fields
<span style="color: blue;">private</span> <span style="color: blue;">string</span> _FirstName;
<span style="color: blue;">private</span> <span style="color: blue;">string</span> _LastName;
<span style="color: blue;"> #endregion</span>
<span style="color: blue;"> #region</span> Properties
<span style="color: grey;">///</span><span style="color: green;"> </span><span style="color: grey;"><summary></span>
<span style="color: grey;">///</span><span style="color: green;"> Get or set first name.</span>
<span style="color: grey;">///</span><span style="color: green;"> </span><span style="color: grey;"></summary></span>
<span style="color: blue;">public</span> <span style="color: blue;">string</span> FirstName
{
<span style="color: blue;">get</span> { <span style="color: blue;">return</span> _FirstName; }
<span style="color: blue;">set</span>
{
<span style="color: blue;">if</span> (_FirstName != <span style="color: blue;">value</span>)
{
_FirstName = <span style="color: blue;">value</span>;
OnPropertyChanged(<span style="color: #a31515;">"FirstName"</span>);
}
}
}
<span style="color: grey;">///</span><span style="color: green;"> </span><span style="color: grey;"><summary></span>
<span style="color: grey;">///</span><span style="color: green;"> Get or set last name.</span>
<span style="color: grey;">///</span><span style="color: green;"> </span><span style="color: grey;"></summary></span>
<span style="color: blue;">public</span> <span style="color: blue;">string</span> LastName
{
<span style="color: blue;">get</span> { <span style="color: blue;">return</span> _LastName; }
<span style="color: blue;">set</span>
{
<span style="color: blue;">if</span> (_LastName != <span style="color: blue;">value</span>)
{
_LastName = <span style="color: blue;">value</span>;
OnPropertyChanged(<span style="color: #a31515;">"LastName"</span>);
}
}
}
<span style="color: blue;"> #endregion</span>
}</pre>
<br />
<br />
Собственно это самое минимальное, что нам нужно сделать, чтобы написать WPF приложение, следуя шаблону MVVM.<br />
<br />
На первый взгляд это кажется громоздким и не удобным, но в приложениях, где идет отображение и работа с большими объемами данных, это существенно упрощает код и снижает количество возможных ошибок, тк мы не занимаемся вопросами вывода данных, их считыванием и тд, а концентрируем наше внимание непосредственно на бизнес-логике разрабатываемого приложения. <br />
<br />
У нас появляется возможность не перезагружая форму, а всего лишь заменой DataContext’а менять выводимые на форму данные. И много чего еще. <br />
<br />
Лично у меня понимание всех преимуществ этого шаблона пришли не сразу, а с получением определенного опыта разработки с его использованием. Поэтому не спешите делать выводы. Почитайте еще, попишите на нем и вам станет ясно, – нравится или нет.
<br />
<div align="justify">
<br /></div>
<div align="justify">
<b>Исходники примеров:</b><br />
<div style="text-align: center;">
<div style="text-align: left;">
<a href="https://skydrive.live.com/redir?resid=F5F7D3920D872F46!183" target="_blank">WpfApplication</a></div>
<div style="text-align: left;">
<a href="https://skydrive.live.com/redir?resid=F5F7D3920D872F46!183" target="_blank">WpfApplication with editing TextBoxes</a></div>
</div>
</div>
</div>
Святослав Панкратовhttp://www.blogger.com/profile/13039405381364404095noreply@blogger.com46tag:blogger.com,1999:blog-4678276506533150023.post-80631879144032763622011-10-13T14:39:00.001+04:002011-10-13T14:40:55.710+04:00Решение проблемы падения Microsoft Power Point 2010 после открытия презентации перенесенной из Apple iPad Keynote.<p align="justify">Столкнулся на днях с такой неприятной штукой. Нарисовал презентацию на своем iPad и решил перенести ее на свой ноутбук, на котором стоит Microsoft Windows 7 и Office 2010. Экспортировал на iPad свое творение в формат Power Point, скинул на ноутбук. Все открылось хорошо. Но на этом вся прелесть закончилась.</p> <a name='more'></a> <p align="justify">Как только я выделял на ней какой-либо объект, Power Point падал с ошибкой и закрывался. Это было очень неприятно и делало работу над презентацией просто не возможной. Я долго не мог понять в чем же дело, пока не заметил, что Power Point падает только тогда, когда выделенный объект содержит анимацию, а анимации в моей презентации было много.</p> <p align="justify">Так что решение таких неприятностей выглядит следующим образом:</p> <ol> <li>Убрать все анимации на iPad перед экспортом на ПК. <li>Аккуратно убрать все анимации на ПК после экспорта. <li>Не делать анимацию на iPad, а делать ее сразу в Power Point.</li></ol> Святослав Панкратовhttp://www.blogger.com/profile/13039405381364404095noreply@blogger.com0tag:blogger.com,1999:blog-4678276506533150023.post-43398202336863707692011-07-17T15:00:00.013+04:002011-07-17T16:20:49.990+04:00Директивы препроцессора C# – Условная компиляция кода.<div align="justify">Всем доброе утро, день, вечер, ночь!<br />
<br />
</div><div align="justify">Бывает встречаются случаи, когда Вам необходимо откомпилировать код так, чтобы для разных конфигураций одни участки кода компилировались, а другие – нет. Именно для этого и существуют в языке C# директивы препроцессора, которые позволяют управлять компиляцией кода. Вообще, такая “вещь” существует не только в языке C#, а почти во всех серьезных (промышленных) языках программирования. Об условиях компиляции в языке C# эта заметка и написана.</div><a name='more'></a><div align="justify"><br />
Если файлов проекта не много, то можно обойтись следующим способом:<br />
<br />
</div><div align="justify">Вначале нам надо задать все имена требуемых условий компиляции. Таким образом мы задаем имена только для того, чтобы в коде обозначить участки кода, которые должны будут компилироваться при активации требуемого определения. <br />
<br />
</div>Вот пример кода: <br />
<div class="csharpcode"><pre class="alt"><span class="lnum"> 1: </span><span class="preproc">#define</span> CompanyA</pre><pre><span class="lnum"> 2: </span><span class="rem">//#define CompanyB</span></pre><pre class="alt"><span class="lnum"> 3: </span> </pre><pre><span class="lnum"> 4: </span><span class="kwrd">using</span> System;</pre><pre class="alt"><span class="lnum"> 5: </span> </pre><pre><span class="lnum"> 6: </span><span class="kwrd">namespace</span> ConsoleApplication2</pre><pre class="alt"><span class="lnum"> 7: </span>{</pre><pre><span class="lnum"> 8: </span> <span class="kwrd">class</span> Program</pre><pre class="alt"><span class="lnum"> 9: </span> {</pre><pre><span class="lnum"> 10: </span> <span class="kwrd">static</span> <span class="kwrd">void</span> Main(<span class="kwrd">string</span>[] args)</pre><pre class="alt"><span class="lnum"> 11: </span> {</pre><pre><span class="lnum"> 12: </span> <span class="preproc">#if</span> CompanyA</pre><pre class="alt"><span class="lnum"> 13: </span> Console.WriteLine(<span class="str">"this is CompanyA cofiguration"</span>); </pre><pre><span class="lnum"> 14: </span> <span class="preproc">#endif</span></pre><pre class="alt"><span class="lnum"> 15: </span> </pre><pre><span class="lnum"> 16: </span> <span class="preproc">#if</span> CompanyB</pre><pre class="alt"><span class="lnum"> 17: </span> Console.WriteLine(<span class="str">"this is CompanyB cofiguration"</span>);</pre><pre><span class="lnum"> 18: </span> <span class="preproc">#endif</span></pre><pre class="alt"><span class="lnum"> 19: </span> </pre><pre><span class="lnum"> 20: </span> Console.Read();</pre><pre class="alt"><span class="lnum"> 21: </span> }</pre><pre><span class="lnum"> 22: </span> }</pre><pre class="alt"><span class="lnum"> 23: </span>}</pre></div><style type="text/css">
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
</style><br />
<div align="justify">В данном случае откомпилируется тока области, помеченные как #if CompanyA - #endif. Если необходимо откомпилировать области помеченные как #if CompanyB - #endif, необходимо закомментировать определение #define CompanyA и разкомментировать #define CompanyB.</div><div align="justify"><br />
</div><div align="justify">Если необходимо применить имя условия в рамках всего проекта, то в свойствах проекта укажите имя области в текстовом поле Conditional compilation symbols (Символы условной компиляции), расположенным на вкладке Build (Сборка) страницы Properys (Свойства) проекта:</div><br />
<a href="http://lh4.ggpht.com/-ZdR8jAijgQg/TiLAKAah-pI/AAAAAAAAAGc/0LLt5DFheSk/s1600-h/image%25255B21%25255D.png"><img alt="image" border="0" height="521" src="http://lh3.ggpht.com/-sBSJqFjGunY/TiLAN69RWGI/AAAAAAAAAGg/n9V554DZMd0/image_thumb%25255B19%25255D.png?imgmax=800" style="background-image: none; border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: block; float: none; margin-left: auto; margin-right: auto; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="image" width="504" /></a><br />
<div align="justify">Кстати, при подходе через указания имени условия в свойстве проекта, в коде имена через директивы <span class="preproc">#define определять не надо</span>.</div><br />
<div align="justify">Вот такими не сложными действиями, мы можем говорить компилятору, что компилировать надо, а что наоборот, он “видеть” не должен.<br />
<br />
<hr />Полезные ссылки:<br />
<ul><li><a href="http://msdn.microsoft.com/ru-ru/library/ed8yd1ha.aspx">msdn - Директивы препроцессора C#</a></li>
</ul></div>Святослав Панкратовhttp://www.blogger.com/profile/13039405381364404095noreply@blogger.com2tag:blogger.com,1999:blog-4678276506533150023.post-90479181936223597692011-05-31T11:02:00.003+04:002011-06-26T14:44:47.981+04:00Oracle VM VirtualBox и Microsoft Visual Studio 2010<div dir="ltr" style="text-align: left;" trbidi="on">Всем привет!<br />
<div align="justify">Была вчера необходимость поставить на виртуальной машине Visual Studio 2010. И, как оказалось, успешная установка этого продукта не гарантировала его нормальной работы.</div><a name='more'></a><br />
<div align="justify">Содержимое главного окна приложения не отрисовывается. Если поводить мышкой внутри окна, то можно заметить, что курсор меняет свой вид, то есть элементы внутри окна существуют, но их просто не видно, как и всего, что должно быть внутри окна.<br />
<br />
</div><div align="justify"> <a href="http://lh6.ggpht.com/-lafEpptWGrk/TeSSU7gqqcI/AAAAAAAAAFE/P96jG3hQ6qQ/s1600-h/2%25255B3%25255D.png"><img alt="2" border="0" height="310" src="http://lh4.ggpht.com/-RSQ65QUiBTQ/TeSSVnCN_gI/AAAAAAAAAFI/xk4ebdCMSGg/2_thumb%25255B1%25255D.png?imgmax=800" style="background-image: none; border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: block; float: none; margin-left: auto; margin-right: auto; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="2" width="504" /></a> </div><div align="justify"><br />
Мое видение данной проблемы следующее: </div><div align="justify">Последняя версия Visual Studio активно использует WPF, а он, как известно, сильно завязан на графике и ее аппаратной составляющей, со всеми вытекающими последствиями вместе с графическими драйверами и видео-адаптерами. А виртуальные машины, как нам известно, созданы не для работы с графическими приложениями, как следствие, имеем такую проблему. <br />
<br />
</div><div align="justify">Кстати, я проверил, и на Windows XP получил абсолютно такую-же картину. <br />
<br />
</div><div align="justify">Я уже думал, на VirtualBox Visual Studio 2010 не пашет. Но решил на последок для надежности провести еще один эксперимент. Он заключается в удалении установленного дополнения гостевой ОС и повторного запуска VS. <br />
<br />
</div><div align="justify">Это помогло. <br />
<br />
</div><div align="justify">Теперь мне хотелось уточнить, какое именно из устанавливаемых дополнений приводит к неработоспособности VS 2010. <br />
<br />
</div><div align="justify">Я установил только базовое дополнение, без поддержки ускорения 3D-графики. Запускаю VS…Работает.<br />
<br />
</div><div align="justify"><a href="http://lh4.ggpht.com/-JYVfwxVmHpI/TeSSXjP9psI/AAAAAAAAAFM/sRAG1ti0FRk/s1600-h/1%25255B16%25255D.png"><img alt="1" border="0" height="421" src="http://lh5.ggpht.com/-pLXKBbKTYQo/TeSSa45F9aI/AAAAAAAAAFQ/hsElyuSFfjE/1_thumb%25255B14%25255D.png?imgmax=800" style="background-image: none; border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: block; float: none; margin-left: auto; margin-right: auto; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="1" width="504" /></a></div><div align="justify"><br />
Оказывается, все дело в дополнении гостевой ОС. А если конкретнее, то все дело в дополнении, которое делает возможным ускорение 3D-графики. Если его не ставить, то все прекрасно работает.<br />
<br />
</div><div align="justify">Не зря, всетаки, при установке дополнений, на против 3D в скобочках написано “Экспериментально”.<br />
<br />
</div><div align="justify">Вот такие дела =)</div></div>Святослав Панкратовhttp://www.blogger.com/profile/13039405381364404095noreply@blogger.com0tag:blogger.com,1999:blog-4678276506533150023.post-60367055699214932862011-04-29T00:13:00.007+04:002011-04-29T11:04:42.653+04:00Microsoft Community Contributor 2011<div dir="ltr" style="text-align: left;" trbidi="on">Мне очень приятно поделиться с вами следующей новостью.<br />
Сегодня ночью на мой E-mail пришло письмо. В нем было написано, что мой вклад в сообщества Microsoft был признан самой Microsoft. В письме так же содержалась информация о том, что мне присваивают статус Microsoft Community Contributor (MCC). <br />
Это был приятный для меня сюрприз.<br />
<img align="left" height="230" src="http://public.blu.livefilestore.com/y1pX7gJaSnsG3jrReyxvchqHicQ7gI4i92yrq1eyFd5dmCZYe3Wz5xsSWwDuIJ-WO27BmrfOqTaMDOBZJLUKZNx0Q/MCC11_Social-Media_Logo.jpg?psid=1" style="display: inline; float: left; margin: 10px;" width="230" /><br />
<strong>Что такое Microsoft Community Contributor?</strong><br />
Через Microsoft Community Contributor Award, Microsoft выражает свою благодарность лицам, которые тратят свое свободное время и энергию, чтобы помочь улучшить онлайновые технические сообщества Microsoft и делятся с другими своим опытом. <br />
Все больше и больше пользователей используют интернет-ресурсы для поиска идей и технологических решений для повышения их опыта. Microsoft помогает их клиентам найти ответы, тогда, когда им это надо через интернет-форумы, такие как TechNet, MSDN и Answers. <br />
Сегодня, порядка 4000000 людей получают ценную информацию через интернет-форумы Microsoft - и это число постоянно растет. <br />
Эти участники делают ресурсы Microsoft более ценными. Они помогают другим участникам, предлагая полезные ответы, переводя онлайн ресурсы на местные языки и выступая в качестве модераторов.</div>Святослав Панкратовhttp://www.blogger.com/profile/13039405381364404095noreply@blogger.com0tag:blogger.com,1999:blog-4678276506533150023.post-22184384001680496562011-03-14T14:19:00.020+03:002011-06-26T14:46:04.135+04:00Получение информации о базах данных из Microsoft SQL Server<div dir="ltr" style="text-align: left;" trbidi="on"><div dir="ltr" style="text-align: left;" trbidi="on"><div dir="ltr" style="text-align: left;" trbidi="on"><div dir="ltr" style="text-align: left;" trbidi="on"><div dir="ltr" style="text-align: left;" trbidi="on"><div dir="ltr" style="text-align: left;" trbidi="on"><div dir="ltr" style="text-align: left;" trbidi="on"><div dir="ltr" style="text-align: left;" trbidi="on">В этой статье я расскажу как можно из .NET-программы получить информацию о существующих базах данных на SQL Server.<br />
<a name='more'></a><br />
Первым делом надо подключиться к интересующему нас экземпляру сервера. Для этого создадим строку подключения. У меня она получилась такая:<br />
<br />
<pre style="background: white; color: black; font-family: Consolas; font-size: 13;"><span style="color: #2b91af;">SqlConnectionStringBuilder</span> conStr = <span style="color: blue;">new</span> <span style="color: #2b91af;">SqlConnectionStringBuilder</span>();
conStr.DataSource = <span style="color: #a31515;">@"SVAT-PC\SQLEXPRESS"<span class="Apple-style-span" style="color: black;">;</span></span>
conStr.IntegratedSecurity = <span style="color: blue;">true</span>;</pre><br />
Далее определим переменную строкового типа и запишем в нее наш запрос для получения списка всех существующих баз данных на сервере. После чего определим таблицу, в которую будет записан результат запроса.<br />
<br />
<pre style="background: white; color: black; font-family: Consolas; font-size: 13;"><span style="color: blue;">string</span> query = <span style="color: #a31515;">"SELECT name FROM sys.databases WHERE database_id > 4"</span>;
<span style="color: #2b91af;">DataTable</span> table = <span style="color: blue;">new</span> <span style="color: #2b91af;">DataTable</span>(<span style="color: #a31515;">"Dbs"</span>);</pre></div><br />
Далее выполним подключение к серверу и выполним наш запрос:<br />
<br />
<pre style="background: white; color: black; font-family: Consolas; font-size: 13;"><span style="color: blue;">using</span> (<span style="color: #2b91af;">SqlConnection</span> con = <span style="color: blue;">new</span> <span style="color: #2b91af;">SqlConnection</span>(conStr.ToString()))
{
con.Open();
<span style="color: #2b91af;">SqlDataAdapter</span> adapter = <span style="color: blue;">new</span> <span style="color: #2b91af;">SqlDataAdapter</span>(query, con);
adapter.Fill(table);
con.Close();</pre><pre style="background: white; color: black; font-family: Consolas; font-size: 13;">}</pre></div><br />
Теперь мы можем, пройдясь циклом по нашей таблице с результатом запроса и вытянуть из нее имена всех, существующих баз данных на интересующем нас сервере.<br />
<br />
<pre style="background: white; color: black; font-family: Consolas; font-size: 13;"><span style="color: #2b91af;">List</span><<span style="color: blue;">string</span>> list = <span style="color: blue;">new</span> <span style="color: #2b91af;">List</span><<span style="color: blue;">string</span>>();
<span style="color: blue;">for</span> (<span style="color: blue;">int</span> i = 0; i < table.Rows.Count; i++)
{
list.Add(table.Rows[i][0].ToString());
}</pre></div><br />
Весь метод целиком будет выглядеть следующим образом:<br />
<pre style="background: white; color: black; font-family: Consolas; font-size: 13;"><span style="color: grey;"> ///</span><span style="color: green;"> </span><span style="color: grey;"><summary></span>
<span style="color: grey;">///</span><span style="color: green;"> Получение списка БД.</span>
<span style="color: grey;">///</span><span style="color: green;"> </span><span style="color: grey;"></summary></span>
<span style="color: grey;">///</span><span style="color: green;"> </span><span style="color: grey;"><returns></span><span style="color: green;">Список БД, хранимых на сервере.</span><span style="color: grey;"></returns></span>
<span style="color: blue;">public</span> <span style="color: #2b91af;">List</span><<span style="color: blue;">string</span>> GetDbList()
{
<span style="color: blue;">try</span>
{
<span style="color: #2b91af;">SqlConnectionStringBuilder</span> conStr = <span style="color: blue;">new</span> <span style="color: #2b91af;">SqlConnectionStringBuilder</span>();
conStr.DataSource = <span class="Apple-style-span" style="color: #a31515;">@"SVAT-PC\SQLEXPRESS"</span>;
conStr.IntegratedSecurity = <span style="color: blue;">true</span>;
<span style="color: blue;">string</span> query = <span style="color: #a31515;">"SELECT name FROM sys.databases WHERE database_id > 4"</span>;
<span style="color: #2b91af;">DataTable</span> table = <span style="color: blue;">new</span> <span style="color: #2b91af;">DataTable</span>(<span style="color: #a31515;">"Dbs"</span>);
<span style="color: blue;">using</span> (<span style="color: #2b91af;">SqlConnection</span> con = <span style="color: blue;">new</span> <span style="color: #2b91af;">SqlConnection</span>(conStr.ToString()))
{
con.Open();
<span style="color: #2b91af;">SqlDataAdapter</span> adapter = <span style="color: blue;">new</span> <span style="color: #2b91af;">SqlDataAdapter</span>(query, con);
adapter.Fill(table);
con.Close();
}
<span style="color: #2b91af;">List</span><<span style="color: blue;">string</span>> list = <span style="color: blue;">new</span> <span style="color: #2b91af;">List</span><<span style="color: blue;">string</span>>();
<span style="color: blue;">for</span> (<span style="color: blue;">int</span> i = 0; i < table.Rows.Count; i++)
{
list.Add(table.Rows[i][0].ToString());
}
<span style="color: blue;">return</span> list;
}
<span style="color: blue;">catch</span> (<span style="color: #2b91af;">Exception</span> e)
{
<span style="color: blue;">return</span> <span style="color: blue;">null</span>;
}
}</pre></div>По такому же принципу мы теперь можем получить список всех таблиц из каждой полученной нами базы данных. Это легко сделать выполнив следующий запрос, применяя его к каждой базе данных из полученного нами списка.<br />
<br />
<pre style="background: white; color: black; font-family: Consolas; font-size: 13;"><span style="color: blue;">string</span> query = <span style="color: blue;">string</span>.Format(<span style="color: #a31515;">"USE {0};"</span>, DBname);
query += <span style="color: #a31515;">"select TABLE_NAME from INFORMATION_SCHEMA.TABLES where TABLE_TYPE = 'BASE TABLE' and TABLE_NAME != 'sysdiagrams'"</span>;</pre></div><br />
Целиком метод для получения структуры каждой базы данных будет выглядеть следующим образом:<br />
<br />
<pre style="background: white; color: black; font-family: Consolas; font-size: 13;"><span style="color: grey;"> ///</span><span style="color: green;"> </span><span style="color: grey;"><summary></span>
<span style="color: grey;">///</span><span style="color: green;"> Получить структуру БД.</span>
<span style="color: grey;">///</span><span style="color: green;"> </span><span style="color: grey;"></summary></span>
<span style="color: grey;">///</span><span style="color: green;"> </span><span style="color: grey;"><param name=</span><span style="color: grey;">"DBname"</span><span style="color: grey;">></span><span style="color: green;">Имя БД</span><span style="color: grey;"></param></span>
<span style="color: grey;">///</span><span style="color: green;"> </span><span style="color: grey;"><returns></span><span style="color: green;">Набор таблиц, описывающих БД.</span><span style="color: grey;"></returns></span>
<span style="color: blue;">public</span> <span style="color: #2b91af;">DataSet</span> GetDBStruct(<span style="color: blue;">string</span> DBname)
{
<span style="color: blue;">if</span> (DBname != <span style="color: blue;">null</span> && DBname != <span style="color: #a31515;">""</span>)
{
<span style="color: #2b91af;">DataSet</span> respond = <span style="color: blue;">new</span> <span style="color: #2b91af;">DataSet</span>(DBname);
<span style="color: blue;">try</span>
{
<span style="color: #2b91af;">SqlConnectionStringBuilder</span> conStr = <span style="color: blue;">new</span> <span style="color: #2b91af;">SqlConnectionStringBuilder</span>();
conStr.DataSource = ServiceName;
conStr.InitialCatalog = DBname;
conStr.IntegratedSecurity = <span style="color: blue;">true</span>;
<span style="color: blue;">string</span> query = <span style="color: blue;">string</span>.Format(<span style="color: #a31515;">"USE {0};"</span>, DBname);
query += <span style="color: #a31515;">"select TABLE_NAME from INFORMATION_SCHEMA.TABLES where TABLE_TYPE = 'BASE TABLE' and TABLE_NAME != 'sysdiagrams'"</span>;
<span style="color: #2b91af;">DataTable</span> tables = <span style="color: blue;">new</span> <span style="color: #2b91af;">DataTable</span>();
<span style="color: blue;">using</span> (<span style="color: #2b91af;">SqlConnection</span> con = <span style="color: blue;">new</span> <span style="color: #2b91af;">SqlConnection</span>(conStr.ToString()))
{
con.Open();
<span style="color: #2b91af;">SqlDataAdapter</span> adapter = <span style="color: blue;">new</span> <span style="color: #2b91af;">SqlDataAdapter</span>(query, con);
adapter.Fill(tables);
con.Close();
}
query = <span style="color: blue;">string</span>.Format(<span style="color: #a31515;">"USE {0};"</span>, DBname);
<span style="color: blue;">foreach</span> (<span style="color: #2b91af;">DataRow</span> row <span style="color: blue;">in</span> tables.Rows)
{
query += <span style="color: blue;">string</span>.Format(<span style="color: #a31515;">"select TABLE_NAME, COLUMN_NAME, ORDINAL_POSITION, DATA_TYPE, IS_NULLABLE, CHARACTER_MAXIMUM_LENGTH, CHARACTER_SET_NAME from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME = '{0}'; "</span>, row[<span style="color: #a31515;">"TABLE_NAME"</span>]);
}
<span style="color: blue;">using</span> (<span style="color: #2b91af;">SqlConnection</span> con = <span style="color: blue;">new</span> <span style="color: #2b91af;">SqlConnection</span>(conStr.ToString()))
{
con.Open();
<span style="color: #2b91af;">SqlDataAdapter</span> adapter = <span style="color: blue;">new</span> <span style="color: #2b91af;">SqlDataAdapter</span>(query, con);
adapter.Fill(respond);
con.Close();
}
<span style="color: blue;">return</span> respond;
}
<span style="color: blue;">catch</span> (<span style="color: #2b91af;">Exception</span> e)
{
<span style="color: blue;">return</span> <span style="color: blue;">null</span>;
}
}
<span style="color: blue;">return</span> <span style="color: blue;">null</span>;
}</pre><pre style="background: white; color: black; font-family: Consolas; font-size: 13;"></pre><pre style="background: white; color: black; font-family: Consolas; font-size: 13;"></pre><pre style="background: white; color: black; font-family: Consolas; font-size: 13;"></pre></div>Результатом метода будет заполненный DataSet с набором таблиц, в которых будет находиться информация о существующих в базе данных таблицах и информация о колонках.<br />
Так же есть способ получить информацию о конкретной таблице из интересующей базы данных. Выглядит это так:<br />
<pre style="background: white; color: black; font-family: Consolas; font-size: 13;"><span style="color: grey;"> ///</span><span style="color: green;"> </span><span style="color: grey;"><summary></span>
<span style="color: grey;">///</span><span style="color: green;"> Получение структуры таблицы.</span>
<span style="color: grey;">///</span><span style="color: green;"> </span><span style="color: grey;"></summary></span>
<span style="color: grey;">///</span><span style="color: green;"> </span><span style="color: grey;"><param name=</span><span style="color: grey;">"DbName"</span><span style="color: grey;">></span><span style="color: green;">Имя БД.</span><span style="color: grey;"></param></span>
<span style="color: grey;">///</span><span style="color: green;"> </span><span style="color: grey;"><param name=</span><span style="color: grey;">"TableName"</span><span style="color: grey;">></span><span style="color: green;">Имя таблицы.</span><span style="color: grey;"></param></span>
<span style="color: grey;">///</span><span style="color: green;"> </span><span style="color: grey;"><returns></span><span style="color: green;">Структура таблицы.</span><span style="color: grey;"></returns></span>
<span style="color: blue;">public</span> <span style="color: #2b91af;">DataSet</span> GetTableStruct(<span style="color: blue;">string</span> DbName, <span style="color: blue;">string</span> TableName)
{
<span style="color: blue;">try</span>
{
<span style="color: #2b91af;">SqlConnectionStringBuilder</span> conStr = <span style="color: blue;">new</span> <span style="color: #2b91af;">SqlConnectionStringBuilder</span>();
conStr.DataSource = <span class="Apple-style-span" style="color: #a31515;">@"SVAT-PC\SQLEXPRESS"</span>;
conStr.IntegratedSecurity = <span style="color: blue;">true</span>;
<span style="color: blue;">string</span> query = <span style="color: blue;">string</span>.Format(<span style="color: #a31515;">"USE {0};"</span>, DbName);
query += <span style="color: blue;">string</span>.Format(<span style="color: #a31515;">"select TABLE_NAME, COLUMN_NAME, DATA_TYPE, IS_NULLABLE, CHARACTER_MAXIMUM_LENGTH, CHARACTER_SET_NAME, ORDINAL_POSITION from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME = '{0}'"</span>, TableName);
<span style="color: #2b91af;">DataSet</span> table = <span style="color: blue;">new</span> <span style="color: #2b91af;">DataSet</span>(DbName + <span style="color: #a31515;">"/"</span> + TableName);
<span style="color: blue;">using</span> (<span style="color: #2b91af;">SqlConnection</span> con = <span style="color: blue;">new</span> <span style="color: #2b91af;">SqlConnection</span>(conStr.ToString()))
{
con.Open();
<span style="color: #2b91af;">SqlDataAdapter</span> adapter = <span style="color: blue;">new</span> <span style="color: #2b91af;">SqlDataAdapter</span>(query, con);
adapter.Fill(table);
con.Close();
}
<span style="color: blue;">return</span> table;
}
<span style="color: blue;">catch</span> (<span style="color: #2b91af;">Exception</span> e)
{
<span style="color: blue;">return</span> <span style="color: blue;">null</span>;
}
}</pre></div>Вот таким образом мы можем получить информацию о всех базах данных на сервере, а так же узнать какие таблицы входят в них и из каких столбцов они состоят.</div>Святослав Панкратовhttp://www.blogger.com/profile/13039405381364404095noreply@blogger.com0tag:blogger.com,1999:blog-4678276506533150023.post-9132205334731318192011-02-23T23:03:00.014+03:002011-06-26T14:46:56.935+04:00Перевод даты из БД TopSpeed в DataTime<div dir="ltr" style="text-align: left;" trbidi="on">Пришлось на днях работать с базой данных TopSpeed компании Clarion.<br />
Из первых впечатлений...<br />
Положительные:<br />
<br />
<ul style="text-align: left;"><li>высокая скорость работы.</li>
</ul><br />
<div>Отрицательные:</div><div><ul style="text-align: left;"><li>отсутствие odbc-драйвера для 64'х битной платформы (по крайней мере, мне их найти не удалось).</li>
<li>странный формат хранения даты.</li>
</ul><div>Собственно о переводе даты из базы данных TopSpeed в привычное человеку представление здесь речь и пойдет.</div><a name='more'></a><br />
</div><div><br />
</div><div>Дата в этой базе данных хранится в виде целого числа. В связи со странным представлением даты я, не долго думая, отправился читать Google, но ничего толкового не обнаружил...</div><div>На данном этапе я имел только число 68900 и знал лишь, что это 19 августа 1989 года. После относительно нудных экспериментов, я выяснил, что дата в TopSpeed начинается с 29 декабря 1800 года. Очень странно, но факт... Те есть, для человека - 29.12.1800, а для базы данных TopSpeed - 1. Соответственно, для человека - 1.1.1801. Для БД - 3. И так далее по такой же логике.</div><div><br />
</div><div>После этих экспериментов, у меня нарисовались два метода для двустороннего перевода даты. Из TopSpeed в DateTime и обратно. Думаю, код поможет сэкономить время и нервы.<br />
<br />
<pre style="font-family: consolas;"><span style="color: grey;"> ///</span><span style="color: green;"> </span><span style="color: grey;"><summary></span>
<span style="color: grey;">///</span><span style="color: green;"> Перевод даты из формата файла бд TopSpeed (tps) в формат DateTime.</span>
<span style="color: grey;">///</span><span style="color: green;"> </span><span style="color: grey;"></summary></span>
<span style="color: grey;">///</span><span style="color: green;"> </span><span style="color: grey;"><param name=</span><span style="color: grey;">"date"</span><span style="color: grey;">></span><span style="color: green;">Дата в формате целого числа из файла бд TopSpeed (tps).</span><span style="color: grey;"></param></span>
<span style="color: grey;">///</span><span style="color: green;"> </span><span style="color: grey;"><returns></span><span style="color: green;">Дата в формате DateTime.</span><span style="color: grey;"></returns></span>
<span style="color: blue;">private</span> <span style="color: blue;">static</span> <span style="color: #2b91af;">DateTime</span> TopSpeedDateToDateTime( <span style="color: blue;">int</span> date )
{
<span style="color: blue;">int</span> year = 1801;
<span style="color: blue;">int</span> month = 1;
<span style="color: blue;">int</span> day = 1;
<span style="color: blue;">int</span> dateTopSpeed = 3;
<span style="color: green;">// Вычисляем год</span>
<span style="color: blue;">for</span> ( ; dateTopSpeed < date; year++ )
{
<span style="color: #2b91af;">DateTime</span> d = <span style="color: blue;">new</span> <span style="color: #2b91af;">DateTime</span>( year, 12, 31 );
<span style="color: blue;">if</span> ( ( dateTopSpeed + d.DayOfYear ) > date )
{
<span style="color: blue;">break</span>;
}
dateTopSpeed += d.DayOfYear;
}
<span style="color: green;">// Вычисляем месяц</span>
<span style="color: blue;">for</span> ( ; dateTopSpeed < date; month++ )
{
<span style="color: blue;">if</span> ( ( dateTopSpeed + <span style="color: #2b91af;">DateTime</span>.DaysInMonth( year, month ) ) > date )
{
<span style="color: blue;">break</span>;
}
dateTopSpeed += <span style="color: #2b91af;">DateTime</span>.DaysInMonth( year, month );
}
<span style="color: green;">// Вычисляем день</span>
day = date - dateTopSpeed;
<span style="color: blue;">return</span> <span style="color: blue;">new</span> <span style="color: #2b91af;">DateTime</span>( year, month, day );
}
<span style="color: grey;">///</span><span style="color: green;"> </span><span style="color: grey;"><summary></span>
<span style="color: grey;">///</span><span style="color: green;"> Перевод даты из DateTime в формат даты бд TopSpeed (tps).</span>
<span style="color: grey;">///</span><span style="color: green;"> </span><span style="color: grey;"></summary></span>
<span style="color: grey;">///</span><span style="color: green;"> </span><span style="color: grey;"><param name=</span><span style="color: grey;">"date"</span><span style="color: grey;">></span><span style="color: green;">Дата в формате DateTime.</span><span style="color: grey;"></param></span>
<span style="color: grey;">///</span><span style="color: green;"> </span><span style="color: grey;"><returns></span><span style="color: green;">>Дата в формате целого числа из файла бд TopSpeed (tps).</span><span style="color: grey;"></returns></span>
<span style="color: blue;">private</span> <span style="color: blue;">static</span> <span style="color: blue;">int</span> DateTimeToTopSpeedDate( <span style="color: #2b91af;">DateTime</span> date )
{
<span style="color: blue;">int</span> year = 1801;
<span style="color: blue;">int</span> month = 1;
<span style="color: blue;">int</span> dateTopSpeed = 3;
<span style="color: green;">// Вычисляем год</span>
<span style="color: blue;">for</span> ( ; year < date.Year; year++ )
{
<span style="color: #2b91af;">DateTime</span> d = <span style="color: blue;">new</span> <span style="color: #2b91af;">DateTime</span>( year, 12, 31 );
dateTopSpeed += d.DayOfYear;
}
<span style="color: green;">// Вычисляем месяц</span>
<span style="color: blue;">for</span> ( ; month < date.Month; month++ )
{
dateTopSpeed += <span style="color: #2b91af;">DateTime</span>.DaysInMonth( year, month );
}
<span style="color: green;">// Вычисляем день</span>
dateTopSpeed += date.Day;
<span style="color: blue;">return</span> dateTopSpeed;
}</pre></div><div><pre style="font-family: consolas;"></pre><pre style="font-family: consolas;"></pre><pre style="font-family: consolas;"></pre></div></div>Святослав Панкратовhttp://www.blogger.com/profile/13039405381364404095noreply@blogger.com22tag:blogger.com,1999:blog-4678276506533150023.post-40697475404818243902011-01-30T14:50:00.023+03:002011-06-26T14:47:51.893+04:00Установка ODAC на Windows 7 x64<div dir="ltr" style="text-align: left;" trbidi="on"><div style="text-align: justify;"><div style="text-align: left;">На днях потребовалось установить Oracle Data Access Components (ODAC) на Windows 7 x64. Кажется на первый взгляд, что ничего такого сложного. А не тут то было. Проблем, в процессе установки, оказалась масса. Хочу поделиться с Вами какие проблемы возникали и как я их решал, в надежде сэкономить наше с вами драгоценное время, потратив его на решение поставленных перед нами задач.</div><a name='more'></a><br />
</div><div style="text-align: justify;"><div style="text-align: left;"><br />
</div></div><div style="text-align: justify;"><div style="text-align: left;">Во-первых, при попытке установить ODAC под Windows 7 x64 установочник от <a href="http://www.oracle.com/technetwork/database/windows/downloads/index-090165.html">64-bit Oracle 10g Release 2 ODAC 10.2.0.3 for Windows x64</a> попросту не запускается, выкидывая следующую ошибку:</div></div><div style="text-align: justify;"><div style="text-align: left;"><b>Java 2 platform Standard Edition binary has stopped working. Windows can check...</b></div></div><div style="text-align: justify;"><div style="text-align: left;">Даже переустановка Windows проблемы не решила.</div></div><div style="text-align: justify;"><div style="text-align: left;"><br />
</div></div><div style="text-align: justify;"><div style="text-align: left;">Во-вторых, если вы собираетесь писать Wcf-сервис с использованием ODAC, то WCF Test Client с ODAC x32 работать не будет. Например следующий код в консоли работает:</div></div><br />
<pre style="border-bottom-style: none; border-bottom-width: 0px; border-color: initial; border-color: initial; border-left-style: none; border-left-width: 0px; border-right-style: none; border-right-width: 0px; border-style: initial; border-top-style: none; border-top-width: 0px; border-width: initial; font-family: consolas; font-style: inherit; font-weight: inherit; list-style-type: none; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; text-decoration: none; word-wrap: break-word;"><span class="Apple-style-span" style="color: blue;"><span class="Apple-style-span" style="color: #333333; font-family: 'Segoe UI', 'Lucida Grande', Verdana, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 16px; white-space: normal;"><pre style="border-bottom-style: none; border-bottom-width: 0px; border-color: initial; border-color: initial; border-left-style: none; border-left-width: 0px; border-right-style: none; border-right-width: 0px; border-style: initial; border-top-style: none; border-top-width: 0px; border-width: initial; font-family: consolas; font-style: inherit; font-weight: inherit; list-style-type: none; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; text-decoration: none; word-wrap: break-word;"><span style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: blue; font-family: inherit; font-style: inherit; font-weight: inherit; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">static</span> <span style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: blue; font-family: inherit; font-style: inherit; font-weight: inherit; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">void</span> Main(<span style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: blue; font-family: inherit; font-style: inherit; font-weight: inherit; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">string</span>[] args)
{
<span style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: green; font-family: inherit; font-style: inherit; font-weight: inherit; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">//DATA SOURCE=XE;DBA PRIVILEGE=SYSDBA;USER ID=SYS</span>
<span style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #2b91af; font-family: inherit; font-style: inherit; font-weight: inherit; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">OracleConnectionStringBuilder</span> conStr = <span style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: blue; font-family: inherit; font-style: inherit; font-weight: inherit; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">new</span> <span style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #2b91af; font-family: inherit; font-style: inherit; font-weight: inherit; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">OracleConnectionStringBuilder</span>();
conStr.DataSource = <span class="Apple-style-span" style="color: #a31515;">"XE"</span>;
conStr.DBAPrivilege = <span style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #a31515; font-family: inherit; font-style: inherit; font-weight: inherit; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">"SYSDBA"</span>;
conStr.UserID = <span style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #a31515; font-family: inherit; font-style: inherit; font-weight: inherit; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">"SYS"</span>;
conStr.Password = <span style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #a31515; font-family: inherit; font-style: inherit; font-weight: inherit; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">"12345"</span>;
<span style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: blue; font-family: inherit; font-style: inherit; font-weight: inherit; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">string</span> ver = <span style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #a31515; font-family: inherit; font-style: inherit; font-weight: inherit; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">""</span>;
<span style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: blue; font-family: inherit; font-style: inherit; font-weight: inherit; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">using</span> (<span style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #2b91af; font-family: inherit; font-style: inherit; font-weight: inherit; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">OracleConnection</span> con = <span style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: blue; font-family: inherit; font-style: inherit; font-weight: inherit; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">new</span> <span style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #2b91af; font-family: inherit; font-style: inherit; font-weight: inherit; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">OracleConnection</span>(conStr.ToString()))
{
con.Open();
ver = con.ServerVersion;
con.Close();
}
}</pre></span></span></pre><br />
<div style="text-align: justify;"><div style="text-align: left;">А если его перенести в Wcf-сервис, то все перестает работать. При вызове метода из сервиса через WCF Test Client выскакивает такая ошибка от WCF Test Client'а:</div></div><div style="text-align: justify;"><div style="text-align: left;"><b>Could not load file or assembly 'Oracle.DataAccess, Version=4.112.1.2, Culture=neutral, PublicKeyToken=89b483f429c47342' or one of its dependencies. Была сделана попытка загрузить программу, имеющую неверный формат.</b></div></div><div style="text-align: justify;"><div style="text-align: left;"><br />
</div></div><div style="text-align: justify;"><div style="text-align: left;">Замена битности конфигурации сервиса с x64 на x86 не поможет, сервис просто падает с сообщением от WCF Client Test:</div></div><div style="text-align: justify;"><div style="text-align: left;"><b>System.BadImageFormatException: Could not load file or assembly 'file:///C:\Users\Svat\Documents\Visual Studio 2010\Projects\СУРБД\Services\OracleServerWcfService\bin\Debug\OracleServerWcfService.dll' or one of its dependencies. Была сделана попытка загрузить программу, имеющую неверный формат.</b></div></div><div style="text-align: justify;"><div style="text-align: left;"><br />
</div></div><div style="text-align: justify;"><div style="text-align: left;">Если я запускаю WCF-сервис хоститься, например, в консольном приложении, в конфигурации которого выставлена компиляция под 32 бит то все будет работать. Более подробно проблема с ODAC x32 в 64-х битном WCF Test Client решена на форуме msdn: <a href="http://social.msdn.microsoft.com/Forums/ru-RU/fordesktopru/thread/a90ff1df-c054-4e4a-a192-d05616bee003">Не возможно загрузить сборку Oracle.DataAccess</a>.</div></div><div style="text-align: justify;"><div style="text-align: left;"><br />
</div></div><div style="text-align: justify;"><div style="text-align: left;">Долго копался в инете и долго ничего дельного найти не мог. Пока не наткнулся на эту страничку:</div></div><div style="text-align: justify;"><div style="text-align: left;"><a href="http://blog.zalab.net/2009/12/oracle-aspnet.html">Доступ к Oracle из ASP.NET</a>. Которая мне открыла глаза. Я долго не мог понять, почему последний ODAC (<a href="http://www.oracle.com/technetwork/database/windows/downloads/index-090165.html">64-bit ODAC 11.2 Release 3 (11.2.0.2.1) for Windows x64</a>) весил в 4 раза меньше чем предыдущий, но раз люди говорят, что все работает, то надо скачать и тоже попробовать поставить.</div></div><div style="text-align: justify;"><div style="text-align: left;"><br />
</div></div><div style="text-align: justify;"><div style="text-align: left;">Скачал. Немного почитал мануал по установке. Все написано доходчиво и понятно, что не может не радовать. Установил. Все встало с первой попытки. Единственный минус, это в Visual Studio надо ручками по полному пути к сборке выбрать ее, чтобы подключить к проекту.<br />
<br />
После установки так же надо добавить системную переменную окружения <span class="Apple-style-span" style="color: #333333; font-family: 'Segoe UI', 'Lucida Grande', Verdana, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 16px;">ORACLE_HOME </span>с указанием пути до папки клиента. А в папке клиента создать поддиректорию: <span class="Apple-style-span" style="color: #333333; font-family: 'Segoe UI', 'Lucida Grande', Verdana, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 16px;">\network\admin, </span>где должны располагаться конфигурационные файлы <span class="Apple-style-span" style="color: #333333; font-family: 'Segoe UI', 'Lucida Grande', Verdana, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 16px;">(sqlnet.ora, tnsnames.ora).</span></div></div><div style="text-align: justify;"><div style="text-align: left;"><br />
</div></div><div style="text-align: justify;"><div style="text-align: left;">Теперь дальше.</div></div><div style="text-align: justify;"><div style="text-align: left;"><br />
</div></div><div style="text-align: justify;"><div style="text-align: left;">Сборка, это конечно хорошо, но хотелось бы иметь полный доступ к Oracle из Visual Studio. Для этого необходимо установить <a href="http://www.oracle.com/technetwork/topics/dotnet/utilsoft-086879.html">Oracle Developer Tools for Visual Studio</a>. Из тех, что я нашел, все последние версии шли в комплекте с ODAC x32. принципе ничего плохого в этом нету. Будет возможность привычными способами добавить ссылку в проекте на x32 сборку для подключения к Oracle. Плюс инструменты для работы с Oracle прямо из интерфейса самой Visual Studio. Смело скачал и стал устанавливать. И на 94% установки вылетела ошибка. Если честно, то все эти ошибки меня стали на тот момент уже очень сильно раздражать. Текст ошибки выглядел следующим образом:</div></div><div style="text-align: justify;"><div style="text-align: left;"><b>OLE initialization or OCX load error while registering OCX.</b></div></div><div style="text-align: justify;"><div style="text-align: left;"><br />
</div></div><div style="text-align: justify;"><div style="text-align: left;">После долгих попыток высоконаучного тыка все же удалось установить этот пакет. Проблема оказалась в русских словах и символах в пути установки, убрав которые пакет полностью успешно был установлен.</div></div><div style="text-align: justify;"><div style="text-align: left;"><br />
</div></div><div style="text-align: justify;"><div style="text-align: left;">Теперь, наконец-то, после долгой нервотрепки, все было успешно установлено. Впринципе, это все, что требуется для успешной работы с Oracle из своего приложения или из интерфейса Visual Studio.</div></div><div style="text-align: justify;"><div style="text-align: left;"><br />
</div></div><div style="text-align: justify;"><div style="text-align: left;">Очень надеюсь, что статья поможет многим сберечь свое ценное время.</div><div style="text-align: left;"><br />
</div><div style="text-align: left;"><a href="http://www.oracle.com/technetwork/issue-archive/2008/08-nov/o68odpnet-101744.html">Полезная статья по развертке приложений с сайта Oracle.</a></div></div></div>Святослав Панкратовhttp://www.blogger.com/profile/13039405381364404095noreply@blogger.com4tag:blogger.com,1999:blog-4678276506533150023.post-17029397543997101572011-01-14T03:30:00.003+03:002011-01-14T04:05:18.959+03:00National Geographic: Взгляд изнутри: Google<iframe src="http://vkontakte.ru/video_ext.php?oid=84518523&id=158597132&hash=e65a35b6d3a0c274&hd=1" width="480" height="360" frameborder="0"></iframe>Святослав Панкратовhttp://www.blogger.com/profile/13039405381364404095noreply@blogger.com0tag:blogger.com,1999:blog-4678276506533150023.post-22659535075341030842011-01-12T11:12:00.000+03:002011-01-12T00:12:16.640+03:00Работа в Intel - Работа в Microsoft<a href="http://iomarket.com.ua/rabota-v-intel-rabota-v-microsoft/">http://iomarket.com.ua/rabota-v-intel-rabota-v-microsoft/</a>Святослав Панкратовhttp://www.blogger.com/profile/13039405381364404095noreply@blogger.com0tag:blogger.com,1999:blog-4678276506533150023.post-12944643075250473582011-01-11T19:42:00.003+03:002011-06-26T14:50:53.508+04:00Использование Unit-тестирования на примере Visual Studio.<div dir="ltr" style="text-align: left;" trbidi="on"><div class="MsoNormal" style="line-height: 12.0pt; margin-bottom: .0001pt; margin-bottom: 0cm; text-align: justify; text-indent: 1.0cm;"><span style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: #333333; font-size: 10pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;">Решил добавить небольшую практическую часть по созданию </span><span lang="EN-US" style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: #333333; font-size: 10pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;">Unit-</span><span style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: #333333; font-size: 10pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;">тестов</span><span style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: #333333; font-size: 10pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;"> </span><span style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: #333333; font-size: 10pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;">в</span><span lang="EN-US" style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: #333333; font-size: 10pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;"> Visual Studio. </span><span style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: #333333; font-size: 10pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;">Думаю, кто первый раз с этим сталкивается, информация очень даже поможет сэкономить время и быстренько реализовать простенькие юнит-тесты для своих методов в программе.</span><span style="color: #333333; font-size: 10pt;"><o:p></o:p></span></div><a name='more'></a><br />
<div class="MsoNormal" style="line-height: 12.0pt; margin-bottom: .0001pt; margin-bottom: 0cm; text-align: justify; text-indent: 1.0cm;"><span style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: #333333; font-size: 10pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;">Как уже было сказано <span style="color: #4e7dbf;"><a href="http://svyatoslavpankratov.blogspot.com/2011/01/blog-post_5250.html">выше</a></span>, модульное тестирование или юнит-тестирование — это процесс в программировании, позволяющий проверить на корректность отдельные модули исходного кода программы.</span><span style="color: #333333; font-size: 10pt;"><o:p></o:p></span><br />
<span style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: #333333; font-size: 10pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;"><br />
</span></div><div class="MsoNormal" style="line-height: 12.0pt; margin-bottom: .0001pt; margin-bottom: 0cm; text-align: justify; text-indent: 1.0cm;"><span style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: #333333; font-size: 10pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;">Идея состоит в том, чтобы писать тесты для каждой нетривиальной функции или метода. Это позволяет достаточно быстро проверить, не привело ли очередное изменение кода к регрессии, то есть к появлению ошибок в уже оттестированных местах программы, а также облегчает обнаружение и устранение таких ошибок.</span><span style="color: #333333; font-size: 10pt;"><o:p></o:p></span><br />
<span style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: #333333; font-size: 10pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;"><br />
</span></div><div class="MsoNormal" style="line-height: 12.0pt; margin-bottom: .0001pt; margin-bottom: 0cm; text-align: justify; text-indent: 1.0cm;"><span style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: #333333; font-size: 10pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;">Собственно для этого нам понадобится Visual Studio 2010 Professional или более «высокой» редакции и набор методов, который мы хотим проверить.</span><span style="color: #333333; font-size: 10pt;"><o:p></o:p></span><br />
<span style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: #333333; font-size: 10pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;"><br />
</span></div><div class="MsoNormal" style="line-height: 12.0pt; margin-bottom: .0001pt; margin-bottom: 0cm; text-align: justify; text-indent: 1.0cm;"><span style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: #333333; font-size: 10pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;">Начнем со следующего. Предположим у нас есть класс для работы с файловой системой:</span><span style="color: #333333; font-size: 10pt;"><o:p></o:p></span><br />
<span style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: #333333; font-size: 10pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;"><br />
</span></div><div class="MsoNormal" style="background: white; line-height: 12.0pt; margin-bottom: .0001pt; margin-bottom: 0cm; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt; text-align: justify;"><span style="color: blue; font-family: Consolas; font-size: 10pt;">using</span><span style="color: black; font-family: Consolas; font-size: 10pt;"> System;<br />
</span><span style="color: blue; font-family: Consolas; font-size: 10pt;">using</span><span style="color: black; font-family: Consolas; font-size: 10pt;"> System.Text;<br />
</span><span style="color: blue; font-family: Consolas; font-size: 10pt;">using</span><span style="color: black; font-family: Consolas; font-size: 10pt;"> System.IO;<br />
</span><span style="color: blue; font-family: Consolas; font-size: 10pt;">using</span><span style="color: black; font-family: Consolas; font-size: 10pt;"> System.Windows.Forms;<br />
<br />
</span><span style="color: blue; font-family: Consolas; font-size: 10pt;">namespace</span><span style="color: black; font-family: Consolas; font-size: 10pt;"> Drivers.FileManagement<br />
{<br />
</span><span style="color: grey; font-family: Consolas; font-size: 10pt;">///</span><span style="color: green; font-family: Consolas; font-size: 10pt;"> </span><span style="color: grey; font-family: Consolas; font-size: 10pt;"><summary></span><span style="color: black; font-family: Consolas; font-size: 10pt;"><br />
</span><span style="color: grey; font-family: Consolas; font-size: 10pt;">///</span><span style="color: green; font-family: Consolas; font-size: 10pt;"> Класс для работы с файлами и файловой системой.</span><span style="color: black; font-family: Consolas; font-size: 10pt;"><br />
</span><span style="color: grey; font-family: Consolas; font-size: 10pt;">///</span><span style="color: green; font-family: Consolas; font-size: 10pt;"> </span><span style="color: grey; font-family: Consolas; font-size: 10pt;"></summary></span><span style="color: black; font-family: Consolas; font-size: 10pt;"><br />
</span><span style="color: blue; font-family: Consolas; font-size: 10pt;">public</span><span style="color: black; font-family: Consolas; font-size: 10pt;"> </span><span style="color: blue; font-family: Consolas; font-size: 10pt;">static</span><span style="color: black; font-family: Consolas; font-size: 10pt;"> </span><span style="color: blue; font-family: Consolas; font-size: 10pt;">class</span><span style="color: black; font-family: Consolas; font-size: 10pt;"> </span><span style="color: #2b91af; font-family: Consolas; font-size: 10pt;">FileManagement</span><span style="color: black; font-family: Consolas; font-size: 10pt;"><br />
{<br />
</span><span style="color: grey; font-family: Consolas; font-size: 10pt;">///</span><span style="color: green; font-family: Consolas; font-size: 10pt;"> </span><span style="color: grey; font-family: Consolas; font-size: 10pt;"><summary></span><span style="color: black; font-family: Consolas; font-size: 10pt;"><br />
</span><span style="color: grey; font-family: Consolas; font-size: 10pt;">///</span><span style="color: green; font-family: Consolas; font-size: 10pt;"> Сканировать папку и получить все имена файлов в папке.</span><span style="color: black; font-family: Consolas; font-size: 10pt;"><br />
</span><span lang="EN-US" style="color: grey; font-family: Consolas; font-size: 10pt;">///</span><span lang="EN-US" style="color: green; font-family: Consolas; font-size: 10pt;"> </span><span lang="EN-US" style="color: grey; font-family: Consolas; font-size: 10pt;"></summary></span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"><br />
</span><span lang="EN-US" style="color: grey; font-family: Consolas; font-size: 10pt;">///</span><span lang="EN-US" style="color: green; font-family: Consolas; font-size: 10pt;"> </span><span lang="EN-US" style="color: grey; font-family: Consolas; font-size: 10pt;"><param name="path"></span><span style="color: green; font-family: Consolas; font-size: 10pt;">Путь</span><span lang="EN-US" style="color: green; font-family: Consolas; font-size: 10pt;"> </span><span style="color: green; font-family: Consolas; font-size: 10pt;">к</span><span lang="EN-US" style="color: green; font-family: Consolas; font-size: 10pt;"> </span><span style="color: green; font-family: Consolas; font-size: 10pt;">сканируемой</span><span lang="EN-US" style="color: green; font-family: Consolas; font-size: 10pt;"> </span><span style="color: green; font-family: Consolas; font-size: 10pt;">папке</span><span lang="EN-US" style="color: green; font-family: Consolas; font-size: 10pt;">.</span><span lang="EN-US" style="color: grey; font-family: Consolas; font-size: 10pt;"></param></span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"><br />
</span><span lang="EN-US" style="color: grey; font-family: Consolas; font-size: 10pt;">///</span><span lang="EN-US" style="color: green; font-family: Consolas; font-size: 10pt;"> </span><span lang="EN-US" style="color: grey; font-family: Consolas; font-size: 10pt;"><param name="type"></span><span style="color: green; font-family: Consolas; font-size: 10pt;">Тип</span><span lang="EN-US" style="color: green; font-family: Consolas; font-size: 10pt;"> </span><span style="color: green; font-family: Consolas; font-size: 10pt;">файтов</span><span lang="EN-US" style="color: green; font-family: Consolas; font-size: 10pt;">, </span><span style="color: green; font-family: Consolas; font-size: 10pt;">которые</span><span lang="EN-US" style="color: green; font-family: Consolas; font-size: 10pt;"> </span><span style="color: green; font-family: Consolas; font-size: 10pt;">нужно</span><span lang="EN-US" style="color: green; font-family: Consolas; font-size: 10pt;"> </span><span style="color: green; font-family: Consolas; font-size: 10pt;">выбрать</span><span lang="EN-US" style="color: green; font-family: Consolas; font-size: 10pt;">.</span><span lang="EN-US" style="color: grey; font-family: Consolas; font-size: 10pt;"></param></span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"><br />
</span><span lang="EN-US" style="color: grey; font-family: Consolas; font-size: 10pt;">///</span><span lang="EN-US" style="color: green; font-family: Consolas; font-size: 10pt;"> </span><span lang="EN-US" style="color: grey; font-family: Consolas; font-size: 10pt;"><returns></span><span style="color: green; font-family: Consolas; font-size: 10pt;">Массив</span><span lang="EN-US" style="color: green; font-family: Consolas; font-size: 10pt;"> </span><span style="color: green; font-family: Consolas; font-size: 10pt;">с</span><span lang="EN-US" style="color: green; font-family: Consolas; font-size: 10pt;"> </span><span style="color: green; font-family: Consolas; font-size: 10pt;">именами</span><span lang="EN-US" style="color: green; font-family: Consolas; font-size: 10pt;"> </span><span style="color: green; font-family: Consolas; font-size: 10pt;">файлов</span><span lang="EN-US" style="color: green; font-family: Consolas; font-size: 10pt;">, </span><span style="color: green; font-family: Consolas; font-size: 10pt;">найденных</span><span lang="EN-US" style="color: green; font-family: Consolas; font-size: 10pt;"> </span><span style="color: green; font-family: Consolas; font-size: 10pt;">в</span><span lang="EN-US" style="color: green; font-family: Consolas; font-size: 10pt;"> </span><span style="color: green; font-family: Consolas; font-size: 10pt;">папке</span><span lang="EN-US" style="color: green; font-family: Consolas; font-size: 10pt;">.</span><span lang="EN-US" style="color: grey; font-family: Consolas; font-size: 10pt;"></returns></span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"><br />
</span><span lang="EN-US" style="color: blue; font-family: Consolas; font-size: 10pt;">public</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"> </span><span lang="EN-US" style="color: blue; font-family: Consolas; font-size: 10pt;">static</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"> </span><span lang="EN-US" style="color: blue; font-family: Consolas; font-size: 10pt;">string</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;">[] GetFilesNameInDirectory(</span><span lang="EN-US" style="color: blue; font-family: Consolas; font-size: 10pt;">string</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"> path, </span><span lang="EN-US" style="color: blue; font-family: Consolas; font-size: 10pt;">string</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"> type)<br />
{<br />
</span><span lang="EN-US" style="color: #2b91af; font-family: Consolas; font-size: 10pt;">FileInfo</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;">[] filesInfo = (</span><span lang="EN-US" style="color: blue; font-family: Consolas; font-size: 10pt;">new</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"> </span><span lang="EN-US" style="color: #2b91af; font-family: Consolas; font-size: 10pt;">DirectoryInfo</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;">(path)).GetFiles(type);<br />
<br />
</span><span lang="EN-US" style="color: blue; font-family: Consolas; font-size: 10pt;">string</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;">[] files = </span><span lang="EN-US" style="color: blue; font-family: Consolas; font-size: 10pt;">new</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"> </span><span lang="EN-US" style="color: blue; font-family: Consolas; font-size: 10pt;">string</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;">[filesInfo.Length];<br />
<br />
</span><span lang="EN-US" style="color: blue; font-family: Consolas; font-size: 10pt;">for</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"> (</span><span lang="EN-US" style="color: blue; font-family: Consolas; font-size: 10pt;">int</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"> i = 0; i < filesInfo.Length; i++)<br />
{<br />
files[i] = filesInfo[i].Name.Substring(0, filesInfo[i].Name.Length - filesInfo[i].Extension.Length);<br />
}<br />
</span><span lang="EN-US" style="color: blue; font-family: Consolas; font-size: 10pt;">return</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"> files;<br />
}<br />
<br />
<br />
</span><span lang="EN-US" style="color: grey; font-family: Consolas; font-size: 10pt;">///</span><span lang="EN-US" style="color: green; font-family: Consolas; font-size: 10pt;"> </span><span lang="EN-US" style="color: grey; font-family: Consolas; font-size: 10pt;"><summary></span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"><br />
</span><span lang="EN-US" style="color: grey; font-family: Consolas; font-size: 10pt;">///</span><span lang="EN-US" style="color: green; font-family: Consolas; font-size: 10pt;"> </span><span style="color: green; font-family: Consolas; font-size: 10pt;">Создать</span><span lang="EN-US" style="color: green; font-family: Consolas; font-size: 10pt;"> </span><span style="color: green; font-family: Consolas; font-size: 10pt;">файл</span><span lang="EN-US" style="color: green; font-family: Consolas; font-size: 10pt;">.</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"><br />
</span><span lang="EN-US" style="color: grey; font-family: Consolas; font-size: 10pt;">///</span><span lang="EN-US" style="color: green; font-family: Consolas; font-size: 10pt;"> </span><span lang="EN-US" style="color: grey; font-family: Consolas; font-size: 10pt;"></summary></span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"><br />
</span><span lang="EN-US" style="color: grey; font-family: Consolas; font-size: 10pt;">///</span><span lang="EN-US" style="color: green; font-family: Consolas; font-size: 10pt;"> </span><span lang="EN-US" style="color: grey; font-family: Consolas; font-size: 10pt;"><param name="path"></span><span style="color: green; font-family: Consolas; font-size: 10pt;">Путь</span><span lang="EN-US" style="color: green; font-family: Consolas; font-size: 10pt;"> </span><span style="color: green; font-family: Consolas; font-size: 10pt;">к</span><span lang="EN-US" style="color: green; font-family: Consolas; font-size: 10pt;"> </span><span style="color: green; font-family: Consolas; font-size: 10pt;">файлу</span><span lang="EN-US" style="color: green; font-family: Consolas; font-size: 10pt;">.</span><span lang="EN-US" style="color: grey; font-family: Consolas; font-size: 10pt;"></param></span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"><br />
</span><span lang="EN-US" style="color: grey; font-family: Consolas; font-size: 10pt;">///</span><span lang="EN-US" style="color: green; font-family: Consolas; font-size: 10pt;"> </span><span lang="EN-US" style="color: grey; font-family: Consolas; font-size: 10pt;"><returns></span><span lang="EN-US" style="color: green; font-family: Consolas; font-size: 10pt;">true - </span><span style="color: green; font-family: Consolas; font-size: 10pt;">документ</span><span lang="EN-US" style="color: green; font-family: Consolas; font-size: 10pt;"> </span><span style="color: green; font-family: Consolas; font-size: 10pt;">успешно</span><span lang="EN-US" style="color: green; font-family: Consolas; font-size: 10pt;"> </span><span style="color: green; font-family: Consolas; font-size: 10pt;">создан</span><span lang="EN-US" style="color: green; font-family: Consolas; font-size: 10pt;">. false - </span><span style="color: green; font-family: Consolas; font-size: 10pt;">документ</span><span lang="EN-US" style="color: green; font-family: Consolas; font-size: 10pt;"> </span><span style="color: green; font-family: Consolas; font-size: 10pt;">создать</span><span lang="EN-US" style="color: green; font-family: Consolas; font-size: 10pt;"> </span><span style="color: green; font-family: Consolas; font-size: 10pt;">не</span><span lang="EN-US" style="color: green; font-family: Consolas; font-size: 10pt;"> </span><span style="color: green; font-family: Consolas; font-size: 10pt;">удалось</span><span lang="EN-US" style="color: green; font-family: Consolas; font-size: 10pt;">.</span><span lang="EN-US" style="color: grey; font-family: Consolas; font-size: 10pt;"></returns></span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"><br />
</span><span lang="EN-US" style="color: blue; font-family: Consolas; font-size: 10pt;">public</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"> </span><span lang="EN-US" style="color: blue; font-family: Consolas; font-size: 10pt;">static</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"> </span><span lang="EN-US" style="color: blue; font-family: Consolas; font-size: 10pt;">bool</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"> Create(</span><span lang="EN-US" style="color: blue; font-family: Consolas; font-size: 10pt;">string</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"> path)<br />
{<br />
</span><span lang="EN-US" style="color: #2b91af; font-family: Consolas; font-size: 10pt;">FileInfo</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"> info = </span><span lang="EN-US" style="color: blue; font-family: Consolas; font-size: 10pt;">new</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"> </span><span lang="EN-US" style="color: #2b91af; font-family: Consolas; font-size: 10pt;">FileInfo</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;">(path);<br />
<br />
</span><span lang="EN-US" style="color: blue; font-family: Consolas; font-size: 10pt;">if</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"> (info.Exists == </span><span lang="EN-US" style="color: blue; font-family: Consolas; font-size: 10pt;">false</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;">)<br />
{<br />
</span><span lang="EN-US" style="color: blue; font-family: Consolas; font-size: 10pt;">try</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"><br />
{<br />
</span><span lang="EN-US" style="color: #2b91af; font-family: Consolas; font-size: 10pt;">File</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;">.Create(path);<br />
</span><span lang="EN-US" style="color: blue; font-family: Consolas; font-size: 10pt;">return</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"> </span><span lang="EN-US" style="color: blue; font-family: Consolas; font-size: 10pt;">true</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;">;<br />
}<br />
</span><span lang="EN-US" style="color: blue; font-family: Consolas; font-size: 10pt;">catch</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"> (</span><span lang="EN-US" style="color: #2b91af; font-family: Consolas; font-size: 10pt;">Exception</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"> ex)<br />
{<br />
</span><span lang="EN-US" style="color: blue; font-family: Consolas; font-size: 10pt;">throw</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"> ex;<br />
}<br />
}<br />
</span><span lang="EN-US" style="color: blue; font-family: Consolas; font-size: 10pt;">else</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"><br />
{<br />
</span><span lang="EN-US" style="color: blue; font-family: Consolas; font-size: 10pt;">switch</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"> (</span><span lang="EN-US" style="color: #2b91af; font-family: Consolas; font-size: 10pt;">MessageBox</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;">.Show(</span><span lang="EN-US" style="color: #a31515; font-family: Consolas; font-size: 10pt;">"This file already exists. Do you want to delete the existing file and create a new?"</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;">,<br />
</span><span lang="EN-US" style="color: #a31515; font-family: Consolas; font-size: 10pt;">"Question"</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;">,<br />
</span><span lang="EN-US" style="color: #2b91af; font-family: Consolas; font-size: 10pt;">MessageBoxButtons</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;">.YesNo, </span><span lang="EN-US" style="color: #2b91af; font-family: Consolas; font-size: 10pt;">MessageBoxIcon</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;">.Question))<br />
{<br />
</span><span lang="EN-US" style="color: blue; font-family: Consolas; font-size: 10pt;">case</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"> </span><span lang="EN-US" style="color: #2b91af; font-family: Consolas; font-size: 10pt;">DialogResult</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;">.Yes:<br />
{<br />
</span><span lang="EN-US" style="color: blue; font-family: Consolas; font-size: 10pt;">try</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"><br />
{<br />
</span><span lang="EN-US" style="color: #2b91af; font-family: Consolas; font-size: 10pt;">File</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;">.Create(path);<br />
</span><span lang="EN-US" style="color: blue; font-family: Consolas; font-size: 10pt;">return</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"> </span><span lang="EN-US" style="color: blue; font-family: Consolas; font-size: 10pt;">true</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;">;<br />
}<br />
</span><span lang="EN-US" style="color: blue; font-family: Consolas; font-size: 10pt;">catch</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"> (</span><span lang="EN-US" style="color: #2b91af; font-family: Consolas; font-size: 10pt;">Exception</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"> ex)<br />
{<br />
</span><span lang="EN-US" style="color: blue; font-family: Consolas; font-size: 10pt;">throw</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"> ex;<br />
}<br />
};<br />
</span><span lang="EN-US" style="color: blue; font-family: Consolas; font-size: 10pt;">default</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;">:<br />
{<br />
} </span><span lang="EN-US" style="color: blue; font-family: Consolas; font-size: 10pt;">break</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;">;<br />
}<br />
}<br />
</span><span lang="EN-US" style="color: blue; font-family: Consolas; font-size: 10pt;">return</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"> </span><span lang="EN-US" style="color: blue; font-family: Consolas; font-size: 10pt;">false</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;">;<br />
}<br />
<br />
<br />
</span><span lang="EN-US" style="color: grey; font-family: Consolas; font-size: 10pt;">///</span><span lang="EN-US" style="color: green; font-family: Consolas; font-size: 10pt;"> </span><span lang="EN-US" style="color: grey; font-family: Consolas; font-size: 10pt;"><summary></span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"><br />
</span><span lang="EN-US" style="color: grey; font-family: Consolas; font-size: 10pt;">///</span><span lang="EN-US" style="color: green; font-family: Consolas; font-size: 10pt;"> </span><span style="color: green; font-family: Consolas; font-size: 10pt;">Прочитать</span><span lang="EN-US" style="color: green; font-family: Consolas; font-size: 10pt;"> </span><span style="color: green; font-family: Consolas; font-size: 10pt;">текст</span><span lang="EN-US" style="color: green; font-family: Consolas; font-size: 10pt;"> </span><span style="color: green; font-family: Consolas; font-size: 10pt;">из</span><span lang="EN-US" style="color: green; font-family: Consolas; font-size: 10pt;"> </span><span style="color: green; font-family: Consolas; font-size: 10pt;">файла</span><span lang="EN-US" style="color: green; font-family: Consolas; font-size: 10pt;">.</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"><br />
</span><span lang="EN-US" style="color: grey; font-family: Consolas; font-size: 10pt;">///</span><span lang="EN-US" style="color: green; font-family: Consolas; font-size: 10pt;"> </span><span lang="EN-US" style="color: grey; font-family: Consolas; font-size: 10pt;"></summary></span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"><br />
</span><span lang="EN-US" style="color: grey; font-family: Consolas; font-size: 10pt;">///</span><span lang="EN-US" style="color: green; font-family: Consolas; font-size: 10pt;"> </span><span lang="EN-US" style="color: grey; font-family: Consolas; font-size: 10pt;"><param name="path"></span><span style="color: green; font-family: Consolas; font-size: 10pt;">Путь</span><span lang="EN-US" style="color: green; font-family: Consolas; font-size: 10pt;"> </span><span style="color: green; font-family: Consolas; font-size: 10pt;">к</span><span lang="EN-US" style="color: green; font-family: Consolas; font-size: 10pt;"> </span><span style="color: green; font-family: Consolas; font-size: 10pt;">файлу</span><span lang="EN-US" style="color: green; font-family: Consolas; font-size: 10pt;">.</span><span lang="EN-US" style="color: grey; font-family: Consolas; font-size: 10pt;"></param></span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"><br />
</span><span lang="EN-US" style="color: grey; font-family: Consolas; font-size: 10pt;">///</span><span lang="EN-US" style="color: green; font-family: Consolas; font-size: 10pt;"> </span><span lang="EN-US" style="color: grey; font-family: Consolas; font-size: 10pt;"><returns></span><span style="color: green; font-family: Consolas; font-size: 10pt;">Массив</span><span lang="EN-US" style="color: green; font-family: Consolas; font-size: 10pt;"> </span><span style="color: green; font-family: Consolas; font-size: 10pt;">строк</span><span lang="EN-US" style="color: green; font-family: Consolas; font-size: 10pt;"> </span><span style="color: green; font-family: Consolas; font-size: 10pt;">из</span><span lang="EN-US" style="color: green; font-family: Consolas; font-size: 10pt;"> </span><span style="color: green; font-family: Consolas; font-size: 10pt;">файла</span><span lang="EN-US" style="color: green; font-family: Consolas; font-size: 10pt;">.</span><span lang="EN-US" style="color: grey; font-family: Consolas; font-size: 10pt;"></returns></span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"><br />
</span><span lang="EN-US" style="color: blue; font-family: Consolas; font-size: 10pt;">public</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"> </span><span lang="EN-US" style="color: blue; font-family: Consolas; font-size: 10pt;">static</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"> </span><span lang="EN-US" style="color: blue; font-family: Consolas; font-size: 10pt;">string</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;">[] ReadAllLinesFile(</span><span lang="EN-US" style="color: blue; font-family: Consolas; font-size: 10pt;">string</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"> path)<br />
{<br />
</span><span lang="EN-US" style="color: #2b91af; font-family: Consolas; font-size: 10pt;">FileInfo</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"> info = </span><span lang="EN-US" style="color: blue; font-family: Consolas; font-size: 10pt;">new</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"> </span><span lang="EN-US" style="color: #2b91af; font-family: Consolas; font-size: 10pt;">FileInfo</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;">(path);<br />
<br />
</span><span lang="EN-US" style="color: blue; font-family: Consolas; font-size: 10pt;">if</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"> (info.Exists == </span><span lang="EN-US" style="color: blue; font-family: Consolas; font-size: 10pt;">false</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;">)<br />
{<br />
</span><span lang="EN-US" style="color: blue; font-family: Consolas; font-size: 10pt;">throw</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"> </span><span lang="EN-US" style="color: blue; font-family: Consolas; font-size: 10pt;">new</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"> </span><span lang="EN-US" style="color: #2b91af; font-family: Consolas; font-size: 10pt;">Exception</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;">(</span><span lang="EN-US" style="color: #a31515; font-family: Consolas; font-size: 10pt;">"This file can not be read. It not exists.\nPath: "</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"> + path);<br />
}<br />
</span><span lang="EN-US" style="color: blue; font-family: Consolas; font-size: 10pt;">else</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"><br />
{<br />
</span><span lang="EN-US" style="color: blue; font-family: Consolas; font-size: 10pt;">try</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"><br />
{<br />
</span><span lang="EN-US" style="color: blue; font-family: Consolas; font-size: 10pt;">return</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"> </span><span lang="EN-US" style="color: #2b91af; font-family: Consolas; font-size: 10pt;">File</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;">.ReadAllLines(path, </span><span lang="EN-US" style="color: #2b91af; font-family: Consolas; font-size: 10pt;">Encoding</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;">.Default);<br />
}<br />
</span><span lang="EN-US" style="color: blue; font-family: Consolas; font-size: 10pt;">catch</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"> (</span><span lang="EN-US" style="color: #2b91af; font-family: Consolas; font-size: 10pt;">Exception</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"> ex)<br />
{<br />
</span><span lang="EN-US" style="color: blue; font-family: Consolas; font-size: 10pt;">throw</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"> ex;<br />
}<br />
}<br />
}<br />
<br />
<br />
</span><span lang="EN-US" style="color: grey; font-family: Consolas; font-size: 10pt;">///</span><span lang="EN-US" style="color: green; font-family: Consolas; font-size: 10pt;"> </span><span lang="EN-US" style="color: grey; font-family: Consolas; font-size: 10pt;"><summary></span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"><br />
</span><span lang="EN-US" style="color: grey; font-family: Consolas; font-size: 10pt;">///</span><span lang="EN-US" style="color: green; font-family: Consolas; font-size: 10pt;"> </span><span style="color: green; font-family: Consolas; font-size: 10pt;">Прочитать</span><span lang="EN-US" style="color: green; font-family: Consolas; font-size: 10pt;"> </span><span style="color: green; font-family: Consolas; font-size: 10pt;">текст</span><span lang="EN-US" style="color: green; font-family: Consolas; font-size: 10pt;"> </span><span style="color: green; font-family: Consolas; font-size: 10pt;">из</span><span lang="EN-US" style="color: green; font-family: Consolas; font-size: 10pt;"> </span><span style="color: green; font-family: Consolas; font-size: 10pt;">файла</span><span lang="EN-US" style="color: green; font-family: Consolas; font-size: 10pt;">.</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"><br />
</span><span lang="EN-US" style="color: grey; font-family: Consolas; font-size: 10pt;">///</span><span lang="EN-US" style="color: green; font-family: Consolas; font-size: 10pt;"> </span><span lang="EN-US" style="color: grey; font-family: Consolas; font-size: 10pt;"></summary></span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"><br />
</span><span lang="EN-US" style="color: grey; font-family: Consolas; font-size: 10pt;">///</span><span lang="EN-US" style="color: green; font-family: Consolas; font-size: 10pt;"> </span><span lang="EN-US" style="color: grey; font-family: Consolas; font-size: 10pt;"><param name="path"></span><span style="color: green; font-family: Consolas; font-size: 10pt;">Путь</span><span lang="EN-US" style="color: green; font-family: Consolas; font-size: 10pt;"> </span><span style="color: green; font-family: Consolas; font-size: 10pt;">к</span><span lang="EN-US" style="color: green; font-family: Consolas; font-size: 10pt;"> </span><span style="color: green; font-family: Consolas; font-size: 10pt;">файлу</span><span lang="EN-US" style="color: green; font-family: Consolas; font-size: 10pt;">.</span><span lang="EN-US" style="color: grey; font-family: Consolas; font-size: 10pt;"></param></span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"><br />
</span><span lang="EN-US" style="color: grey; font-family: Consolas; font-size: 10pt;">///</span><span lang="EN-US" style="color: green; font-family: Consolas; font-size: 10pt;"> </span><span lang="EN-US" style="color: grey; font-family: Consolas; font-size: 10pt;"><returns></span><span style="color: green; font-family: Consolas; font-size: 10pt;">Текст</span><span lang="EN-US" style="color: green; font-family: Consolas; font-size: 10pt;"> </span><span style="color: green; font-family: Consolas; font-size: 10pt;">из</span><span lang="EN-US" style="color: green; font-family: Consolas; font-size: 10pt;"> </span><span style="color: green; font-family: Consolas; font-size: 10pt;">файла</span><span lang="EN-US" style="color: green; font-family: Consolas; font-size: 10pt;"> </span><span style="color: green; font-family: Consolas; font-size: 10pt;">в</span><span lang="EN-US" style="color: green; font-family: Consolas; font-size: 10pt;"> </span><span style="color: green; font-family: Consolas; font-size: 10pt;">виде</span><span lang="EN-US" style="color: green; font-family: Consolas; font-size: 10pt;"> </span><span style="color: green; font-family: Consolas; font-size: 10pt;">строки</span><span lang="EN-US" style="color: green; font-family: Consolas; font-size: 10pt;">.</span><span lang="EN-US" style="color: grey; font-family: Consolas; font-size: 10pt;"></returns></span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"><br />
</span><span lang="EN-US" style="color: blue; font-family: Consolas; font-size: 10pt;">public</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"> </span><span lang="EN-US" style="color: blue; font-family: Consolas; font-size: 10pt;">static</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"> </span><span lang="EN-US" style="color: blue; font-family: Consolas; font-size: 10pt;">string</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"> ReadAllTextFile(</span><span lang="EN-US" style="color: blue; font-family: Consolas; font-size: 10pt;">string</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"> path)<br />
{<br />
</span><span lang="EN-US" style="color: #2b91af; font-family: Consolas; font-size: 10pt;">FileInfo</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"> info = </span><span lang="EN-US" style="color: blue; font-family: Consolas; font-size: 10pt;">new</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"> </span><span lang="EN-US" style="color: #2b91af; font-family: Consolas; font-size: 10pt;">FileInfo</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;">(path);<br />
<br />
</span><span lang="EN-US" style="color: blue; font-family: Consolas; font-size: 10pt;">if</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"> (info.Exists == </span><span lang="EN-US" style="color: blue; font-family: Consolas; font-size: 10pt;">false</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;">)<br />
{<br />
</span><span lang="EN-US" style="color: blue; font-family: Consolas; font-size: 10pt;">throw</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"> </span><span lang="EN-US" style="color: blue; font-family: Consolas; font-size: 10pt;">new</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"> </span><span lang="EN-US" style="color: #2b91af; font-family: Consolas; font-size: 10pt;">Exception</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;">(</span><span lang="EN-US" style="color: #a31515; font-family: Consolas; font-size: 10pt;">"This file can not be read. It not exists.\nPath: "</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"> + path);<br />
}<br />
</span><span lang="EN-US" style="color: blue; font-family: Consolas; font-size: 10pt;">else</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"><br />
{<br />
</span><span lang="EN-US" style="color: blue; font-family: Consolas; font-size: 10pt;">try</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"><br />
{<br />
</span><span lang="EN-US" style="color: blue; font-family: Consolas; font-size: 10pt;">return</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"> </span><span lang="EN-US" style="color: #2b91af; font-family: Consolas; font-size: 10pt;">File</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;">.ReadAllText(path, </span><span lang="EN-US" style="color: #2b91af; font-family: Consolas; font-size: 10pt;">Encoding</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;">.Default);<br />
}<br />
</span><span lang="EN-US" style="color: blue; font-family: Consolas; font-size: 10pt;">catch</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"> (</span><span lang="EN-US" style="color: #2b91af; font-family: Consolas; font-size: 10pt;">Exception</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"> ex)<br />
{<br />
</span><span lang="EN-US" style="color: blue; font-family: Consolas; font-size: 10pt;">throw</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"> ex;<br />
}<br />
}<br />
}<br />
<br />
<br />
</span><span lang="EN-US" style="color: grey; font-family: Consolas; font-size: 10pt;">///</span><span lang="EN-US" style="color: green; font-family: Consolas; font-size: 10pt;"> </span><span lang="EN-US" style="color: grey; font-family: Consolas; font-size: 10pt;"><summary></span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"><br />
</span><span lang="EN-US" style="color: grey; font-family: Consolas; font-size: 10pt;">///</span><span lang="EN-US" style="color: green; font-family: Consolas; font-size: 10pt;"> </span><span style="color: green; font-family: Consolas; font-size: 10pt;">Сохранить</span><span lang="EN-US" style="color: green; font-family: Consolas; font-size: 10pt;"> </span><span style="color: green; font-family: Consolas; font-size: 10pt;">текст</span><span lang="EN-US" style="color: green; font-family: Consolas; font-size: 10pt;"> </span><span style="color: green; font-family: Consolas; font-size: 10pt;">в</span><span lang="EN-US" style="color: green; font-family: Consolas; font-size: 10pt;"> </span><span style="color: green; font-family: Consolas; font-size: 10pt;">файл</span><span lang="EN-US" style="color: green; font-family: Consolas; font-size: 10pt;">.</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"><br />
</span><span lang="EN-US" style="color: grey; font-family: Consolas; font-size: 10pt;">///</span><span lang="EN-US" style="color: green; font-family: Consolas; font-size: 10pt;"> </span><span lang="EN-US" style="color: grey; font-family: Consolas; font-size: 10pt;"></summary></span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"><br />
</span><span lang="EN-US" style="color: grey; font-family: Consolas; font-size: 10pt;">///</span><span lang="EN-US" style="color: green; font-family: Consolas; font-size: 10pt;"> </span><span lang="EN-US" style="color: grey; font-family: Consolas; font-size: 10pt;"><param name="text"></span><span style="color: green; font-family: Consolas; font-size: 10pt;">Текст</span><span lang="EN-US" style="color: green; font-family: Consolas; font-size: 10pt;">, </span><span style="color: green; font-family: Consolas; font-size: 10pt;">который</span><span lang="EN-US" style="color: green; font-family: Consolas; font-size: 10pt;"> </span><span style="color: green; font-family: Consolas; font-size: 10pt;">нужно</span><span lang="EN-US" style="color: green; font-family: Consolas; font-size: 10pt;"> </span><span style="color: green; font-family: Consolas; font-size: 10pt;">сохранить</span><span lang="EN-US" style="color: green; font-family: Consolas; font-size: 10pt;"> </span><span style="color: green; font-family: Consolas; font-size: 10pt;">в</span><span lang="EN-US" style="color: green; font-family: Consolas; font-size: 10pt;"> </span><span style="color: green; font-family: Consolas; font-size: 10pt;">файл</span><span lang="EN-US" style="color: green; font-family: Consolas; font-size: 10pt;">.</span><span lang="EN-US" style="color: grey; font-family: Consolas; font-size: 10pt;"></param></span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"><br />
</span><span lang="EN-US" style="color: grey; font-family: Consolas; font-size: 10pt;">///</span><span lang="EN-US" style="color: green; font-family: Consolas; font-size: 10pt;"> </span><span lang="EN-US" style="color: grey; font-family: Consolas; font-size: 10pt;"><param name="path"></span><span style="color: green; font-family: Consolas; font-size: 10pt;">Путь</span><span lang="EN-US" style="color: green; font-family: Consolas; font-size: 10pt;"> </span><span style="color: green; font-family: Consolas; font-size: 10pt;">к</span><span lang="EN-US" style="color: green; font-family: Consolas; font-size: 10pt;"> </span><span style="color: green; font-family: Consolas; font-size: 10pt;">файлу</span><span lang="EN-US" style="color: green; font-family: Consolas; font-size: 10pt;">.</span><span lang="EN-US" style="color: grey; font-family: Consolas; font-size: 10pt;"></param></span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"><br />
</span><span lang="EN-US" style="color: grey; font-family: Consolas; font-size: 10pt;">///</span><span lang="EN-US" style="color: green; font-family: Consolas; font-size: 10pt;"> </span><span lang="EN-US" style="color: grey; font-family: Consolas; font-size: 10pt;"><param name="rewrite_question"></span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"><br />
</span><span lang="EN-US" style="color: grey; font-family: Consolas; font-size: 10pt;">///</span><span lang="EN-US" style="color: green; font-family: Consolas; font-size: 10pt;"> </span><span style="color: green; font-family: Consolas; font-size: 10pt;">Задавать</span><span lang="EN-US" style="color: green; font-family: Consolas; font-size: 10pt;"> </span><span style="color: green; font-family: Consolas; font-size: 10pt;">ли</span><span lang="EN-US" style="color: green; font-family: Consolas; font-size: 10pt;"> </span><span style="color: green; font-family: Consolas; font-size: 10pt;">вопрос</span><span lang="EN-US" style="color: green; font-family: Consolas; font-size: 10pt;"> </span><span style="color: green; font-family: Consolas; font-size: 10pt;">о</span><span lang="EN-US" style="color: green; font-family: Consolas; font-size: 10pt;"> </span><span style="color: green; font-family: Consolas; font-size: 10pt;">перезаписи</span><span lang="EN-US" style="color: green; font-family: Consolas; font-size: 10pt;"> </span><span style="color: green; font-family: Consolas; font-size: 10pt;">файла</span><span lang="EN-US" style="color: green; font-family: Consolas; font-size: 10pt;">.</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"><br />
</span><span style="color: grey; font-family: Consolas; font-size: 10pt;">///</span><span style="color: green; font-family: Consolas; font-size: 10pt;"> </span><span style="color: grey; font-family: Consolas; font-size: 10pt;"></param></span><span style="color: black; font-family: Consolas; font-size: 10pt;"><br />
</span><span style="color: grey; font-family: Consolas; font-size: 10pt;">///</span><span style="color: green; font-family: Consolas; font-size: 10pt;"> </span><span style="color: grey; font-family: Consolas; font-size: 10pt;"><returns></span><span style="color: black; font-family: Consolas; font-size: 10pt;"><br />
</span><span style="color: grey; font-family: Consolas; font-size: 10pt;">///</span><span style="color: green; font-family: Consolas; font-size: 10pt;"> true - текст успешно сохранен в файл.</span><span style="color: black; font-family: Consolas; font-size: 10pt;"><br />
</span><span style="color: grey; font-family: Consolas; font-size: 10pt;">///</span><span style="color: green; font-family: Consolas; font-size: 10pt;"> false - текст не удалось сохранить в файл.</span><span style="color: black; font-family: Consolas; font-size: 10pt;"><br />
</span><span lang="EN-US" style="color: grey; font-family: Consolas; font-size: 10pt;">///</span><span lang="EN-US" style="color: green; font-family: Consolas; font-size: 10pt;"> </span><span lang="EN-US" style="color: grey; font-family: Consolas; font-size: 10pt;"></returns></span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"><br />
</span><span lang="EN-US" style="color: blue; font-family: Consolas; font-size: 10pt;">public</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"> </span><span lang="EN-US" style="color: blue; font-family: Consolas; font-size: 10pt;">static</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"> </span><span lang="EN-US" style="color: blue; font-family: Consolas; font-size: 10pt;">bool</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"> SaveFile(</span><span lang="EN-US" style="color: blue; font-family: Consolas; font-size: 10pt;">string</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"> text, </span><span lang="EN-US" style="color: blue; font-family: Consolas; font-size: 10pt;">string</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"> path, </span><span lang="EN-US" style="color: blue; font-family: Consolas; font-size: 10pt;">bool</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"> rewrite_question)<br />
{<br />
</span><span lang="EN-US" style="color: blue; font-family: Consolas; font-size: 10pt;">if</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"> (rewrite_question == </span><span lang="EN-US" style="color: blue; font-family: Consolas; font-size: 10pt;">true</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;">)<br />
{<br />
</span><span lang="EN-US" style="color: #2b91af; font-family: Consolas; font-size: 10pt;">FileInfo</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"> info = </span><span lang="EN-US" style="color: blue; font-family: Consolas; font-size: 10pt;">new</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"> </span><span lang="EN-US" style="color: #2b91af; font-family: Consolas; font-size: 10pt;">FileInfo</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;">(path);<br />
<br />
</span><span lang="EN-US" style="color: blue; font-family: Consolas; font-size: 10pt;">if</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"> (info.Exists == </span><span lang="EN-US" style="color: blue; font-family: Consolas; font-size: 10pt;">false</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;">)<br />
{<br />
</span><span lang="EN-US" style="color: blue; font-family: Consolas; font-size: 10pt;">try</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"><br />
{<br />
</span><span lang="EN-US" style="color: #2b91af; font-family: Consolas; font-size: 10pt;">File</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;">.WriteAllText(path, text, </span><span lang="EN-US" style="color: #2b91af; font-family: Consolas; font-size: 10pt;">Encoding</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;">.Default);<br />
</span><span lang="EN-US" style="color: blue; font-family: Consolas; font-size: 10pt;">return</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"> </span><span lang="EN-US" style="color: blue; font-family: Consolas; font-size: 10pt;">true</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;">;<br />
}<br />
</span><span lang="EN-US" style="color: blue; font-family: Consolas; font-size: 10pt;">catch</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"> (</span><span lang="EN-US" style="color: #2b91af; font-family: Consolas; font-size: 10pt;">Exception</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"> ex)<br />
{<br />
</span><span lang="EN-US" style="color: blue; font-family: Consolas; font-size: 10pt;">throw</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"> ex;<br />
}<br />
}<br />
</span><span lang="EN-US" style="color: blue; font-family: Consolas; font-size: 10pt;">else</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"><br />
{<br />
</span><span lang="EN-US" style="color: blue; font-family: Consolas; font-size: 10pt;">switch</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"> (</span><span lang="EN-US" style="color: #2b91af; font-family: Consolas; font-size: 10pt;">MessageBox</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;">.Show(</span><span lang="EN-US" style="color: #a31515; font-family: Consolas; font-size: 10pt;">"This file already exists. Do you want to delete the existing file and create a new?"</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;">,<br />
</span><span lang="EN-US" style="color: #a31515; font-family: Consolas; font-size: 10pt;">"Question"</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;">,<br />
</span><span lang="EN-US" style="color: #2b91af; font-family: Consolas; font-size: 10pt;">MessageBoxButtons</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;">.YesNo, </span><span lang="EN-US" style="color: #2b91af; font-family: Consolas; font-size: 10pt;">MessageBoxIcon</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;">.Question))<br />
{<br />
</span><span lang="EN-US" style="color: blue; font-family: Consolas; font-size: 10pt;">case</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"> </span><span lang="EN-US" style="color: #2b91af; font-family: Consolas; font-size: 10pt;">DialogResult</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;">.Yes:<br />
{<br />
</span><span lang="EN-US" style="color: blue; font-family: Consolas; font-size: 10pt;">try</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"><br />
{<br />
</span><span lang="EN-US" style="color: #2b91af; font-family: Consolas; font-size: 10pt;">File</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;">.WriteAllText(path, text, </span><span lang="EN-US" style="color: #2b91af; font-family: Consolas; font-size: 10pt;">Encoding</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;">.Default);<br />
</span><span lang="EN-US" style="color: blue; font-family: Consolas; font-size: 10pt;">return</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"> </span><span lang="EN-US" style="color: blue; font-family: Consolas; font-size: 10pt;">true</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;">;<br />
}<br />
</span><span lang="EN-US" style="color: blue; font-family: Consolas; font-size: 10pt;">catch</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"> (</span><span lang="EN-US" style="color: #2b91af; font-family: Consolas; font-size: 10pt;">Exception</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"> ex)<br />
{<br />
</span><span lang="EN-US" style="color: blue; font-family: Consolas; font-size: 10pt;">throw</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"> ex;<br />
}<br />
};<br />
</span><span lang="EN-US" style="color: blue; font-family: Consolas; font-size: 10pt;">default</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;">:<br />
{<br />
} </span><span lang="EN-US" style="color: blue; font-family: Consolas; font-size: 10pt;">break</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;">;<br />
}<br />
}<br />
}<br />
</span><span lang="EN-US" style="color: blue; font-family: Consolas; font-size: 10pt;">else</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"><br />
{<br />
</span><span lang="EN-US" style="color: blue; font-family: Consolas; font-size: 10pt;">try</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"><br />
{<br />
</span><span lang="EN-US" style="color: #2b91af; font-family: Consolas; font-size: 10pt;">File</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;">.WriteAllText(path, text, </span><span lang="EN-US" style="color: #2b91af; font-family: Consolas; font-size: 10pt;">Encoding</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;">.Default);<br />
</span><span lang="EN-US" style="color: blue; font-family: Consolas; font-size: 10pt;">return</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"> </span><span lang="EN-US" style="color: blue; font-family: Consolas; font-size: 10pt;">true</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;">;<br />
}<br />
</span><span lang="EN-US" style="color: blue; font-family: Consolas; font-size: 10pt;">catch</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"> (</span><span lang="EN-US" style="color: #2b91af; font-family: Consolas; font-size: 10pt;">Exception</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"> ex)<br />
{<br />
</span><span lang="EN-US" style="color: blue; font-family: Consolas; font-size: 10pt;">throw</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"> ex;<br />
}<br />
}<br />
</span><span lang="EN-US" style="color: blue; font-family: Consolas; font-size: 10pt;">return</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"> </span><span lang="EN-US" style="color: blue; font-family: Consolas; font-size: 10pt;">false</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;">;<br />
}<br />
<br />
<br />
</span><span lang="EN-US" style="color: grey; font-family: Consolas; font-size: 10pt;">///</span><span lang="EN-US" style="color: green; font-family: Consolas; font-size: 10pt;"> </span><span lang="EN-US" style="color: grey; font-family: Consolas; font-size: 10pt;"><summary></span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"><br />
</span><span lang="EN-US" style="color: grey; font-family: Consolas; font-size: 10pt;">///</span><span lang="EN-US" style="color: green; font-family: Consolas; font-size: 10pt;"> </span><span style="color: green; font-family: Consolas; font-size: 10pt;">Копировать</span><span lang="EN-US" style="color: green; font-family: Consolas; font-size: 10pt;"> </span><span style="color: green; font-family: Consolas; font-size: 10pt;">файл</span><span lang="EN-US" style="color: green; font-family: Consolas; font-size: 10pt;">.</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"><br />
</span><span lang="EN-US" style="color: grey; font-family: Consolas; font-size: 10pt;">///</span><span lang="EN-US" style="color: green; font-family: Consolas; font-size: 10pt;"> </span><span lang="EN-US" style="color: grey; font-family: Consolas; font-size: 10pt;"></summary></span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"><br />
</span><span lang="EN-US" style="color: grey; font-family: Consolas; font-size: 10pt;">///</span><span lang="EN-US" style="color: green; font-family: Consolas; font-size: 10pt;"> </span><span lang="EN-US" style="color: grey; font-family: Consolas; font-size: 10pt;"><param name="source_file"></span><span style="color: green; font-family: Consolas; font-size: 10pt;">Путь</span><span lang="EN-US" style="color: green; font-family: Consolas; font-size: 10pt;"> </span><span style="color: green; font-family: Consolas; font-size: 10pt;">к</span><span lang="EN-US" style="color: green; font-family: Consolas; font-size: 10pt;"> </span><span style="color: green; font-family: Consolas; font-size: 10pt;">копируемому</span><span lang="EN-US" style="color: green; font-family: Consolas; font-size: 10pt;"> </span><span style="color: green; font-family: Consolas; font-size: 10pt;">файлу</span><span lang="EN-US" style="color: green; font-family: Consolas; font-size: 10pt;">.</span><span lang="EN-US" style="color: grey; font-family: Consolas; font-size: 10pt;"></param></span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"><br />
</span><span lang="EN-US" style="color: grey; font-family: Consolas; font-size: 10pt;">///</span><span lang="EN-US" style="color: green; font-family: Consolas; font-size: 10pt;"> </span><span lang="EN-US" style="color: grey; font-family: Consolas; font-size: 10pt;"><param name="new_file"></span><span style="color: green; font-family: Consolas; font-size: 10pt;">Путь</span><span lang="EN-US" style="color: green; font-family: Consolas; font-size: 10pt;">, </span><span style="color: green; font-family: Consolas; font-size: 10pt;">куда</span><span lang="EN-US" style="color: green; font-family: Consolas; font-size: 10pt;"> </span><span style="color: green; font-family: Consolas; font-size: 10pt;">следует</span><span lang="EN-US" style="color: green; font-family: Consolas; font-size: 10pt;"> </span><span style="color: green; font-family: Consolas; font-size: 10pt;">скопировать</span><span lang="EN-US" style="color: green; font-family: Consolas; font-size: 10pt;"> </span><span style="color: green; font-family: Consolas; font-size: 10pt;">файл</span><span lang="EN-US" style="color: green; font-family: Consolas; font-size: 10pt;">.</span><span lang="EN-US" style="color: grey; font-family: Consolas; font-size: 10pt;"></param></span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"><br />
</span><span lang="EN-US" style="color: grey; font-family: Consolas; font-size: 10pt;">///</span><span lang="EN-US" style="color: green; font-family: Consolas; font-size: 10pt;"> </span><span lang="EN-US" style="color: grey; font-family: Consolas; font-size: 10pt;"><returns></returns></span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"><br />
</span><span lang="EN-US" style="color: blue; font-family: Consolas; font-size: 10pt;">public</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"> </span><span lang="EN-US" style="color: blue; font-family: Consolas; font-size: 10pt;">static</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"> </span><span lang="EN-US" style="color: blue; font-family: Consolas; font-size: 10pt;">bool</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"> CopyFile(</span><span lang="EN-US" style="color: blue; font-family: Consolas; font-size: 10pt;">string</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"> source_file, </span><span lang="EN-US" style="color: blue; font-family: Consolas; font-size: 10pt;">string</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"> new_file)<br />
{<br />
</span><span lang="EN-US" style="color: #2b91af; font-family: Consolas; font-size: 10pt;">FileInfo</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"> s_f_info = </span><span lang="EN-US" style="color: blue; font-family: Consolas; font-size: 10pt;">new</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"> </span><span lang="EN-US" style="color: #2b91af; font-family: Consolas; font-size: 10pt;">FileInfo</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;">(source_file);<br />
<br />
</span><span lang="EN-US" style="color: blue; font-family: Consolas; font-size: 10pt;">if</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"> (s_f_info.Exists == </span><span lang="EN-US" style="color: blue; font-family: Consolas; font-size: 10pt;">false</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;">)<br />
{<br />
</span><span lang="EN-US" style="color: blue; font-family: Consolas; font-size: 10pt;">throw</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"> </span><span lang="EN-US" style="color: blue; font-family: Consolas; font-size: 10pt;">new</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"> </span><span lang="EN-US" style="color: #2b91af; font-family: Consolas; font-size: 10pt;">Exception</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;">(</span><span lang="EN-US" style="color: #a31515; font-family: Consolas; font-size: 10pt;">"This file can not be copy. It not exists.\nPath: "</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"> + source_file);<br />
}<br />
</span><span lang="EN-US" style="color: blue; font-family: Consolas; font-size: 10pt;">else</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"><br />
{<br />
</span><span lang="EN-US" style="color: #2b91af; font-family: Consolas; font-size: 10pt;">FileInfo</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"> n_f_info = </span><span lang="EN-US" style="color: blue; font-family: Consolas; font-size: 10pt;">new</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"> </span><span lang="EN-US" style="color: #2b91af; font-family: Consolas; font-size: 10pt;">FileInfo</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;">(new_file);<br />
<br />
</span><span lang="EN-US" style="color: blue; font-family: Consolas; font-size: 10pt;">if</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"> (n_f_info.Exists == </span><span lang="EN-US" style="color: blue; font-family: Consolas; font-size: 10pt;">true</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;">)<br />
{<br />
</span><span lang="EN-US" style="color: blue; font-family: Consolas; font-size: 10pt;">switch</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"> (</span><span lang="EN-US" style="color: #2b91af; font-family: Consolas; font-size: 10pt;">MessageBox</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;">.Show(</span><span lang="EN-US" style="color: #a31515; font-family: Consolas; font-size: 10pt;">"This file already exists. Do you want to delete the existing file and create a new?"</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;">,<br />
</span><span lang="EN-US" style="color: #a31515; font-family: Consolas; font-size: 10pt;">"Question"</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;">,<br />
</span><span lang="EN-US" style="color: #2b91af; font-family: Consolas; font-size: 10pt;">MessageBoxButtons</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;">.YesNo, </span><span lang="EN-US" style="color: #2b91af; font-family: Consolas; font-size: 10pt;">MessageBoxIcon</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;">.Question))<br />
{<br />
</span><span lang="EN-US" style="color: blue; font-family: Consolas; font-size: 10pt;">case</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"> </span><span lang="EN-US" style="color: #2b91af; font-family: Consolas; font-size: 10pt;">DialogResult</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;">.Yes:<br />
{<br />
</span><span lang="EN-US" style="color: blue; font-family: Consolas; font-size: 10pt;">try</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"><br />
{<br />
</span><span lang="EN-US" style="color: #2b91af; font-family: Consolas; font-size: 10pt;">File</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;">.Copy(source_file, new_file);<br />
</span><span lang="EN-US" style="color: blue; font-family: Consolas; font-size: 10pt;">return</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"> </span><span lang="EN-US" style="color: blue; font-family: Consolas; font-size: 10pt;">true</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;">;<br />
}<br />
</span><span lang="EN-US" style="color: blue; font-family: Consolas; font-size: 10pt;">catch</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"> (</span><span lang="EN-US" style="color: #2b91af; font-family: Consolas; font-size: 10pt;">Exception</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"> ex)<br />
{<br />
</span><span lang="EN-US" style="color: blue; font-family: Consolas; font-size: 10pt;">throw</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"> ex;<br />
}<br />
};<br />
</span><span lang="EN-US" style="color: blue; font-family: Consolas; font-size: 10pt;">default</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;">:<br />
{<br />
} </span><span lang="EN-US" style="color: blue; font-family: Consolas; font-size: 10pt;">break</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;">;<br />
}<br />
}<br />
</span><span lang="EN-US" style="color: blue; font-family: Consolas; font-size: 10pt;">else</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"><br />
{<br />
</span><span lang="EN-US" style="color: blue; font-family: Consolas; font-size: 10pt;">try</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"><br />
{<br />
</span><span lang="EN-US" style="color: #2b91af; font-family: Consolas; font-size: 10pt;">File</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;">.Copy(source_file, new_file);<br />
</span><span lang="EN-US" style="color: blue; font-family: Consolas; font-size: 10pt;">return</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"> </span><span lang="EN-US" style="color: blue; font-family: Consolas; font-size: 10pt;">true</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;">;<br />
}<br />
</span><span lang="EN-US" style="color: blue; font-family: Consolas; font-size: 10pt;">catch</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"> (</span><span lang="EN-US" style="color: #2b91af; font-family: Consolas; font-size: 10pt;">Exception</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"> ex)<br />
{<br />
</span><span lang="EN-US" style="color: blue; font-family: Consolas; font-size: 10pt;">throw</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"> ex;<br />
}<br />
}<br />
}<br />
</span><span lang="EN-US" style="color: blue; font-family: Consolas; font-size: 10pt;">return</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"> </span><span lang="EN-US" style="color: blue; font-family: Consolas; font-size: 10pt;">false</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;">;<br />
}<br />
}<br />
}<o:p></o:p></span></div><div class="MsoNormal" style="line-height: 12.0pt; margin-bottom: 12.0pt; margin-left: 0cm; margin-right: 0cm; margin-top: 12.0pt; text-align: justify; text-indent: 1.0cm;"><br />
</div><div class="MsoNormal" style="line-height: 12.0pt; margin-bottom: .0001pt; margin-bottom: 0cm; text-align: justify; text-indent: 1.0cm;"><span style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: #333333; font-size: 10pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;">Методы у этого класса, как видно из комментариев могут создавать файлы, копировать их, считывать из них текст, записывать и сканировать в паке все, содержащиеся в ней файлы. Предположим,</span><span style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: #333333; font-size: 12pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;"> </span><span style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: #333333; font-size: 10pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;">нам надо проверить все-ли методы данного класса работают корректно. В принципе, все действия можно разбить на следующие несколько шагов:</span><span style="color: #333333; font-size: 10pt;"><o:p></o:p></span><br />
<span style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: #333333; font-size: 10pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;"><br />
</span></div><div class="MsoNormal" style="line-height: 12.0pt; margin-bottom: .0001pt; margin-bottom: 0cm; text-align: justify; text-indent: 1.0cm;"><span style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: #333333; font-size: 10pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;">1. В коде программы щелкаем правой кнопкой мыши по названию класса и в контекстном меню выбираем пункт “</span><span lang="EN-US" style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: #333333; font-size: 10pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;">Create UnitTests</span><span style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: #333333; font-size: 10pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;">…”</span><span style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: #333333; font-size: 12pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;"> </span><span style="color: #333333; font-size: 10pt;"><o:p></o:p></span><br />
<span style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: #333333; font-size: 12pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;"><br />
</span><br />
<div class="separator" style="clear: both; text-align: center;"><a href="http://dc133.file.qip.ru/img/jcVGzvDu/%D1%8B%D0%B2%D0%B0%D1%8B%D0%B2%D0%B0%D1%8B%D0%B2.jpg?sizeM=7" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="271" src="http://dc133.file.qip.ru/img/jcVGzvDu/%D1%8B%D0%B2%D0%B0%D1%8B%D0%B2%D0%B0%D1%8B%D0%B2.jpg?sizeM=7" width="320" /></a></div><div class="separator" style="clear: both; text-align: center;"><br />
</div></div><div class="MsoNormal" style="line-height: 12.0pt; margin-bottom: .0001pt; margin-bottom: 0cm; text-align: justify; text-indent: 1.0cm;"><span style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: #333333; font-size: 10pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;">2. После чего Вы увидите окно в котором следует выбрать те классы и методы которые Вы хотите протестировать. Собственно для них каркас теста и будет сгенерирован средой </span><span lang="EN-US" style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: #333333; font-size: 10pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;">Visual Studio</span><span style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: #333333; font-size: 10pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;">. Выберем для примера методы </span><span lang="EN-US" style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: #333333; font-size: 10pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;">Create </span><span style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: #333333; font-size: 10pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;">и </span><span lang="EN-US" style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: #333333; font-size: 10pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;">ReadAllTextFile</span><span style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: #333333; font-size: 10pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;">.</span><span style="font-family: 'Times New Roman', serif; font-size: 12pt;"><o:p></o:p></span><br />
<span style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: #333333; font-size: 10pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;"><br />
</span><br />
<div class="separator" style="clear: both; text-align: center;"><a href="http://dc133.file.qip.ru/img/s7EZxbYt/%D1%84%D1%8B%D0%B2%D0%B0%D1%84%D1%8B%D0%B2%D0%B0%D1%84%D1%8B%D0%B2.jpg?sizeM=7" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="248" src="http://dc133.file.qip.ru/img/s7EZxbYt/%D1%84%D1%8B%D0%B2%D0%B0%D1%84%D1%8B%D0%B2%D0%B0%D1%84%D1%8B%D0%B2.jpg?sizeM=7" width="320" /></a></div><span style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: #333333; font-size: 10pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;"><br />
</span><br />
<div class="separator" style="clear: both; text-align: center;"></div></div><div class="MsoNormal" style="line-height: 12.0pt; margin-bottom: .0001pt; margin-bottom: 0cm; text-align: justify; text-indent: 1.0cm;"><span style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: #333333; font-size: 10pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;">В выпадающем списке </span><span lang="EN-US" style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: #333333; font-size: 10pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;">Output project </span><span style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: #333333; font-size: 10pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;">выберем существующий проект (это в том случае, если Вы уже создавали до этого юнит-тесты) или выберем пункт создать новый, и при этом можно выбрать на каком языке программирования будут созданы выбранные юнит-тесты.</span><span style="font-family: 'Times New Roman', serif; font-size: 12pt;"><o:p></o:p></span></div><div class="MsoNormal" style="line-height: 12.0pt; margin-bottom: .0001pt; margin-bottom: 0cm; text-align: justify; text-indent: 1.0cm;"><br />
</div><div class="MsoNormal" style="line-height: 12.0pt; margin-bottom: .0001pt; margin-bottom: 0cm; text-align: justify; text-indent: 1.0cm;"><span style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: #333333; font-size: 10pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;">3. Нажимаем ОК. Если был выбран новый проект, то нас попросят ввести имя нового проекта. После чего, ждем пока сгенерируется каркас тестов.<o:p></o:p></span><br />
<span style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: #333333; font-size: 10pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;"><br />
</span></div><div class="MsoNormal" style="line-height: 12.0pt; margin-bottom: .0001pt; margin-bottom: 0cm; text-align: justify; text-indent: 1.0cm;"><span style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: #333333; font-size: 10pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;">4. Из всего сгенерированного кода нас будут интересовать только следующие два метода:<o:p></o:p></span></div><div class="MsoNormal" style="line-height: 12.0pt; margin-bottom: 12.0pt; margin-left: 0cm; margin-right: 0cm; margin-top: 12.0pt; text-align: justify; text-indent: 1.0cm;"><br />
</div><div class="MsoNormal" style="background: white; line-height: 12.0pt; margin-bottom: .0001pt; margin-bottom: 0cm; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt; text-align: justify; text-indent: 1.0cm;"><span style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: grey; font-family: Consolas; font-size: 10pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;"> </span><span lang="EN-US" style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: grey; font-family: Consolas; font-size: 10pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;">///</span><span lang="EN-US" style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: green; font-family: Consolas; font-size: 10pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;"> </span><span lang="EN-US" style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: grey; font-family: Consolas; font-size: 10pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;"><summary></span><span lang="EN-US" style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: black; font-family: Consolas; font-size: 10pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;"><br />
</span><span lang="EN-US" style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: grey; font-family: Consolas; font-size: 10pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;">///</span><span lang="EN-US" style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: green; font-family: Consolas; font-size: 10pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;">A test for Create</span><span lang="EN-US" style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: black; font-family: Consolas; font-size: 10pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;"><br />
</span><span lang="EN-US" style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: grey; font-family: Consolas; font-size: 10pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;">///</summary></span><span lang="EN-US" style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: black; font-family: Consolas; font-size: 10pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;"><br />
[</span><span lang="EN-US" style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: #2b91af; font-family: Consolas; font-size: 10pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;">TestMethod</span><span lang="EN-US" style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: black; font-family: Consolas; font-size: 10pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;">()]<br />
</span><span lang="EN-US" style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: blue; font-family: Consolas; font-size: 10pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;">public</span><span lang="EN-US" style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: black; font-family: Consolas; font-size: 10pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;"> </span><span lang="EN-US" style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: blue; font-family: Consolas; font-size: 10pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;">void</span><span lang="EN-US" style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: black; font-family: Consolas; font-size: 10pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;"> CreateTest()<br />
{<br />
</span><span lang="EN-US" style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: blue; font-family: Consolas; font-size: 10pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;">string</span><span lang="EN-US" style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: black; font-family: Consolas; font-size: 10pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;"> path = </span><span lang="EN-US" style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: blue; font-family: Consolas; font-size: 10pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;">string</span><span lang="EN-US" style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: black; font-family: Consolas; font-size: 10pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;">.Empty; </span><span lang="EN-US" style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: green; font-family: Consolas; font-size: 10pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;">// TODO: Initialize to an appropriate value</span><span lang="EN-US" style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: black; font-family: Consolas; font-size: 10pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;"><br />
</span><span lang="EN-US" style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: blue; font-family: Consolas; font-size: 10pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;">bool</span><span lang="EN-US" style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: black; font-family: Consolas; font-size: 10pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;"> expected = </span><span lang="EN-US" style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: blue; font-family: Consolas; font-size: 10pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;">false</span><span lang="EN-US" style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: black; font-family: Consolas; font-size: 10pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;">; </span><span lang="EN-US" style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: green; font-family: Consolas; font-size: 10pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;">// TODO: Initialize to an appropriate value</span><span lang="EN-US" style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: black; font-family: Consolas; font-size: 10pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;"><br />
</span><span lang="EN-US" style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: blue; font-family: Consolas; font-size: 10pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;">bool</span><span lang="EN-US" style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: black; font-family: Consolas; font-size: 10pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;"> actual;<br />
actual = </span><span lang="EN-US" style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: #2b91af; font-family: Consolas; font-size: 10pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;">FileManagement</span><span lang="EN-US" style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: black; font-family: Consolas; font-size: 10pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;">.Create(path);<br />
</span><span lang="EN-US" style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: #2b91af; font-family: Consolas; font-size: 10pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;">Assert</span><span lang="EN-US" style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: black; font-family: Consolas; font-size: 10pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;">.AreEqual(expected, actual);<br />
</span><span lang="EN-US" style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: #2b91af; font-family: Consolas; font-size: 10pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;">Assert</span><span lang="EN-US" style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: black; font-family: Consolas; font-size: 10pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;">.Inconclusive(</span><span lang="EN-US" style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: #a31515; font-family: Consolas; font-size: 10pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;">"Verify the correctness of this test method."</span><span lang="EN-US" style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: black; font-family: Consolas; font-size: 10pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;">);<br />
}<br />
<br />
</span><span lang="EN-US" style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: grey; font-family: Consolas; font-size: 10pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;">///</span><span lang="EN-US" style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: green; font-family: Consolas; font-size: 10pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;"> </span><span lang="EN-US" style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: grey; font-family: Consolas; font-size: 10pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;"><summary></span><span lang="EN-US" style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: black; font-family: Consolas; font-size: 10pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;"><br />
</span><span lang="EN-US" style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: grey; font-family: Consolas; font-size: 10pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;">///</span><span lang="EN-US" style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: green; font-family: Consolas; font-size: 10pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;">A test for ReadAllTextFile</span><span lang="EN-US" style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: black; font-family: Consolas; font-size: 10pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;"><br />
</span><span lang="EN-US" style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: grey; font-family: Consolas; font-size: 10pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;">///</summary></span><span lang="EN-US" style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: black; font-family: Consolas; font-size: 10pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;"><br />
[</span><span lang="EN-US" style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: #2b91af; font-family: Consolas; font-size: 10pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;">TestMethod</span><span lang="EN-US" style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: black; font-family: Consolas; font-size: 10pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;">()]<br />
</span><span lang="EN-US" style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: blue; font-family: Consolas; font-size: 10pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;">public</span><span lang="EN-US" style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: black; font-family: Consolas; font-size: 10pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;"> </span><span lang="EN-US" style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: blue; font-family: Consolas; font-size: 10pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;">void</span><span lang="EN-US" style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: black; font-family: Consolas; font-size: 10pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;"> ReadAllTextFileTest()<br />
{<br />
</span><span lang="EN-US" style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: blue; font-family: Consolas; font-size: 10pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;">string</span><span lang="EN-US" style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: black; font-family: Consolas; font-size: 10pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;"> path = </span><span lang="EN-US" style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: blue; font-family: Consolas; font-size: 10pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;">string</span><span lang="EN-US" style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: black; font-family: Consolas; font-size: 10pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;">.Empty; </span><span lang="EN-US" style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: green; font-family: Consolas; font-size: 10pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;">// TODO: Initialize to an appropriate value</span><span lang="EN-US" style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: black; font-family: Consolas; font-size: 10pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;"><br />
</span><span lang="EN-US" style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: blue; font-family: Consolas; font-size: 10pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;">string</span><span lang="EN-US" style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: black; font-family: Consolas; font-size: 10pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;"> expected = </span><span lang="EN-US" style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: blue; font-family: Consolas; font-size: 10pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;">string</span><span lang="EN-US" style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: black; font-family: Consolas; font-size: 10pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;">.Empty; </span><span lang="EN-US" style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: green; font-family: Consolas; font-size: 10pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;">// TODO: Initialize to an appropriate value</span><span lang="EN-US" style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: black; font-family: Consolas; font-size: 10pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;"><br />
</span><span lang="EN-US" style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: blue; font-family: Consolas; font-size: 10pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;">string</span><span lang="EN-US" style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: black; font-family: Consolas; font-size: 10pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;"> actual;<br />
actual = </span><span lang="EN-US" style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: #2b91af; font-family: Consolas; font-size: 10pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;">FileManagement</span><span lang="EN-US" style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: black; font-family: Consolas; font-size: 10pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;">.ReadAllTextFile(path);<br />
</span><span lang="EN-US" style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: #2b91af; font-family: Consolas; font-size: 10pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;">Assert</span><span lang="EN-US" style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: black; font-family: Consolas; font-size: 10pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;">.AreEqual(expected, actual);<br />
</span><span lang="EN-US" style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: #2b91af; font-family: Consolas; font-size: 10pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;">Assert</span><span lang="EN-US" style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: black; font-family: Consolas; font-size: 10pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;">.Inconclusive(</span><span lang="EN-US" style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: #a31515; font-family: Consolas; font-size: 10pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;">"Verify the correctness of this test method."</span><span lang="EN-US" style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: black; font-family: Consolas; font-size: 10pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;">);<br />
}<o:p></o:p></span></div><div class="MsoNormal" style="line-height: 12.0pt; margin-bottom: 12.0pt; margin-left: 0cm; margin-right: 0cm; margin-top: 12.0pt; text-align: justify; text-indent: 1.0cm;"><br />
</div><div class="MsoNormal" style="line-height: 12.0pt; margin-bottom: .0001pt; margin-bottom: 0cm; text-align: justify; text-indent: 1.0cm;"><span style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: #333333; font-size: 10pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;">Собственно они и проверяют наши два метода в классе для работы с файловой системой. Как видно, идея сводится к простому вызову методов в специально отгороженном от основной программы проекте. Это сделано для того, чтобы проверить работу методов не рискуя испортить основное приложение, где эти методы планируется использовать.</span><span style="color: #333333; font-size: 10pt;"><o:p></o:p></span><br />
<span style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: #333333; font-size: 10pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;"><br />
</span></div><div class="MsoNormal" style="line-height: 12.0pt; margin-bottom: .0001pt; margin-bottom: 0cm; text-align: justify; text-indent: 1.0cm;"><span style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: #333333; font-size: 10pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;">5. Теперь надо немного отредактировать наши тесты следующим образом:</span><span style="color: #333333; font-size: 10pt;"><o:p></o:p></span></div><div class="MsoNormal" style="line-height: 12.0pt; margin-bottom: 12.0pt; margin-left: 0cm; margin-right: 0cm; margin-top: 12.0pt; text-align: justify; text-indent: 1.0cm;"><br />
</div><div class="MsoNormal" style="background: white; line-height: 12.0pt; margin-bottom: .0001pt; margin-bottom: 0cm; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt; text-align: justify; text-indent: 1.0cm;"><span style="color: grey; font-family: Consolas; font-size: 10pt;"> </span><span lang="EN-US" style="color: grey; font-family: Consolas; font-size: 10pt;">///</span><span lang="EN-US" style="color: green; font-family: Consolas; font-size: 10pt;"> </span><span lang="EN-US" style="color: grey; font-family: Consolas; font-size: 10pt;"><summary></span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"><br />
</span><span lang="EN-US" style="color: grey; font-family: Consolas; font-size: 10pt;">///</span><span lang="EN-US" style="color: green; font-family: Consolas; font-size: 10pt;">A test for Create</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"><br />
</span><span lang="EN-US" style="color: grey; font-family: Consolas; font-size: 10pt;">///</summary></span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"><br />
[</span><span lang="EN-US" style="color: #2b91af; font-family: Consolas; font-size: 10pt;">TestMethod</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;">()]<br />
</span><span lang="EN-US" style="color: blue; font-family: Consolas; font-size: 10pt;">public</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"> </span><span lang="EN-US" style="color: blue; font-family: Consolas; font-size: 10pt;">void</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"> CreateTest()<br />
{<br />
</span><span lang="EN-US" style="color: blue; font-family: Consolas; font-size: 10pt;">string</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"> path = </span><span lang="EN-US" style="color: #a31515; font-family: Consolas; font-size: 10pt;">"D:\\test_file.txt"</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;">;<br />
</span><span lang="EN-US" style="color: blue; font-family: Consolas; font-size: 10pt;">bool</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"> expected = </span><span lang="EN-US" style="color: blue; font-family: Consolas; font-size: 10pt;">true</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;">;<br />
</span><span lang="EN-US" style="color: blue; font-family: Consolas; font-size: 10pt;">bool</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"> actual;<br />
actual = </span><span lang="EN-US" style="color: #2b91af; font-family: Consolas; font-size: 10pt;">FileManagement</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;">.Create(path);<br />
</span><span lang="EN-US" style="color: #2b91af; font-family: Consolas; font-size: 10pt;">Assert</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;">.AreEqual(expected, actual);<br />
</span><span lang="EN-US" style="color: #2b91af; font-family: Consolas; font-size: 10pt;">Debug</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;">.WriteLine(</span><span lang="EN-US" style="color: #a31515; font-family: Consolas; font-size: 10pt;">"File was created."</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;">);<br />
}<br />
<br />
</span><span lang="EN-US" style="color: grey; font-family: Consolas; font-size: 10pt;">///</span><span lang="EN-US" style="color: green; font-family: Consolas; font-size: 10pt;"> </span><span lang="EN-US" style="color: grey; font-family: Consolas; font-size: 10pt;"><summary></span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"><br />
</span><span lang="EN-US" style="color: grey; font-family: Consolas; font-size: 10pt;">///</span><span lang="EN-US" style="color: green; font-family: Consolas; font-size: 10pt;">A test for ReadAllTextFile</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"><br />
</span><span lang="EN-US" style="color: grey; font-family: Consolas; font-size: 10pt;">///</summary></span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"><br />
[</span><span lang="EN-US" style="color: #2b91af; font-family: Consolas; font-size: 10pt;">TestMethod</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;">()]<br />
</span><span lang="EN-US" style="color: blue; font-family: Consolas; font-size: 10pt;">public</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"> </span><span lang="EN-US" style="color: blue; font-family: Consolas; font-size: 10pt;">void</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"> ReadAllTextFileTest()<br />
{<br />
</span><span lang="EN-US" style="color: blue; font-family: Consolas; font-size: 10pt;">string</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"> path = </span><span lang="EN-US" style="color: #a31515; font-family: Consolas; font-size: 10pt;">"D:\\test_file.txt"</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;">;<br />
</span><span lang="EN-US" style="color: blue; font-family: Consolas; font-size: 10pt;">string</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"> expected = </span><span lang="EN-US" style="color: #a31515; font-family: Consolas; font-size: 10pt;">""</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;">;<br />
</span><span lang="EN-US" style="color: blue; font-family: Consolas; font-size: 10pt;">string</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;"> actual;<br />
actual = </span><span lang="EN-US" style="color: #2b91af; font-family: Consolas; font-size: 10pt;">FileManagement</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;">.ReadAllTextFile(path);<br />
</span><span lang="EN-US" style="color: #2b91af; font-family: Consolas; font-size: 10pt;">Assert</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;">.AreEqual(expected, actual);<br />
</span><span lang="EN-US" style="color: #2b91af; font-family: Consolas; font-size: 10pt;">Debug</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;">.WriteLine(</span><span lang="EN-US" style="color: #a31515; font-family: Consolas; font-size: 10pt;">"File was readed."</span><span lang="EN-US" style="color: black; font-family: Consolas; font-size: 10pt;">);<br />
}<o:p></o:p></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; text-align: justify; text-indent: 1.0cm;"><span lang="EN-US" style="color: #333333; font-family: 'Segoe UI', sans-serif; font-size: 10pt;"> </span><span lang="EN-US" style="font-family: 'Segoe UI', sans-serif; font-size: 10pt;"><o:p></o:p></span></div><div class="MsoNormal" style="line-height: 12.0pt; margin-bottom: .0001pt; margin-bottom: 0cm; text-align: justify; text-indent: 1.0cm;"><span style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: #333333; font-size: 10pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;">Здесь</span><span lang="EN-US" style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: #333333; font-size: 10pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;">:</span><span lang="EN-US" style="color: #333333; font-size: 12pt;"><o:p></o:p></span><br />
<span lang="EN-US" style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: #333333; font-size: 10pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;"><br />
</span></div><div class="MsoNormal" style="line-height: 12.0pt; margin-bottom: .0001pt; margin-bottom: 0cm; text-align: justify; text-indent: 1.0cm;"><span lang="EN-US" style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: #2b91af; font-family: Consolas; font-size: 8pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;">Assert</span><span lang="EN-US" style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: #333333; font-family: Consolas; font-size: 8pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;">.AreEqual(expected, actual)</span><span lang="EN-US" style="color: #333333; font-size: 10pt;"><o:p></o:p></span><br />
<span lang="EN-US" style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: #333333; font-family: Consolas; font-size: 8pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;"><br />
</span></div><div class="MsoNormal" style="line-height: 12.0pt; margin-bottom: .0001pt; margin-bottom: 0cm; text-align: justify; text-indent: 1.0cm;"><span style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: #333333; font-size: 10pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;">Сравнивает предполагаемый результат и полученный на деле. Если результаты не будут равны, то тест будет считаться не пройденным. В противном случае, те если тест будет пройден, то в окне работы данного теста будет выведена строка “</span><span lang="EN-US" style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: #333333; font-size: 10pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;">File wascreated</span><span style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: #333333; font-size: 10pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;">”. Для использования класса </span><span lang="EN-US" style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: #333333; font-size: 10pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;">Debug</span><span style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: #333333; font-size: 10pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;"> необходимо подключить пространство имен </span><span lang="EN-US" style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: #333333; font-size: 10pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;">Systems</span><span style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: #333333; font-size: 10pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;">.</span><span lang="EN-US" style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: #333333; font-size: 10pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;">Diagnostics</span><span style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: #333333; font-size: 10pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;">.</span><span style="color: #333333; font-size: 10pt;"><o:p></o:p></span><br />
<span style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: #333333; font-size: 10pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;"><br />
</span></div><div class="MsoNormal" style="line-height: 12.0pt; margin-bottom: .0001pt; margin-bottom: 0cm; text-align: justify; text-indent: 1.0cm;"><span style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: #333333; font-size: 10pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;">6. Теперь можно запустить написанные нами тесты.</span><span style="color: #333333; font-size: 10pt;"><o:p></o:p></span><br />
<span style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: #333333; font-size: 10pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;"><br />
</span></div><div class="MsoNormal" style="line-height: 12.0pt; margin-bottom: .0001pt; margin-bottom: 0cm; text-align: justify; text-indent: 1.0cm;"><span style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: #333333; font-size: 10pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;">Все созданные тесты помещаются в список тестов. Чтобы вызвать это окно, пройдитесь по следующим меню:</span><span style="color: #333333; font-size: 10pt;"><o:p></o:p></span><br />
<span style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: #333333; font-size: 10pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;"><br />
</span><br />
<div class="separator" style="clear: both; text-align: center;"><a href="http://dc133.file.qip.ru/img/P5XyhA7F/%D1%84%D1%8B%D0%B2%D0%B0%D1%84%D1%8B%D0%B2%D0%B0%D1%84%D1%8B%D0%B2%D0%B0.jpg?sizeM=7" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="176" src="http://dc133.file.qip.ru/img/P5XyhA7F/%D1%84%D1%8B%D0%B2%D0%B0%D1%84%D1%8B%D0%B2%D0%B0%D1%84%D1%8B%D0%B2%D0%B0.jpg?sizeM=7" width="320" /></a></div><div class="separator" style="clear: both; text-align: center;"><br />
</div><div class="separator" style="clear: both; text-align: center;"></div></div><div class="MsoNormal" style="line-height: 12.0pt; margin-bottom: .0001pt; margin-bottom: 0cm; text-align: justify; text-indent: 1.0cm;"><span style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: #333333; font-size: 10pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;">В появившемся окне Вы увидите наши два теста. Пометьте их галочками. Это будет означать, что их нужно будет выполнить при запуске тестов.</span><span style="color: #333333; font-size: 12pt;"><o:p></o:p></span><br />
<span style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: #333333; font-size: 10pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;"><br />
</span><br />
<div class="separator" style="clear: both; text-align: center;"><a href="http://dc133.file.qip.ru/img/IfVxAfRu/%D1%84%D1%8B%D0%B0%D1%84%D1%8B%D0%B0%D1%84%D1%8B%D0%B2.jpg?sizeM=7" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="90" src="http://dc133.file.qip.ru/img/IfVxAfRu/%D1%84%D1%8B%D0%B0%D1%84%D1%8B%D0%B0%D1%84%D1%8B%D0%B2.jpg?sizeM=7" width="320" /></a></div><span style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: #333333; font-size: 10pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;"><br />
</span><br />
<div class="separator" style="clear: both; text-align: center;"></div></div><div class="MsoNormal" style="line-height: 12.0pt; margin-bottom: .0001pt; margin-bottom: 0cm; text-align: justify; text-indent: 1.0cm;"><span style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: #333333; font-size: 10pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;">Для запуска тестов, в этом же окне, нажмем кнопку </span><span lang="EN-US" style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: #333333; font-size: 10pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;">Run Checked Tests</span><span style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: #333333; font-size: 10pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;">.</span><span style="color: #333333; font-size: 12pt;"><o:p></o:p></span><br />
<span style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: #333333; font-size: 10pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;"><br />
</span></div><div class="MsoNormal" style="line-height: 12.0pt; margin-bottom: .0001pt; margin-bottom: 0cm; text-align: justify; text-indent: 1.0cm;"><span style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: #333333; font-size: 10pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;">Как видите у меня один из тестов не был завершен успешно:</span><span style="color: #333333; font-size: 10pt;"><o:p></o:p></span><br />
<span style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: #333333; font-size: 10pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;"><br />
</span><br />
<div class="separator" style="clear: both; text-align: center;"><a href="http://dc133.file.qip.ru/img/vvtvEIQL/%D0%BF%D0%B0%D0%BB%D0%BE%D0%BF%D1%80%D0%BB%D0%BE%D1%80.jpg?sizeM=7" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="82" src="http://dc133.file.qip.ru/img/vvtvEIQL/%D0%BF%D0%B0%D0%BB%D0%BE%D0%BF%D1%80%D0%BB%D0%BE%D1%80.jpg?sizeM=7" width="320" /></a></div><div class="separator" style="clear: both; text-align: center;"></div></div><div class="MsoNormal" style="line-height: 12.0pt; margin-bottom: 12.0pt; margin-left: 0cm; margin-right: 0cm; margin-top: 12.0pt; text-align: justify; text-indent: 1.0cm;"><span style="color: #333333; font-size: 10pt;">Если два раза щелкнуть по ошибке, то курсор переместится к тому месту где произошел сбой. Как видно, было выброшено исключение о том, что файл, который мы хотели прочитать не существовал на нашем жестком диске. Как видно, так же это исключение указано в таблице, в столбике Error Message.</span><span style="color: #333333; font-size: 12pt;"><o:p></o:p></span></div><div class="MsoNormal" style="line-height: 12.0pt; margin-bottom: .0001pt; margin-bottom: 0cm; text-align: justify; text-indent: 1.0cm;"><span style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: #333333; font-size: 10pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;">Второй же тест был успешно пройден, о чем свидетельствует стоящая зеленая галочка напротив теста. А это значит, что теперь файл на жестком диске существует и мы его можем прочитать, те теперь первый тест должен успешно быть выполнен. Вы можете убедиться в этом выполнив повторно тесты.</span><span style="color: #333333; font-size: 10pt;"><o:p></o:p></span><br />
<span style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: #333333; font-size: 10pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;"><br />
</span></div><div class="MsoNormal" style="line-height: 12.0pt; margin-bottom: .0001pt; margin-bottom: 0cm; text-align: justify; text-indent: 1.0cm;"><span style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: #333333; font-size: 10pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;">Чтобы увидеть окно работы каждого теста, то в списке результатов теста нужно щелкнуть два раза по тесту и будет выведено окно, в которое происходили все выводы при работе теста.</span><span style="color: #333333; font-size: 10pt;"><o:p></o:p></span><br />
<span style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: #333333; font-size: 10pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;"><br />
</span><br />
<div class="separator" style="clear: both; text-align: center;"><a href="http://dc133.file.qip.ru/img/mjTs705m/%D0%BF%D0%BB%D0%B1_%D0%BF%D0%B2%D0%B0%D0%BF%D0%BC%D0%B8%D0%B2%D0%B0.jpg?sizeM=7" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="190" src="http://dc133.file.qip.ru/img/mjTs705m/%D0%BF%D0%BB%D0%B1_%D0%BF%D0%B2%D0%B0%D0%BF%D0%BC%D0%B8%D0%B2%D0%B0.jpg?sizeM=7" width="320" /></a></div><div class="separator" style="clear: both; text-align: center;"><br />
</div></div><div class="MsoNormal" style="line-height: 12.0pt; margin-bottom: .0001pt; margin-bottom: 0cm; text-align: justify; text-indent: 1.0cm;"><span style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: #333333; font-size: 10pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;">Теперь при написании новых классов и новых методов, использующих уде существующие и оттестированные методы можно быть спокойным, тк шансы, что эти методы дадут сбой будут ниже, чем без их тестирования. Но для уверенности всегда стоит добавлять новые тесты для новых методов. Таким образом, можно минимизировать количество возможных ошибок в коде и увеличить покрытость исходного кода тестами.</span><span style="color: #333333; font-size: 12pt;"><o:p></o:p></span><br />
<span style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: #333333; font-size: 10pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;"><br />
</span></div><div class="MsoNormal" style="line-height: 12.0pt; margin-bottom: .0001pt; margin-bottom: 0cm; text-align: justify; text-indent: 1.0cm;"><span style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: #333333; font-size: 10pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;">В данной статье я хотел показать тем, кто еще не сталкивался на практике с Unit-тестированием, как его использовать и применять в Visual Studio.</span><span style="color: #333333; font-size: 10pt;"><o:p></o:p></span></div><div class="MsoNormal" style="text-align: justify; text-indent: 1.0cm;"><br />
</div></div>Святослав Панкратовhttp://www.blogger.com/profile/13039405381364404095noreply@blogger.com0tag:blogger.com,1999:blog-4678276506533150023.post-55843800543343860242011-01-11T19:36:00.004+03:002011-06-26T14:57:22.631+04:00Качество разрабатываемого ПО. Качество программного кода. Методы и средства их оценки и улучшения качества.<div dir="ltr" style="text-align: left;" trbidi="on"><h1 style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto;"><span style="color: #4f81bd; font-size: 16pt; line-height: 115%;">Качество программного обеспечения.</span><span style="color: #4f81bd; font-size: 16pt; line-height: 115%;"><o:p></o:p></span></h1><div class="MsoNormal" style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: 1.0cm;"><br />
</div><h2 style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto;"><span style="font-size: 11pt; line-height: 115%;">Проблемы разработки ПО</span><span style="font-size: 11pt; line-height: 115%;"><o:p></o:p></span></h2><div class="MsoNormal" style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: 1.0cm;"><span style="line-height: 115%;">Наиболее распространёнными проблемами, возникающим в процессе разработки ПО, считают:<o:p></o:p></span></div><a name='more'></a><br />
<div class="MsoListParagraphCxSpFirst" style="margin-left: 64.35pt; mso-add-space: auto; mso-list: l18 level1 lfo8; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: -18.0pt;"><span style="font-family: Symbol; line-height: 115%;">·<span style="font: normal normal normal 7pt/normal 'Times New Roman';"> </span></span><b style="mso-bidi-font-weight: normal;"><span style="line-height: 115%;">Недостаток прозрачности.</span></b><span style="line-height: 115%;"> В любой момент времени сложно сказать, в каком состоянии находится проект и каков процент его завершения. <o:p></o:p></span></div><div class="MsoListParagraphCxSpMiddle" style="margin-left: 64.35pt; mso-add-space: auto; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify;"><span style="line-height: 115%;">Данная проблема возникает при недостаточном планировании структуры (или архитектуры) будущего программного продукта, что чаще всего является следствием отсутствия достаточного финансирования проекта: программа нужна, сколько времени займёт разработка, каковы этапы, можно ли какие-то этапы исключить или сэкономить — следствием этого процесса является то, что этап проектирования сокращается.<o:p></o:p></span></div><div class="MsoListParagraphCxSpMiddle" style="margin-left: 64.35pt; mso-add-space: auto; mso-list: l18 level1 lfo8; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: -18.0pt;"><span style="font-family: Symbol; line-height: 115%;">·<span style="font: normal normal normal 7pt/normal 'Times New Roman';"> </span></span><b style="mso-bidi-font-weight: normal;"><span style="line-height: 115%;">Недостаток контроля.</span></b><span style="line-height: 115%;"> Без точной оценки процесса разработки срываются графики выполнения работ и превышаются установленные бюджеты. Сложно оценить объем выполненной и оставшейся работы. <o:p></o:p></span></div><div class="MsoListParagraphCxSpMiddle" style="margin-left: 64.35pt; mso-add-space: auto; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify;"><span style="line-height: 115%;">Данная проблема возникает на этапе, когда проект, завершённый более, чем на половину, продолжает разрабатываться после дополнительного финансирования без оценки степени завершённости проекта.<o:p></o:p></span></div><div class="MsoListParagraphCxSpMiddle" style="margin-left: 64.35pt; mso-add-space: auto; mso-list: l18 level1 lfo8; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: -18.0pt;"><span style="font-family: Symbol; line-height: 115%;">·<span style="font: normal normal normal 7pt/normal 'Times New Roman';"> </span></span><b style="mso-bidi-font-weight: normal;"><span style="line-height: 115%;">Недостаток трассировки.<o:p></o:p></span></b></div><div class="MsoListParagraphCxSpMiddle" style="margin-left: 64.35pt; mso-add-space: auto; mso-list: l18 level1 lfo8; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: -18.0pt;"><span style="font-family: Symbol; line-height: 115%;">·<span style="font: normal normal normal 7pt/normal 'Times New Roman';"> </span></span><b style="mso-bidi-font-weight: normal;"><span style="line-height: 115%;">Недостаток мониторинга.</span></b><span style="line-height: 115%;"> Невозможность наблюдать ход развития проекта не позволяет контролировать ход разработки в реальном времени. С помощью инструментальных средств менеджеры проектов принимают решения на основе данных, поступающих в реальном времени. <o:p></o:p></span></div><div class="MsoListParagraphCxSpMiddle" style="margin-left: 64.35pt; mso-add-space: auto; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify;"><span style="line-height: 115%;">Данная проблема возникает в условиях, когда стоимость обучения менеджмента владению инструментальными средствами, сравнима со стоимостью разработки самой программы.<o:p></o:p></span></div><div class="MsoListParagraphCxSpMiddle" style="margin-left: 64.35pt; mso-add-space: auto; mso-list: l18 level1 lfo8; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: -18.0pt;"><span style="font-family: Symbol; line-height: 115%;">·<span style="font: normal normal normal 7pt/normal 'Times New Roman';"> </span></span><b style="mso-bidi-font-weight: normal;"><span style="line-height: 115%;">Неконтролируемые изменения.</span></b><span style="line-height: 115%;"> У потребителей постоянно возникают новые идеи относительно разрабатываемого программного обеспечения. Влияние изменений может быть существенным для успеха проекта, поэтому важно оценивать предлагаемые изменения и реализовывать только одобренные, контролируя этот процесс с помощью программных средств. <o:p></o:p></span></div><div class="MsoListParagraphCxSpMiddle" style="margin-left: 64.35pt; mso-add-space: auto; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify;"><span style="line-height: 115%;">Данная проблема возникает вследствие нежелания конечного потребителя использовать те или иные программные среды. Например, когда при создании клиент-серверной системы потребитель предъявляет требования не только к операционной системе на компьютерах-клиентах, но и на компьютере-сервере.<o:p></o:p></span></div><div class="MsoListParagraphCxSpMiddle" style="margin-left: 64.35pt; mso-add-space: auto; mso-list: l18 level1 lfo8; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: -18.0pt;"><span style="font-family: Symbol; line-height: 115%;">·<span style="font: normal normal normal 7pt/normal 'Times New Roman';"> </span></span><b style="mso-bidi-font-weight: normal;"><span style="line-height: 115%;">Недостаточная надежность.</span></b><span style="line-height: 115%;"> Самый сложный процесс — поиск и исправление ошибок в программах на ЭВМ. Поскольку число ошибок в программах заранее неизвестно, то заранее неизвестна и продолжительность отладки программ и отсутствие гарантий отсутствия ошибок в программах. Следует отметить, что привлечение доказательного подхода к проектированию ПО позволяет обнаружить ошибки в программе до её выполнения. В этом направлении много работали Кнут, Дейкстра и Вирт. Профессор Вирт при разработке Паскаля и Оберона за счет строгости их синтаксиса добился математической доказуемости завершаемости и правильности программ, написанной на этих языках. Особенно крупный вклад в дисциплину программирования внёс Дональд Кнут. Его четырёхтомник «Искусство программирования» является необходимой для каждого серьезного программиста книгой.<o:p></o:p></span></div><div class="MsoListParagraphCxSpMiddle" style="margin-left: 64.35pt; mso-add-space: auto; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify;"><span style="line-height: 115%;">Данная проблема возникает при неправильном выборе средств разработки. Например, при попытке создать программу, требующую средств высокого уровня, с помощью средств низкого уровня. Например, при попытке создать средства автоматизации с СУБД на ассемблере. В результате исходный код программы получается слишком сложным и плохо поддающимся структурированию.<o:p></o:p></span></div><div class="MsoListParagraphCxSpMiddle" style="margin-left: 64.35pt; mso-add-space: auto; mso-list: l18 level1 lfo8; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: -18.0pt;"><span style="font-family: Symbol; line-height: 115%;">·<span style="font: normal normal normal 7pt/normal 'Times New Roman';"> </span></span><b style="mso-bidi-font-weight: normal;"><span style="line-height: 115%;">Отсутствие гарантий качества и надежности</span></b><span style="line-height: 115%;"> программ из-за отсутствия гарантий отсутствия ошибок в программах вплоть до формальной сдачи программ заказчикам.<o:p></o:p></span></div><div class="MsoListParagraphCxSpLast" style="margin-left: 64.35pt; mso-add-space: auto; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify;"><span style="line-height: 115%;">Данная проблема не является проблемой, относящейся исключительно к разработке ПО. Гарантия качества — это проблема выбора поставщика товара (не продукта).<o:p></o:p></span></div><div class="MsoNormal" style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: 1.0cm;"><br />
</div><div class="MsoNormal" style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: 1.0cm;"><b style="mso-bidi-font-weight: normal;"><span style="line-height: 115%;">Качество программного обеспечения</span></b><span style="line-height: 115%;"> — характеристика программного обеспечения (ПО) как степени его соответствия требованиям. При этом требования могут трактоваться довольно широко, что порождает целый ряд независимых определений понятия. Чаще всего используется определение ISO 9001, согласно которому качество есть «степень соответствия присущих характеристик требованиям».<o:p></o:p></span></div><div class="MsoNormal" style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: 1.0cm;"><br />
</div><h2 style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto;"><span style="font-size: 11pt; line-height: 115%;">Качество исходного кода</span><span style="font-family: Calibri, sans-serif; font-size: 11pt; line-height: 115%;"><o:p></o:p></span></h2><div class="MsoNormal" style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: 1.0cm;"><span style="line-height: 115%;">Качество кода может определяться различными критериями. Некоторые из них имеют значение только с точки зрения человека. Например, то, как отформатирован текст программы, совершенно не важно для компьютера, но может иметь серьёзное значение для последующего сопровождения. Многие из имеющихся стандартов оформления кода, определяющих специфичные для используемого языка соглашения и задающие ряд правил, улучшающих читаемость кода, имеют своей целью облегчить будущее сопровождение ПО, включающее отладку и обновление. Существуют и другие критерии, определяющие, «хорошо» ли написан код, например, такие, как:<o:p></o:p></span></div><div class="MsoListParagraphCxSpFirst" style="margin-left: 64.35pt; mso-add-space: auto; mso-list: l18 level1 lfo8; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: -18.0pt;"><span style="font-family: Symbol; line-height: 115%;">·<span style="font: normal normal normal 7pt/normal 'Times New Roman';"> </span></span><span style="line-height: 115%;">Структурированность — степень логического разбиения кода на ряд управляемых блоков<o:p></o:p></span></div><div class="MsoListParagraphCxSpMiddle" style="margin-left: 64.35pt; mso-add-space: auto; mso-list: l11 level1 lfo1; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: -18.0pt;"><span style="font-family: Symbol; line-height: 115%;">·<span style="font: normal normal normal 7pt/normal 'Times New Roman';"> </span></span><span style="line-height: 115%;">Читаемость кода<o:p></o:p></span></div><div class="MsoListParagraphCxSpMiddle" style="margin-left: 64.35pt; mso-add-space: auto; mso-list: l11 level1 lfo1; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: -18.0pt;"><span style="font-family: Symbol; line-height: 115%;">·<span style="font: normal normal normal 7pt/normal 'Times New Roman';"> </span></span><span style="line-height: 115%;">Лёгкость поддержки, тестирования, отладки, исправления ошибок, изменения и портируемости<o:p></o:p></span></div><div class="MsoListParagraphCxSpMiddle" style="margin-left: 64.35pt; mso-add-space: auto; mso-list: l11 level1 lfo1; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: -18.0pt;"><span style="font-family: Symbol; line-height: 115%;">·<span style="font: normal normal normal 7pt/normal 'Times New Roman';"> </span></span><span style="line-height: 115%;">Низкая сложность кода<o:p></o:p></span></div><div class="MsoListParagraphCxSpMiddle" style="margin-left: 64.35pt; mso-add-space: auto; mso-list: l11 level1 lfo1; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: -18.0pt;"><span style="font-family: Symbol; line-height: 115%;">·<span style="font: normal normal normal 7pt/normal 'Times New Roman';"> </span></span><span style="line-height: 115%;">Низкое использование ресурсов: памяти и процессорного времени<o:p></o:p></span></div><div class="MsoListParagraphCxSpMiddle" style="margin-left: 64.35pt; mso-add-space: auto; mso-list: l11 level1 lfo1; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: -18.0pt;"><span style="font-family: Symbol; line-height: 115%;">·<span style="font: normal normal normal 7pt/normal 'Times New Roman';"> </span></span><span style="line-height: 115%;">Корректная обработка исключительных ситуаций<o:p></o:p></span></div><div class="MsoListParagraphCxSpMiddle" style="margin-left: 64.35pt; mso-add-space: auto; mso-list: l11 level1 lfo1; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: -18.0pt;"><span style="font-family: Symbol; line-height: 115%;">·<span style="font: normal normal normal 7pt/normal 'Times New Roman';"> </span></span><span style="line-height: 115%;">Низкое количество предупреждений при компиляции и линковке<o:p></o:p></span></div><div class="MsoListParagraphCxSpLast" style="margin-left: 64.35pt; mso-add-space: auto; mso-list: l11 level1 lfo1; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: -18.0pt;"><span style="font-family: Symbol; line-height: 115%;">·<span style="font: normal normal normal 7pt/normal 'Times New Roman';"> </span></span><span style="line-height: 115%;">Вязкость — свойство программного проекта или среды разработки затруднять внесение изменений предусмотренными в них методами<o:p></o:p></span></div><div class="MsoNormal" style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: 1.0cm;"><span style="line-height: 115%;">Методы улучшения качества кода: <b style="mso-bidi-font-weight: normal;">рефакторинг</b>.<o:p></o:p></span></div><div class="MsoNormal" style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: 1.0cm;"><br />
</div><h2 style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto;"><span style="font-size: 11pt; line-height: 115%;">Факторы качества</span><span style="font-family: Calibri, sans-serif; font-size: 11pt; line-height: 115%;"><o:p></o:p></span></h2><div class="MsoNormal" style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: 1.0cm;"><span style="line-height: 115%;">Фактор качества ПО — это нефункциональное требование к программе, которое обычно не описывается в договоре с заказчиком, но, тем не менее, является желательным требованием, повышающим качество программы.<o:p></o:p></span></div><div class="MsoNormal" style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: 1.0cm;"><span style="line-height: 115%;">Некоторые из факторов качества:<o:p></o:p></span></div><div class="MsoListParagraphCxSpFirst" style="margin-left: 64.35pt; mso-add-space: auto; mso-list: l8 level1 lfo2; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: -18.0pt;"><span style="font-family: Symbol; line-height: 115%;">·<span style="font: normal normal normal 7pt/normal 'Times New Roman';"> </span></span><b style="mso-bidi-font-weight: normal;"><span style="line-height: 115%;">понятность<o:p></o:p></span></b></div><div class="MsoListParagraphCxSpMiddle" style="margin-left: 64.35pt; mso-add-space: auto; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify;"><span style="line-height: 115%;">Назначение ПО должно быть понятным, из самой программы и документации.<o:p></o:p></span></div><div class="MsoListParagraphCxSpMiddle" style="margin-left: 64.35pt; mso-add-space: auto; mso-list: l8 level1 lfo2; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: -18.0pt;"><span style="font-family: Symbol; line-height: 115%;">·<span style="font: normal normal normal 7pt/normal 'Times New Roman';"> </span></span><b style="mso-bidi-font-weight: normal;"><span style="line-height: 115%;">полнота<o:p></o:p></span></b></div><div class="MsoListParagraphCxSpMiddle" style="margin-left: 64.35pt; mso-add-space: auto; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify;"><span style="line-height: 115%;">Все необходимые части программы должны быть представлены и полностью реализованы.<o:p></o:p></span></div><div class="MsoListParagraphCxSpMiddle" style="margin-left: 64.35pt; mso-add-space: auto; mso-list: l8 level1 lfo2; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: -18.0pt;"><span style="font-family: Symbol; line-height: 115%;">·<span style="font: normal normal normal 7pt/normal 'Times New Roman';"> </span></span><b style="mso-bidi-font-weight: normal;"><span style="line-height: 115%;">краткость<o:p></o:p></span></b></div><div class="MsoListParagraphCxSpMiddle" style="margin-left: 64.35pt; mso-add-space: auto; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify;"><span style="line-height: 115%;">Отсутствие лишней, дублирующейся информации. Повторяющиеся части кода должны быть преобразованы в вызов общей процедуры. То же касается и документации.<o:p></o:p></span></div><div class="MsoListParagraphCxSpMiddle" style="margin-left: 64.35pt; mso-add-space: auto; mso-list: l8 level1 lfo2; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: -18.0pt;"><span style="font-family: Symbol; line-height: 115%;">·<span style="font: normal normal normal 7pt/normal 'Times New Roman';"> </span></span><b style="mso-bidi-font-weight: normal;"><span style="line-height: 115%;">портируемость<o:p></o:p></span></b></div><div class="MsoListParagraphCxSpMiddle" style="margin-left: 64.35pt; mso-add-space: auto; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify;"><span style="line-height: 115%;">Лёгкость в адаптации программы к другому окружению: другой архитектуре, платформе, операционной системе или её версии.<o:p></o:p></span></div><div class="MsoListParagraphCxSpMiddle" style="margin-left: 64.35pt; mso-add-space: auto; mso-list: l8 level1 lfo2; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: -18.0pt;"><span style="font-family: Symbol; line-height: 115%;">·<span style="font: normal normal normal 7pt/normal 'Times New Roman';"> </span></span><b style="mso-bidi-font-weight: normal;"><span style="line-height: 115%;">согласованность<o:p></o:p></span></b></div><div class="MsoListParagraphCxSpMiddle" style="margin-left: 64.35pt; mso-add-space: auto; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify;"><span style="line-height: 115%;">По всей программе и в документации должны использоваться одни и те же соглашения, форматы и обозначения.<o:p></o:p></span></div><div class="MsoListParagraphCxSpMiddle" style="margin-left: 64.35pt; mso-add-space: auto; mso-list: l8 level1 lfo2; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: -18.0pt;"><span style="font-family: Symbol; line-height: 115%;">·<span style="font: normal normal normal 7pt/normal 'Times New Roman';"> </span></span><b style="mso-bidi-font-weight: normal;"><span style="line-height: 115%;">сопровождаемость<o:p></o:p></span></b></div><div class="MsoListParagraphCxSpMiddle" style="margin-left: 64.35pt; mso-add-space: auto; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify;"><span style="line-height: 115%;">Насколько сложно изменить программу для удовлетворения новых требований. Это требование также указывает, что программа должна быть хорошо документирована, не слишком запутана, и иметь резерв роста по использованию ресурсов (память, процессор).<o:p></o:p></span></div><div class="MsoListParagraphCxSpMiddle" style="margin-left: 64.35pt; mso-add-space: auto; mso-list: l8 level1 lfo2; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: -18.0pt;"><span style="font-family: Symbol; line-height: 115%;">·<span style="font: normal normal normal 7pt/normal 'Times New Roman';"> </span></span><b style="mso-bidi-font-weight: normal;"><span style="line-height: 115%;">тестируемость<o:p></o:p></span></b></div><div class="MsoListParagraphCxSpMiddle" style="margin-left: 64.35pt; mso-add-space: auto; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify;"><span style="line-height: 115%;">Позволяет ли программа выполнить проверку реализованных в программе методов, классов, поддерживается ли возможность измерения производительности.<o:p></o:p></span></div><div class="MsoListParagraphCxSpMiddle" style="margin-left: 64.35pt; mso-add-space: auto; mso-list: l8 level1 lfo2; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: -18.0pt;"><span style="font-family: Symbol; line-height: 115%;">·<span style="font: normal normal normal 7pt/normal 'Times New Roman';"> </span></span><b style="mso-bidi-font-weight: normal;"><span style="line-height: 115%;">удобство использования<o:p></o:p></span></b></div><div class="MsoListParagraphCxSpMiddle" style="margin-left: 64.35pt; mso-add-space: auto; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify;"><span style="line-height: 115%;">Простота и удобство использования программы. Это требование относится прежде всего к интерфейсу пользователя.<o:p></o:p></span></div><div class="MsoListParagraphCxSpMiddle" style="margin-left: 64.35pt; mso-add-space: auto; mso-list: l8 level1 lfo2; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: -18.0pt;"><span style="font-family: Symbol; line-height: 115%;">·<span style="font: normal normal normal 7pt/normal 'Times New Roman';"> </span></span><b style="mso-bidi-font-weight: normal;"><span style="line-height: 115%;">надёжность<o:p></o:p></span></b></div><div class="MsoListParagraphCxSpMiddle" style="margin-left: 64.35pt; mso-add-space: auto; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify;"><span style="line-height: 115%;">отсутствие отказов и сбоев в работе программ, а также простота исправления дефектов и ошибок:<o:p></o:p></span></div><div class="MsoListParagraphCxSpMiddle" style="margin-left: 64.35pt; mso-add-space: auto; mso-list: l8 level1 lfo2; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: -18.0pt;"><span style="font-family: Symbol; line-height: 115%;">·<span style="font: normal normal normal 7pt/normal 'Times New Roman';"> </span></span><b style="mso-bidi-font-weight: normal;"><span style="line-height: 115%;">структурированность<o:p></o:p></span></b></div><div class="MsoListParagraphCxSpMiddle" style="margin-left: 64.35pt; mso-add-space: auto; mso-list: l8 level1 lfo2; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: -18.0pt;"><span style="font-family: Symbol; line-height: 115%;">·<span style="font: normal normal normal 7pt/normal 'Times New Roman';"> </span></span><b style="mso-bidi-font-weight: normal;"><span style="line-height: 115%;">эффективность<o:p></o:p></span></b></div><div class="MsoListParagraphCxSpMiddle" style="margin-left: 64.35pt; mso-add-space: auto; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify;"><span style="line-height: 115%;">Насколько рационально программа относится к ресурсам (память, процессор) при выполнении своих задач.<o:p></o:p></span></div><div class="MsoListParagraphCxSpLast" style="margin-left: 64.35pt; mso-add-space: auto; mso-list: l8 level1 lfo2; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: -18.0pt;"><span style="font-family: Symbol; line-height: 115%;">·<span style="font: normal normal normal 7pt/normal 'Times New Roman';"> </span></span><b style="mso-bidi-font-weight: normal;"><span style="line-height: 115%;">безопасность<o:p></o:p></span></b></div><div class="MsoNormal" style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: 1.0cm;"><br />
</div><h2 style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto;"><span style="font-family: Calibri, sans-serif; font-size: 11pt; line-height: 115%;">С точки зрения пользователя</span><span style="font-family: Calibri, sans-serif; font-size: 11pt; line-height: 115%;"><o:p></o:p></span></h2><div class="MsoNormal" style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: 1.0cm;"><span style="line-height: 115%;">Помимо технического взгляда на качество ПО, существует и оценка качества с позиции пользователя. Для этого аспекта качества иногда используют термин «юзабилити»</span><span style="font-size: 10pt; line-height: 115%;"> </span><span style="line-height: 115%;">(англ. usability — дословно «возможность использования», «способность быть использованным», «полезность»). Довольно сложно получить оценку юзабилити для заданного программного продукта. Наиболее важные из вопросов, влияющих на оценку:<o:p></o:p></span></div><div class="MsoListParagraphCxSpFirst" style="margin-left: 64.35pt; mso-add-space: auto; mso-list: l8 level1 lfo2; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: -18.0pt;"><span style="font-family: Symbol; line-height: 115%;">·<span style="font: normal normal normal 7pt/normal 'Times New Roman';"> </span></span><span style="line-height: 115%;">Является ли пользовательский интерфейс интуитивно понятным?<o:p></o:p></span></div><div class="MsoListParagraphCxSpMiddle" style="margin-left: 64.35pt; mso-add-space: auto; mso-list: l8 level1 lfo2; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: -18.0pt;"><span style="font-family: Symbol; line-height: 115%;">·<span style="font: normal normal normal 7pt/normal 'Times New Roman';"> </span></span><span style="line-height: 115%;">Насколько просто выполнять простые, частые операции?<o:p></o:p></span></div><div class="MsoListParagraphCxSpMiddle" style="margin-left: 64.35pt; mso-add-space: auto; mso-list: l8 level1 lfo2; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: -18.0pt;"><span style="font-family: Symbol; line-height: 115%;">·<span style="font: normal normal normal 7pt/normal 'Times New Roman';"> </span></span><span style="line-height: 115%;">Насколько легко выполняются сложные операции?<o:p></o:p></span></div><div class="MsoListParagraphCxSpMiddle" style="margin-left: 64.35pt; mso-add-space: auto; mso-list: l8 level1 lfo2; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: -18.0pt;"><span style="font-family: Symbol; line-height: 115%;">·<span style="font: normal normal normal 7pt/normal 'Times New Roman';"> </span></span><span style="line-height: 115%;">Выдаёт ли программа понятные сообщения об ошибках?<o:p></o:p></span></div><div class="MsoListParagraphCxSpMiddle" style="margin-left: 64.35pt; mso-add-space: auto; mso-list: l8 level1 lfo2; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: -18.0pt;"><span style="font-family: Symbol; line-height: 115%;">·<span style="font: normal normal normal 7pt/normal 'Times New Roman';"> </span></span><span style="line-height: 115%;">Всегда ли программа ведёт себя так, как ожидается?<o:p></o:p></span></div><div class="MsoListParagraphCxSpMiddle" style="margin-left: 64.35pt; mso-add-space: auto; mso-list: l8 level1 lfo2; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: -18.0pt;"><span style="font-family: Symbol; line-height: 115%;">·<span style="font: normal normal normal 7pt/normal 'Times New Roman';"> </span></span><span style="line-height: 115%;">Имеется ли документация и насколько она полна?<o:p></o:p></span></div><div class="MsoListParagraphCxSpMiddle" style="margin-left: 64.35pt; mso-add-space: auto; mso-list: l8 level1 lfo2; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: -18.0pt;"><span style="font-family: Symbol; line-height: 115%;">·<span style="font: normal normal normal 7pt/normal 'Times New Roman';"> </span></span><span style="line-height: 115%;">Является ли интерфейс пользователя само-описательным/само-документирующим?<o:p></o:p></span></div><div class="MsoListParagraphCxSpLast" style="margin-left: 64.35pt; mso-add-space: auto; mso-list: l8 level1 lfo2; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: -18.0pt;"><span style="font-family: Symbol; line-height: 115%;">·<span style="font: normal normal normal 7pt/normal 'Times New Roman';"> </span></span><span style="line-height: 115%;">Всегда ли задержки с ответом программы являются приемлемыми?<o:p></o:p></span></div><div class="MsoNormal" style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: 1.0cm;"><br />
</div><h1 style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto;"><span style="font-family: Calibri, sans-serif; font-size: 16pt; line-height: 115%;">Методы улучшения качества кода: рефакторинг.</span><span style="font-family: Calibri, sans-serif; font-size: 16pt; line-height: 115%;"><o:p></o:p></span></h1><div class="MsoNormal" style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto;"><br />
</div><div class="MsoNormal" style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: 1.0cm;"><span style="line-height: 115%;">Рефакторинг — процесс изменения внутренней структуры программы, не затрагивающий её внешнего поведения и имеющий целью облегчить понимание её работы. В основе рефакторинга лежит последовательность небольших эквивалентных (то есть сохраняющих поведение) преобразований. Поскольку каждое преобразование маленькое, программисту легче проследить за его правильностью, и в то же время вся последовательность может привести к существенной перестройке программы и улучшению её согласованности и четкости. Рефакторинг позволяет разрабатывать архитектуру программы постепенно, откладывая проектные решения до тех пор, пока не станет более ясной их необходимость.<o:p></o:p></span></div><div class="MsoNormal" style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: 1.0cm;"><br />
</div><h2 style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto;"><span style="font-size: 11pt; line-height: 115%;">Цели рефакторинга</span><span style="font-size: 11pt; line-height: 115%;"><o:p></o:p></span></h2><div class="MsoNormal" style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: 1.0cm;"><span style="line-height: 115%;">Цель рефакторинга — сделать код программы более легким для понимания; без этого рефакторинг нельзя считать успешным. Рефакторинг следует отличать от оптимизации производительности. Как и рефакторинг, оптимизация обычно не изменяет поведение программы, а только ускоряет ее работу. Но оптимизация часто затрудняет понимание кода, что противоположно рефакторингу. С другой стороны, нужно отличать рефакторинг от реинжиниринга, который осуществляется для расширения функциональности программного обеспечения. Как правило, крупные рефакторинги предваряют реинжиниринг.<o:p></o:p></span></div><div class="MsoNormal" style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: 1.0cm;"><br />
</div><h2 style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto;"><span style="font-size: 11pt; line-height: 115%;">Причины применения рефакторинга</span><span style="font-size: 11pt; line-height: 115%;"><o:p></o:p></span></h2><div class="MsoNormal" style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: 1.0cm;"><span style="line-height: 115%;">Рефакторинг нужно применять постоянно при разработке кода. Основными стимулами его проведения являются следующие задачи:<o:p></o:p></span></div><div class="MsoListParagraphCxSpFirst" style="margin-left: 64.35pt; mso-add-space: auto; mso-list: l12 level1 lfo3; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: -18.0pt;"><span style="font-family: Symbol; line-height: 115%;">·<span style="font: normal normal normal 7pt/normal 'Times New Roman';"> </span></span><span style="line-height: 115%;">Необходимо добавить новую функцию, которая не достаточно укладывается в принятое архитектурное решение<o:p></o:p></span></div><div class="MsoListParagraphCxSpMiddle" style="margin-left: 64.35pt; mso-add-space: auto; mso-list: l12 level1 lfo3; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: -18.0pt;"><span style="font-family: Symbol; line-height: 115%;">·<span style="font: normal normal normal 7pt/normal 'Times New Roman';"> </span></span><span style="line-height: 115%;">Необходимо исправить ошибку, причины возникновения которой сразу не ясны<o:p></o:p></span></div><div class="MsoListParagraphCxSpLast" style="margin-left: 64.35pt; mso-add-space: auto; mso-list: l12 level1 lfo3; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: -18.0pt;"><span style="font-family: Symbol; line-height: 115%;">·<span style="font: normal normal normal 7pt/normal 'Times New Roman';"> </span></span><span style="line-height: 115%;">Трудности в командной разработке обусловлены сложной логикой программы<o:p></o:p></span></div><div class="MsoNormal" style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify;"><br />
</div><h2 style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto;"><span style="font-size: 11pt; line-height: 115%;">Какой код должен подвергаться рефакторингу</span><span style="font-size: 11pt; line-height: 115%;"><o:p></o:p></span></h2><div class="MsoNormal" style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: 1.0cm;"><span style="line-height: 115%;">Во многом при рефакторинге лучше полагаться на интуицию, основанную на опыте. Но можно выделить наиболее очевидные причины, когда код нужно подвергнуть рефакторингу:<o:p></o:p></span></div><div class="MsoListParagraphCxSpFirst" style="margin-left: 64.35pt; mso-add-space: auto; mso-list: l5 level1 lfo4; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: -18.0pt;"><span style="font-family: Symbol; line-height: 115%;">·<span style="font: normal normal normal 7pt/normal 'Times New Roman';"> </span></span><span style="line-height: 115%;">Дублирование кода<o:p></o:p></span></div><div class="MsoListParagraphCxSpMiddle" style="margin-left: 64.35pt; mso-add-space: auto; mso-list: l5 level1 lfo4; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: -18.0pt;"><span style="font-family: Symbol; line-height: 115%;">·<span style="font: normal normal normal 7pt/normal 'Times New Roman';"> </span></span><span style="line-height: 115%;">Длинный метод<o:p></o:p></span></div><div class="MsoListParagraphCxSpMiddle" style="margin-left: 64.35pt; mso-add-space: auto; mso-list: l5 level1 lfo4; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: -18.0pt;"><span style="font-family: Symbol; line-height: 115%;">·<span style="font: normal normal normal 7pt/normal 'Times New Roman';"> </span></span><span style="line-height: 115%;">Большой класс<o:p></o:p></span></div><div class="MsoListParagraphCxSpMiddle" style="margin-left: 64.35pt; mso-add-space: auto; mso-list: l5 level1 lfo4; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: -18.0pt;"><span style="font-family: Symbol; line-height: 115%;">·<span style="font: normal normal normal 7pt/normal 'Times New Roman';"> </span></span><span style="line-height: 115%;">Длинный список параметров<o:p></o:p></span></div><div class="MsoListParagraphCxSpMiddle" style="margin-left: 64.35pt; mso-add-space: auto; mso-list: l5 level1 lfo4; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: -18.0pt;"><span style="font-family: Symbol; line-height: 115%;">·<span style="font: normal normal normal 7pt/normal 'Times New Roman';"> </span></span><span style="line-height: 115%;">«Завистливые» функции — это метод, который чрезмерно обращается к данным другого объекта<o:p></o:p></span></div><div class="MsoListParagraphCxSpMiddle" style="margin-left: 64.35pt; mso-add-space: auto; mso-list: l5 level1 lfo4; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: -18.0pt;"><span style="font-family: Symbol; line-height: 115%;">·<span style="font: normal normal normal 7pt/normal 'Times New Roman';"> </span></span><span style="line-height: 115%;">Избыточные временные переменные<o:p></o:p></span></div><div class="MsoListParagraphCxSpMiddle" style="margin-left: 64.35pt; mso-add-space: auto; mso-list: l5 level1 lfo4; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: -18.0pt;"><span style="font-family: Symbol; line-height: 115%;">·<span style="font: normal normal normal 7pt/normal 'Times New Roman';"> </span></span><span style="line-height: 115%;">Классы данных<o:p></o:p></span></div><div class="MsoListParagraphCxSpMiddle" style="margin-left: 64.35pt; mso-add-space: auto; mso-list: l5 level1 lfo4; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: -18.0pt;"><span style="font-family: Symbol; line-height: 115%;">·<span style="font: normal normal normal 7pt/normal 'Times New Roman';"> </span></span><span style="line-height: 115%;">Несгруппированные данные<o:p></o:p></span></div><div class="MsoListParagraphCxSpLast" style="margin-left: 64.35pt; mso-add-space: auto; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify;"><br />
</div><h2 style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto;"><span style="font-size: 11pt; line-height: 115%;">Рефакторинг кода</span><span style="font-size: 11pt; line-height: 115%;"><o:p></o:p></span></h2><div class="MsoNormal" style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: 1.0cm;"><span style="line-height: 115%;">В программировании термин рефакторинг означает изменение исходного кода программы без изменения его внешнего поведения. В экстремальном программировании и других гибких методологиях рефакторинг является неотъемлемой частью цикла разработки ПО: разработчики попеременно то создают новые тесты и функциональность, то выполняют рефакторинг кода для улучшения его логичности и прозрачности. Автоматическое юнит-тестирование позволяет убедиться, что рефакторинг не разрушил существующую функциональность. Иногда под рефакторингом неправильно подразумевают коррекцию кода с заранее оговоренными правилами отступа, перевода строк, внесения комментариев и прочими визуально значимыми изменениями, которые никак не отражаются на процессе компиляции, с целью обеспечения лучшей читаемости кода.<o:p></o:p></span></div><div class="MsoNormal" style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: 1.0cm;"><span style="line-height: 115%;">Рефакторинг изначально не предназначен для исправления ошибок и добавления новой функциональности, он вообще не меняет поведение программного обеспечения. Но это помогает избежать ошибок и облегчить добавление функциональности. Он выполняется для улучшения понятности кода или изменения его структуры, для удаления «мёртвого кода» — всё это для того, чтобы в будущем код было легче поддерживать и развивать. В частности, добавление в программу нового поведения может оказаться сложным с существующей структурой — в этом случае разработчик может выполнить необходимый рефакторинг, а уже затем добавить новую функциональность.<o:p></o:p></span></div><div class="MsoNormal" style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: 1.0cm;"><span style="line-height: 115%;">Это может быть перемещение поля из одного класса в другой, вынесение фрагмента кода из метода и превращение его в самостоятельный метод или даже перемещение кода по иерархии классов. Каждый отдельный шаг может показаться элементарным, но совокупный эффект таких малых изменений в состоянии радикально улучшить проект или даже предотвратить распад плохо спроектированной программы.<o:p></o:p></span></div><div class="MsoNormal" style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: 1.0cm;"><br />
</div><h2 style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto;"><span style="font-size: 11pt; line-height: 115%;">Методы рефакторинга</span><span style="font-size: 11pt; line-height: 115%;"><o:p></o:p></span></h2><div class="MsoNormal" style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify;"><span style="line-height: 115%;">Наиболее употребимые методы рефакторинга:<o:p></o:p></span></div><div class="MsoListParagraphCxSpFirst" style="margin-left: 64.35pt; mso-add-space: auto; mso-list: l1 level1 lfo5; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: -18.0pt;"><span lang="EN-US" style="font-family: Symbol; line-height: 115%;">·<span style="font: normal normal normal 7pt/normal 'Times New Roman';"> </span></span><span style="line-height: 115%;">Изменение</span><span style="line-height: 115%;"> </span><span style="line-height: 115%;">сигнатуры</span><span style="line-height: 115%;"> </span><span style="line-height: 115%;">метода</span><span lang="EN-US" style="line-height: 115%;"> (Change Method Signature)<o:p></o:p></span></div><div class="MsoListParagraphCxSpMiddle" style="margin-left: 64.35pt; mso-add-space: auto; mso-list: l1 level1 lfo5; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: -18.0pt;"><span lang="EN-US" style="font-family: Symbol; line-height: 115%;">·<span style="font: normal normal normal 7pt/normal 'Times New Roman';"> </span></span><span style="line-height: 115%;">Инкапсуляция</span><span style="line-height: 115%;"> </span><span style="line-height: 115%;">поля</span><span lang="EN-US" style="line-height: 115%;"> (Encapsulate Field)<o:p></o:p></span></div><div class="MsoListParagraphCxSpMiddle" style="margin-left: 64.35pt; mso-add-space: auto; mso-list: l1 level1 lfo5; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: -18.0pt;"><span lang="EN-US" style="font-family: Symbol; line-height: 115%;">·<span style="font: normal normal normal 7pt/normal 'Times New Roman';"> </span></span><span style="line-height: 115%;">Выделение</span><span style="line-height: 115%;"> </span><span style="line-height: 115%;">класса</span><span lang="EN-US" style="line-height: 115%;"> (Extract Class)<o:p></o:p></span></div><div class="MsoListParagraphCxSpMiddle" style="margin-left: 64.35pt; mso-add-space: auto; mso-list: l1 level1 lfo5; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: -18.0pt;"><span lang="EN-US" style="font-family: Symbol; line-height: 115%;">·<span style="font: normal normal normal 7pt/normal 'Times New Roman';"> </span></span><span style="line-height: 115%;">Выделение</span><span style="line-height: 115%;"> </span><span style="line-height: 115%;">интерфейса</span><span lang="EN-US" style="line-height: 115%;"> (Extract Interface)<o:p></o:p></span></div><div class="MsoListParagraphCxSpMiddle" style="margin-left: 64.35pt; mso-add-space: auto; mso-list: l1 level1 lfo5; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: -18.0pt;"><span style="font-family: Symbol; line-height: 115%;">·<span style="font: normal normal normal 7pt/normal 'Times New Roman';"> </span></span><span style="line-height: 115%;">Выделение локальной переменной (</span><span lang="EN-US" style="line-height: 115%;">Extract</span><span lang="EN-US" style="line-height: 115%;"> </span><span lang="EN-US" style="line-height: 115%;">Local</span><span lang="EN-US" style="line-height: 115%;"> </span><span lang="EN-US" style="line-height: 115%;">Variable</span><span style="line-height: 115%;">)<o:p></o:p></span></div><div class="MsoListParagraphCxSpMiddle" style="margin-left: 64.35pt; mso-add-space: auto; mso-list: l1 level1 lfo5; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: -18.0pt;"><span lang="EN-US" style="font-family: Symbol; line-height: 115%;">·<span style="font: normal normal normal 7pt/normal 'Times New Roman';"> </span></span><span style="line-height: 115%;">Выделение</span><span style="line-height: 115%;"> </span><span style="line-height: 115%;">метода</span><span lang="EN-US" style="line-height: 115%;"> (Extract Method)<o:p></o:p></span></div><div class="MsoListParagraphCxSpMiddle" style="margin-left: 64.35pt; mso-add-space: auto; mso-list: l1 level1 lfo5; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: -18.0pt;"><span lang="EN-US" style="font-family: Symbol; line-height: 115%;">·<span style="font: normal normal normal 7pt/normal 'Times New Roman';"> </span></span><span style="line-height: 115%;">Генерализация</span><span style="line-height: 115%;"> </span><span style="line-height: 115%;">типа</span><span lang="EN-US" style="line-height: 115%;"> (Generalize Type)<o:p></o:p></span></div><div class="MsoListParagraphCxSpMiddle" style="margin-left: 64.35pt; mso-add-space: auto; mso-list: l1 level1 lfo5; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: -18.0pt;"><span lang="EN-US" style="font-family: Symbol; line-height: 115%;">·<span style="font: normal normal normal 7pt/normal 'Times New Roman';"> </span></span><span style="line-height: 115%;">Встраивание</span><span lang="EN-US" style="line-height: 115%;"> (Inline)<o:p></o:p></span></div><div class="MsoListParagraphCxSpMiddle" style="margin-left: 64.35pt; mso-add-space: auto; mso-list: l1 level1 lfo5; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: -18.0pt;"><span lang="EN-US" style="font-family: Symbol; line-height: 115%;">·<span style="font: normal normal normal 7pt/normal 'Times New Roman';"> </span></span><span style="line-height: 115%;">Введение</span><span style="line-height: 115%;"> </span><span style="line-height: 115%;">фабрики</span><span lang="EN-US" style="line-height: 115%;"> (Introduce Factory)<o:p></o:p></span></div><div class="MsoListParagraphCxSpMiddle" style="margin-left: 64.35pt; mso-add-space: auto; mso-list: l1 level1 lfo5; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: -18.0pt;"><span lang="EN-US" style="font-family: Symbol; line-height: 115%;">·<span style="font: normal normal normal 7pt/normal 'Times New Roman';"> </span></span><span style="line-height: 115%;">Введение</span><span style="line-height: 115%;"> </span><span style="line-height: 115%;">параметра</span><span lang="EN-US" style="line-height: 115%;"> (Introduce Parameter)<o:p></o:p></span></div><div class="MsoListParagraphCxSpMiddle" style="margin-left: 64.35pt; mso-add-space: auto; mso-list: l1 level1 lfo5; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: -18.0pt;"><span style="font-family: Symbol; line-height: 115%;">·<span style="font: normal normal normal 7pt/normal 'Times New Roman';"> </span></span><span style="line-height: 115%;">Подъём поля/метода (Pull Up)<o:p></o:p></span></div><div class="MsoListParagraphCxSpMiddle" style="margin-left: 64.35pt; mso-add-space: auto; mso-list: l1 level1 lfo5; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: -18.0pt;"><span style="font-family: Symbol; line-height: 115%;">·<span style="font: normal normal normal 7pt/normal 'Times New Roman';"> </span></span><span style="line-height: 115%;">Спуск поля/метода (Push Down)<o:p></o:p></span></div><div class="MsoListParagraphCxSpLast" style="margin-left: 64.35pt; mso-add-space: auto; mso-list: l1 level1 lfo5; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: -18.0pt;"><span style="font-family: Symbol; line-height: 115%;">·<span style="font: normal normal normal 7pt/normal 'Times New Roman';"> </span></span><span style="line-height: 115%;">Замена условного оператора полиморфизмом (Replace Conditional with Polymorphism)<o:p></o:p></span></div><div class="MsoNormal" style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify;"><br />
</div><div class="MsoNormal" style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: 1.0cm;"><b style="mso-bidi-font-weight: normal;"><span style="line-height: 115%;">Изменение</span></b><b style="mso-bidi-font-weight: normal;"><span style="line-height: 115%;"> </span></b><b style="mso-bidi-font-weight: normal;"><span style="line-height: 115%;">сигнатуры</span></b><b style="mso-bidi-font-weight: normal;"><span style="line-height: 115%;"> </span></b><b style="mso-bidi-font-weight: normal;"><span style="line-height: 115%;">метода</span></b><b style="mso-bidi-font-weight: normal;"><span lang="EN-US" style="line-height: 115%;"> (Change Method Signature)<o:p></o:p></span></b></div><div class="MsoNormal" style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: 1.0cm;"><span style="line-height: 115%;">Заключается в добавлении, изменении или удалении параметра метода. Изменив сигнатуру метода, необходимо скорректировать обращения к нему в коде всех клиентов. Это изменение может затронуть внешний интерфейс программы, кроме того, не всегда разработчику, изменяющему интерфейс, доступны все клиенты этого интерфейса, поэтому может потребоваться та или иная форма регистрации изменений интерфейса для последующей передачи их вместе с новой версией программы.<o:p></o:p></span></div><div class="MsoNormal" style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: 1.0cm;"><b style="mso-bidi-font-weight: normal;"><span style="line-height: 115%;">Инкапсуляция поля (Encapsulate field)<o:p></o:p></span></b></div><div class="MsoNormal" style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: 1.0cm;"><span style="line-height: 115%;">В случае, если у класса имеется открытое поле, необходимо сделать его закрытым и обеспечить методы доступа. После «Инкапсуляции поля» часто применяется «Перемещение метода».<o:p></o:p></span></div><div class="MsoNormal" style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: 1.0cm;"><b style="mso-bidi-font-weight: normal;"><span style="line-height: 115%;">Выделение метода (Extract Method)<o:p></o:p></span></b></div><div class="MsoNormal" style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: 1.0cm;"><span style="line-height: 115%;">Заключается в выделении из длинного и/или требующего комментариев кода отдельных фрагментов и преобразовании их в отдельные методы, с подстановкой подходящих вызовов в местах использования. В этом случае действует правило: если фрагмент кода требует комментария о том, что он делает, то он должен быть выделен в отдельный метод. Также правило: один метод не должен занимать более чем один экран (25-50 строк, в зависимости от условий редактирования), в противном случае некоторые его фрагменты имеют самостоятельную ценность и подлежат выделению. Из анализа связей выделяемого фрагмента с окружающим контекстом делается вывод о перечне параметров нового метода и его локальных переменных.<o:p></o:p></span></div><div class="MsoNormal" style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: 1.0cm;"><b style="mso-bidi-font-weight: normal;"><span style="line-height: 115%;">Перемещение метода (Move Method)<o:p></o:p></span></b></div><div class="MsoNormal" style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: 1.0cm;"><span style="line-height: 115%;">Применяется по отношению к методу, который чаще обращается к другому классу, чем к тому, в котором сам располагается.<o:p></o:p></span></div><div class="MsoNormal" style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: 1.0cm;"><b style="mso-bidi-font-weight: normal;"><span style="line-height: 115%;">Замена условного оператора полиморфизмом (Replace Conditional with Polymorphism)<o:p></o:p></span></b></div><div class="MsoNormal" style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: 1.0cm;"><span style="line-height: 115%;">Условный оператор с несколькими ветвями заменяется вызовом полиморфного метода некоторого базового класса, имеющего подклассы для каждой ветви исходного оператора. Выбор ветви осуществляется неявно, в зависимости от того, экземпляру какого из подклассов оказался адресован вызов.<o:p></o:p></span></div><div class="MsoNormal" style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: 1.0cm;"><span style="line-height: 115%;">Основные принципы:<o:p></o:p></span></div><div class="MsoListParagraphCxSpFirst" style="margin-left: 64.35pt; mso-add-space: auto; mso-list: l3 level1 lfo7; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: -18.0pt;"><span style="line-height: 115%;">1.<span style="font: normal normal normal 7pt/normal 'Times New Roman';"> </span></span><span style="line-height: 115%;">вначале следует создать базовый класс и нужное число подклассов<o:p></o:p></span></div><div class="MsoListParagraphCxSpMiddle" style="margin-left: 64.35pt; mso-add-space: auto; mso-list: l3 level1 lfo7; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: -18.0pt;"><span style="line-height: 115%;">2.<span style="font: normal normal normal 7pt/normal 'Times New Roman';"> </span></span><span style="line-height: 115%;">в некоторых случаях следует провести оптимизацию условного оператора путем «Выделения метода»<o:p></o:p></span></div><div class="MsoListParagraphCxSpMiddle" style="margin-left: 64.35pt; mso-add-space: auto; mso-list: l3 level1 lfo7; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: -18.0pt;"><span style="line-height: 115%;">3.<span style="font: normal normal normal 7pt/normal 'Times New Roman';"> </span></span><span style="line-height: 115%;">возможно использование «Перемещения метода», чтобы поместить условный оператор в вершину иерархии наследования<o:p></o:p></span></div><div class="MsoListParagraphCxSpMiddle" style="margin-left: 64.35pt; mso-add-space: auto; mso-list: l3 level1 lfo7; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: -18.0pt;"><span style="line-height: 115%;">4.<span style="font: normal normal normal 7pt/normal 'Times New Roman';"> </span></span><span style="line-height: 115%;">выбрав один из подклассов, нужно конкретизировать в нём полиморфный метод базового класса и переместить в него тело соответствующей ветви условного оператора.<o:p></o:p></span></div><div class="MsoListParagraphCxSpMiddle" style="margin-left: 64.35pt; mso-add-space: auto; mso-list: l3 level1 lfo7; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: -18.0pt;"><span style="line-height: 115%;">5.<span style="font: normal normal normal 7pt/normal 'Times New Roman';"> </span></span><span style="line-height: 115%;">повторить предыдущее действие для каждой ветви условного оператора<o:p></o:p></span></div><div class="MsoListParagraphCxSpLast" style="margin-left: 64.35pt; mso-add-space: auto; mso-list: l3 level1 lfo7; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: -18.0pt;"><span style="line-height: 115%;">6.<span style="font: normal normal normal 7pt/normal 'Times New Roman';"> </span></span><span style="line-height: 115%;">заменить весь условный оператор вызовом полиморфного метода базового класса<o:p></o:p></span></div><div class="MsoNormal" style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: 1.0cm;"><br />
</div><h2 style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto;"><span style="font-size: 11pt; line-height: 115%;">Проблемы, возникающие при проведении рефакторинга</span><span style="font-size: 11pt; line-height: 115%;"><o:p></o:p></span></h2><div class="MsoListParagraphCxSpFirst" style="margin-left: 64.35pt; mso-add-space: auto; mso-list: l2 level1 lfo6; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: -18.0pt;"><span style="font-family: Symbol; line-height: 115%;">·<span style="font: normal normal normal 7pt/normal 'Times New Roman';"> </span></span><span style="line-height: 115%;">проблемы, связанные с базами данных<o:p></o:p></span></div><div class="MsoListParagraphCxSpMiddle" style="margin-left: 64.35pt; mso-add-space: auto; mso-list: l2 level1 lfo6; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: -18.0pt;"><span style="font-family: Symbol; line-height: 115%;">·<span style="font: normal normal normal 7pt/normal 'Times New Roman';"> </span></span><span style="line-height: 115%;">проблемы изменения интерфейсов<o:p></o:p></span></div><div class="MsoListParagraphCxSpLast" style="margin-left: 64.35pt; mso-add-space: auto; mso-list: l2 level1 lfo6; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: -18.0pt;"><span style="font-family: Symbol; line-height: 115%;">·<span style="font: normal normal normal 7pt/normal 'Times New Roman';"> </span></span><span style="line-height: 115%;">трудности при изменении дизайна<o:p></o:p></span></div><div class="MsoNormal" style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify;"><br />
</div><h1 style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto;"><span style="font-size: 16pt; line-height: 115%;">Реинжиниринг программного обеспечения.</span><span style="font-size: 16pt; line-height: 115%;"><o:p></o:p></span></h1><div class="MsoNormal" style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto;"><br />
</div><div class="MsoNormal" style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: 1.0cm;"><span style="line-height: 115%;">Реинжиниринг программного обеспечения — процесс создания новой функциональности или устранения ошибок, путём революционного изменения, но используя уже имеющееся в эксплуатации программное обеспечение. Процесс</span><span style="line-height: 115%;"> </span><span style="line-height: 115%;">реинжиниринга</span><span style="line-height: 115%;"> </span><span style="line-height: 115%;">описан</span><span lang="EN-US" style="line-height: 115%;"> Chikofsky </span><span style="line-height: 115%;">и</span><span style="line-height: 115%;"> </span><span style="line-height: 115%;">Кроссом</span><span style="line-height: 115%;"> </span><span style="line-height: 115%;">в</span><span style="line-height: 115%;"> </span><span style="line-height: 115%;">их</span><span style="line-height: 115%;"> </span><span style="line-height: 115%;">труде</span><span lang="EN-US" style="line-height: 115%;"> 1990 </span><span style="line-height: 115%;">года</span><span lang="EN-US" style="line-height: 115%;">, </span><span style="line-height: 115%;">как</span><span lang="EN-US" style="line-height: 115%;"> «The examination and alteration of a system to reconstitute it in a new form». </span><span style="line-height: 115%;">Выражаясь менее формально, реинжиниринг является изменением системы программного обеспечения после проведения обратного инжиниринга.<o:p></o:p></span></div><div class="MsoNormal" style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: 1.0cm;"><br />
</div><h2 style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto;"><span style="font-size: 11pt; line-height: 115%;">Сложность реинжиниринга</span><span style="font-size: 11pt; line-height: 115%;"><o:p></o:p></span></h2><div class="MsoNormal" style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: 1.0cm;"><span style="line-height: 115%;">Как правило, утверждается, что "легче разработать новый программный продукт". Это связано со следующими проблемами:<o:p></o:p></span></div><div class="MsoListParagraphCxSpFirst" style="margin-left: 64.35pt; mso-add-space: auto; mso-list: l13 level1 lfo9; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: -18.0pt;"><span style="line-height: 115%;">1.<span style="font: normal normal normal 7pt/normal 'Times New Roman';"> </span></span><span style="line-height: 115%;">Обычному программисту сложно разобраться в чужом исходном коде<o:p></o:p></span></div><div class="MsoListParagraphCxSpMiddle" style="margin-left: 64.35pt; mso-add-space: auto; mso-list: l13 level1 lfo9; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: -18.0pt;"><span style="line-height: 115%;">2.<span style="font: normal normal normal 7pt/normal 'Times New Roman';"> </span></span><span style="line-height: 115%;">Реинжиниринг чаще всего дороже разработки нового программного обеспечения, т.к. требуется убрать ограничения предыдущих версий, но при этом оставить совместимость с предыдущими версиями<o:p></o:p></span></div><div class="MsoListParagraphCxSpLast" style="margin-left: 64.35pt; mso-add-space: auto; mso-list: l13 level1 lfo9; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: -18.0pt;"><span style="line-height: 115%;">3.<span style="font: normal normal normal 7pt/normal 'Times New Roman';"> </span></span><span style="line-height: 115%;">Реинжиниринг не может сделать программист низкой и средней квалификации. Даже профессионалы часто не могут качественно реализовать его. Поэтому требуется работа программистов с большим опытом переделки программ и знанием различных технологий.<o:p></o:p></span></div><div class="MsoNormal" style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: 1.0cm;"><span style="line-height: 115%;">В то же время, если изначально программа обладала строгой и ясной архитектурой, то провести реинжиниринг будет на порядок проще. Поэтому при проектировании как правило анализируется, что выгоднее провести реинжиниринг или разработать программный продукт "с нуля".<o:p></o:p></span></div><div class="MsoNormal" style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: 1.0cm;"><br />
</div><h1 style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto;"><span style="font-size: 16pt; line-height: 115%;">Тестирование программного обеспечения.</span><span style="font-size: 16pt; line-height: 115%;"><o:p></o:p></span></h1><div class="MsoNormal" style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto;"><br />
</div><div class="MsoNormal" style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: 1.0cm;"><b style="mso-bidi-font-weight: normal;"><span style="line-height: 115%;">Тестирование программного обеспечения</span></b><span style="line-height: 115%;"> — процесс исследования программного обеспечения (ПО) с целью получения информации о качестве продукта.<o:p></o:p></span></div><div class="MsoNormal" style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: 1.0cm;"><br />
</div><h2 style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify;"><a href="http://www.blogger.com/post-edit.g?blogID=4678276506533150023&postID=5584380054334386024" name="_Toc254033492"><span style="font-size: 11pt; line-height: 115%;">Введение</span></a><span style="font-size: 11pt; line-height: 115%;"><o:p></o:p></span></h2><div class="MsoNormal" style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: 1.0cm;"><span style="line-height: 115%;">Существующие на сегодняшний день методы тестирования ПО не позволяют однозначно и полностью выявить все дефекты и установить корректность функционирования анализируемой программы, поэтому все существующие методы тестирования действуют в рамках формального процесса проверки исследуемого или разрабатываемого ПО.<o:p></o:p></span></div><div class="MsoNormal" style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: 1.0cm;"><span style="line-height: 115%;">Такой процесс формальной проверки или верификации может доказать, что дефекты отсутствуют с точки зрения используемого метода. (То есть нет никакой возможности точно установить или гарантировать отсутствие дефектов в программном продукте с учётом человеческого фактора, присутствующего на всех этапах жизненного цикла ПО).<o:p></o:p></span></div><div class="MsoNormal" style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: 1.0cm;"><span style="line-height: 115%;">Существует множество подходов к решению задачи тестирования и верификации ПО, но эффективное тестирование сложных программных продуктов — это процесс в высшей степени творческий, не сводящийся к следованию строгим и чётким процедурам или созданию таковых.<o:p></o:p></span></div><div class="MsoNormal" style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: 1.0cm;"><span style="line-height: 115%;">С точки зрения ISO 9126, Качество (программных средств) можно определить как совокупную характеристику исследуемого ПО с учётом следующих составляющих:<o:p></o:p></span></div><div class="MsoListParagraphCxSpFirst" style="margin-left: 64.35pt; mso-add-space: auto; mso-list: l21 level1 lfo10; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: -18.0pt;"><span style="font-family: Symbol; line-height: 115%;">·<span style="font: normal normal normal 7pt/normal 'Times New Roman';"> </span></span><span style="line-height: 115%;">Надёжность<o:p></o:p></span></div><div class="MsoListParagraphCxSpMiddle" style="margin-left: 64.35pt; mso-add-space: auto; mso-list: l21 level1 lfo10; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: -18.0pt;"><span style="font-family: Symbol; line-height: 115%;">·<span style="font: normal normal normal 7pt/normal 'Times New Roman';"> </span></span><span style="line-height: 115%;">Сопровождаемость<o:p></o:p></span></div><div class="MsoListParagraphCxSpMiddle" style="margin-left: 64.35pt; mso-add-space: auto; mso-list: l21 level1 lfo10; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: -18.0pt;"><span style="font-family: Symbol; line-height: 115%;">·<span style="font: normal normal normal 7pt/normal 'Times New Roman';"> </span></span><span style="line-height: 115%;">Практичность<o:p></o:p></span></div><div class="MsoListParagraphCxSpMiddle" style="margin-left: 64.35pt; mso-add-space: auto; mso-list: l21 level1 lfo10; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: -18.0pt;"><span style="font-family: Symbol; line-height: 115%;">·<span style="font: normal normal normal 7pt/normal 'Times New Roman';"> </span></span><span style="line-height: 115%;">Эффективность<o:p></o:p></span></div><div class="MsoListParagraphCxSpMiddle" style="margin-left: 64.35pt; mso-add-space: auto; mso-list: l21 level1 lfo10; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: -18.0pt;"><span style="font-family: Symbol; line-height: 115%;">·<span style="font: normal normal normal 7pt/normal 'Times New Roman';"> </span></span><span style="line-height: 115%;">Мобильность<o:p></o:p></span></div><div class="MsoListParagraphCxSpLast" style="margin-left: 64.35pt; mso-add-space: auto; mso-list: l21 level1 lfo10; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: -18.0pt;"><span style="font-family: Symbol; line-height: 115%;">·<span style="font: normal normal normal 7pt/normal 'Times New Roman';"> </span></span><span style="line-height: 115%;">Функциональность<o:p></o:p></span></div><div class="MsoNormal" style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: 1.0cm;"><span style="line-height: 115%;">Более полный список атрибутов и критериев можно найти в стандарте ISO 9126 Международной организации по стандартизации. Состав и содержание документации, сопутствующей процессу тестирования, определяется стандартом IEEE 829-1998 Standard for Software Test Documentation.<o:p></o:p></span></div><div class="MsoNormal" style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: 1.0cm;"><br />
</div><h2><span style="font-size: 11pt; line-height: 115%;">История развития тестирования программного обеспечения</span><span style="font-size: 11pt; line-height: 115%;"><o:p></o:p></span></h2><div class="MsoNormal" style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: 1.0cm;"><span style="line-height: 115%;">Первые программные системы разрабатывались в рамках программ научных исследований или программ для нужд министерств обороны. Тестирование таких продуктов проводилось строго формализованно с записью всех тестовых процедур, тестовых данных, полученных результатов. Тестирование выделялось в отдельный процесс, который начинался после завершения кодирования, но при этом, как правило, выполнялось тем же персоналом.<o:p></o:p></span></div><div class="MsoNormal" style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: 1.0cm;"><span style="line-height: 115%;">В 1960-х много внимания уделялось «исчерпывающему» тестированию, которое должно проводиться с использованием всех путей в коде или всех возможных входных данных. Было отмечено, что в этих условиях полное тестирование ПО невозможно, потому что, во-первых, количество возможных входных данных очень велико, во-вторых, существует множество путей, в-третьих, сложно найти проблемы в архитектуре и спецификациях. По этим причинам «исчерпывающее» тестирование было отклонено и признано теоретически невозможным.<o:p></o:p></span></div><div class="MsoNormal" style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: 1.0cm;"><span style="line-height: 115%;">В начале 1970-х тестирование ПО обозначалось как «процесс, направленный на демонстрацию корректности продукта» или как «деятельность по подтверждению правильности работы ПО». В зарождавшейся программной инженерии верификация ПО значилась как «доказательство правильности». Хотя концепция была теоретически перспективной, на практике она требовала много времени и была недостаточно всеобъемлющей. Было решено, что доказательство правильности — неэффективный метод тестирования ПО. Однако, в некоторых случаях демонстрация правильной работы используется и в наши дни, например, приемо-сдаточные испытания. Во второй половине 1970-х тестирование представлялось как выполнение программы с намерением найти ошибки, а не доказать, что она работает. Успешный тест — это тест, который обнаруживает ранее неизвестные проблемы. Данный подход прямо противоположен предыдущему. Указанные два определения представляют собой «парадокс тестирования», в основе которого лежат два противоположных утверждения: с одной стороны, тестирование позволяет убедиться, что продукт работает хорошо, а с другой — выявляет ошибки в ПО, показывая, что продукт не работает. Вторая цель тестирования является более продуктивной с точки зрения улучшения качества, так как не позволяет игнорировать недостатки ПО.<o:p></o:p></span></div><div class="MsoNormal" style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: 1.0cm;"><span style="line-height: 115%;">В 1980-х тестирование расширилось таким понятием, как предупреждение дефектов. Проектирование тестов — наиболее эффективный из известных методов предупреждения ошибок. В это же время стали высказываться мысли, что необходима методология тестирования, в частности, что тестирование должно включать проверки на всем протяжении цикла разработки, и это должен быть управляемый процесс. В ходе тестирования надо проверить не только собранную программу, но и требования, код, архитектуру, сами тесты. «Традиционное» тестирование, существовавшее до начала 1980-х, относилось только к скомпилированной, готовой системе (сейчас это обычно называется системное тестирование), но в дальнейшем тестировщики стали вовлекаться во все аспекты жизненного цикла разработки. Это позволяло раньше находить проблемы в требованиях и архитектуре и тем самым сокращать сроки и бюджет разработки. В середине 1980-х появились первые инструменты для автоматизированного тестирования. Предполагалось, что компьютер сможет выполнить больше тестов, чем человек, и сделает это более надежно. Поначалу эти инструменты были крайне простыми и не имели возможности написания сценариев на скриптовых языках.<o:p></o:p></span></div><div class="MsoNormal" style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: 1.0cm;"><span style="line-height: 115%;">В начале 1990-х в понятие «тестирование» стали включать планирование, проектирование, создание, поддержку и выполнение тестов и тестовых окружений, и это означало переход от тестирования к обеспечению качества, охватывающего весь цикл разработки ПО. В это время начинают появляться различные программные инструменты для поддержки процесса тестирования: более продвинутые среды для автоматизации с возможностью создания скриптов и генерации отчетов, системы управления тестами, ПО для проведения нагрузочного тестирования. В середине 1990-х с развитием интернета и разработкой большого количества веб-приложений особую популярность стало получать «гибкое тестирование» (по аналогии с гибкими методологиями программирования).<o:p></o:p></span></div><div class="MsoNormal" style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: 1.0cm;"><span style="line-height: 115%;">В 2000-х появилось еще более широкое определение тестирования, когда в него было добавлено понятие «оптимизация бизнес-технологий» (en:business technology optimization, BTO). BTO направляет развитие информационных технологий в соответствии с целями бизнеса. Основной подход заключается в оценке и максимизации значимости всех этапов жизненного цикла разработки ПО для достижения необходимого уровня качества, производительности, доступности.<o:p></o:p></span></div><div class="MsoNormal" style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: 1.0cm;"><br />
</div><h2><span style="font-size: 11pt; line-height: 115%;">Тестирование программного обеспечения</span><span style="font-size: 11pt; line-height: 115%;"><o:p></o:p></span></h2><div class="MsoNormal" style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: 1.0cm;"><span style="line-height: 115%;">Существует несколько признаков, по которым принято производить классификацию видов тестирования. Обычно выделяют следующие:<o:p></o:p></span></div><div class="MsoNormal" style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: 1.0cm;"><b style="mso-bidi-font-weight: normal;"><span style="line-height: 115%;">По объекту тестирования:<o:p></o:p></span></b></div><div class="MsoListParagraphCxSpFirst" style="margin-left: 64.35pt; mso-add-space: auto; mso-list: l10 level1 lfo11; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: -18.0pt;"><span style="font-family: Symbol; line-height: 115%;">·<span style="font: normal normal normal 7pt/normal 'Times New Roman';"> </span></span><span style="line-height: 115%;">Функциональное тестирование (functional testing)<o:p></o:p></span></div><div class="MsoListParagraphCxSpMiddle" style="margin-left: 64.35pt; mso-add-space: auto; mso-list: l10 level1 lfo11; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: -18.0pt;"><span style="font-family: Symbol; line-height: 115%;">·<span style="font: normal normal normal 7pt/normal 'Times New Roman';"> </span></span><span style="line-height: 115%;">Нагрузочное тестирование <o:p></o:p></span></div><div class="MsoListParagraphCxSpMiddle" style="margin-left: 64.35pt; mso-add-space: auto; mso-list: l10 level1 lfo11; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: -18.0pt;"><span style="font-family: Symbol; line-height: 115%;">·<span style="font: normal normal normal 7pt/normal 'Times New Roman';"> </span></span><span style="line-height: 115%;">Тестирование производительности (perfomance/stress testing)<o:p></o:p></span></div><div class="MsoListParagraphCxSpMiddle" style="margin-left: 64.35pt; mso-add-space: auto; mso-list: l10 level1 lfo11; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: -18.0pt;"><span style="font-family: Symbol; line-height: 115%;">·<span style="font: normal normal normal 7pt/normal 'Times New Roman';"> </span></span><span style="line-height: 115%;">Тестирование стабильности (stability/load testing)<o:p></o:p></span></div><div class="MsoListParagraphCxSpMiddle" style="margin-left: 64.35pt; mso-add-space: auto; mso-list: l10 level1 lfo11; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: -18.0pt;"><span style="font-family: Symbol; line-height: 115%;">·<span style="font: normal normal normal 7pt/normal 'Times New Roman';"> </span></span><span style="line-height: 115%;">Тестирование удобства использования (usability testing)<o:p></o:p></span></div><div class="MsoListParagraphCxSpMiddle" style="margin-left: 64.35pt; mso-add-space: auto; mso-list: l10 level1 lfo11; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: -18.0pt;"><span style="font-family: Symbol; line-height: 115%;">·<span style="font: normal normal normal 7pt/normal 'Times New Roman';"> </span></span><span style="line-height: 115%;">Тестирование интерфейса пользователя (UI testing)<o:p></o:p></span></div><div class="MsoListParagraphCxSpMiddle" style="margin-left: 64.35pt; mso-add-space: auto; mso-list: l10 level1 lfo11; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: -18.0pt;"><span style="font-family: Symbol; line-height: 115%;">·<span style="font: normal normal normal 7pt/normal 'Times New Roman';"> </span></span><span style="line-height: 115%;">Тестирование безопасности (security testing)<o:p></o:p></span></div><div class="MsoListParagraphCxSpMiddle" style="margin-left: 64.35pt; mso-add-space: auto; mso-list: l10 level1 lfo11; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: -18.0pt;"><span style="font-family: Symbol; line-height: 115%;">·<span style="font: normal normal normal 7pt/normal 'Times New Roman';"> </span></span><span style="line-height: 115%;">Тестирование локализации (localization testing)<o:p></o:p></span></div><div class="MsoListParagraphCxSpLast" style="margin-left: 64.35pt; mso-add-space: auto; mso-list: l10 level1 lfo11; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: -18.0pt;"><span style="font-family: Symbol; line-height: 115%;">·<span style="font: normal normal normal 7pt/normal 'Times New Roman';"> </span></span><span style="line-height: 115%;">Тестирование совместимости (compatibility testing)<o:p></o:p></span></div><div class="MsoNormal" style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: 1.0cm;"><b style="mso-bidi-font-weight: normal;"><span style="line-height: 115%;">По знанию системы:<o:p></o:p></span></b></div><div class="MsoListParagraphCxSpFirst" style="margin-left: 64.35pt; mso-add-space: auto; mso-list: l7 level1 lfo12; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: -18.0pt;"><span style="font-family: Symbol; line-height: 115%;">·<span style="font: normal normal normal 7pt/normal 'Times New Roman';"> </span></span><span style="line-height: 115%;">Тестирование чёрного ящика (black box)<o:p></o:p></span></div><div class="MsoListParagraphCxSpMiddle" style="margin-left: 64.35pt; mso-add-space: auto; mso-list: l7 level1 lfo12; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: -18.0pt;"><span style="font-family: Symbol; line-height: 115%;">·<span style="font: normal normal normal 7pt/normal 'Times New Roman';"> </span></span><span style="line-height: 115%;">Тестирование белого ящика (white box)<o:p></o:p></span></div><div class="MsoListParagraphCxSpLast" style="margin-left: 64.35pt; mso-add-space: auto; mso-list: l7 level1 lfo12; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: -18.0pt;"><span style="font-family: Symbol; line-height: 115%;">·<span style="font: normal normal normal 7pt/normal 'Times New Roman';"> </span></span><span style="line-height: 115%;">Тестирование серого ящика (gray box)<o:p></o:p></span></div><div class="MsoNormal" style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: 1.0cm;"><b style="mso-bidi-font-weight: normal;"><span style="line-height: 115%;">По степени автоматизированности:<o:p></o:p></span></b></div><div class="MsoListParagraphCxSpFirst" style="margin-left: 64.35pt; mso-add-space: auto; mso-list: l20 level1 lfo13; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: -18.0pt;"><span style="font-family: Symbol; line-height: 115%;">·<span style="font: normal normal normal 7pt/normal 'Times New Roman';"> </span></span><span style="line-height: 115%;">Ручное тестирование (manual testing)<o:p></o:p></span></div><div class="MsoListParagraphCxSpMiddle" style="margin-left: 64.35pt; mso-add-space: auto; mso-list: l20 level1 lfo13; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: -18.0pt;"><span style="font-family: Symbol; line-height: 115%;">·<span style="font: normal normal normal 7pt/normal 'Times New Roman';"> </span></span><span style="line-height: 115%;">Автоматизированное тестирование (automated testing)<o:p></o:p></span></div><div class="MsoListParagraphCxSpLast" style="margin-left: 64.35pt; mso-add-space: auto; mso-list: l20 level1 lfo13; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: -18.0pt;"><span style="font-family: Symbol; line-height: 115%;">·<span style="font: normal normal normal 7pt/normal 'Times New Roman';"> </span></span><span style="line-height: 115%;">Полуавтоматизированное тестирование (semiautomated testing)<o:p></o:p></span></div><div class="MsoNormal" style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: 1.0cm;"><b style="mso-bidi-font-weight: normal;"><span style="line-height: 115%;">По степени изолированности компонентов:<o:p></o:p></span></b></div><div class="MsoListParagraphCxSpFirst" style="margin-left: 64.35pt; mso-add-space: auto; mso-list: l14 level1 lfo14; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: -18.0pt;"><span style="font-family: Symbol; line-height: 115%;">·<span style="font: normal normal normal 7pt/normal 'Times New Roman';"> </span></span><span style="line-height: 115%;">Компонентное (модульное) тестирование (component/unit testing)<o:p></o:p></span></div><div class="MsoListParagraphCxSpMiddle" style="margin-left: 64.35pt; mso-add-space: auto; mso-list: l14 level1 lfo14; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: -18.0pt;"><span lang="EN-US" style="font-family: Symbol; line-height: 115%;">·<span style="font: normal normal normal 7pt/normal 'Times New Roman';"> </span></span><span style="line-height: 115%;">Интеграционное</span><span style="line-height: 115%;"> </span><span style="line-height: 115%;">тестирование</span><span lang="EN-US" style="line-height: 115%;"> (integration testing)<o:p></o:p></span></div><div class="MsoListParagraphCxSpLast" style="margin-left: 64.35pt; mso-add-space: auto; mso-list: l14 level1 lfo14; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: -18.0pt;"><span lang="EN-US" style="font-family: Symbol; line-height: 115%;">·<span style="font: normal normal normal 7pt/normal 'Times New Roman';"> </span></span><span style="line-height: 115%;">Системное</span><span style="line-height: 115%;"> </span><span style="line-height: 115%;">тестирование</span><span lang="EN-US" style="line-height: 115%;"> (system/end-to-end testing)<o:p></o:p></span></div><div class="MsoNormal" style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: 1.0cm;"><b style="mso-bidi-font-weight: normal;"><span style="line-height: 115%;">По времени проведения тестирования:<o:p></o:p></span></b></div><div class="MsoListParagraphCxSpFirst" style="margin-left: 64.35pt; mso-add-space: auto; mso-list: l17 level1 lfo15; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: -18.0pt;"><span style="font-family: Symbol; line-height: 115%;">·<span style="font: normal normal normal 7pt/normal 'Times New Roman';"> </span></span><span style="line-height: 115%;">Альфа тестирование (alpha testing) <o:p></o:p></span></div><div class="MsoListParagraphCxSpMiddle" style="margin-left: 64.35pt; mso-add-space: auto; mso-list: l17 level1 lfo15; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: -18.0pt;"><span style="font-family: Symbol; line-height: 115%;">·<span style="font: normal normal normal 7pt/normal 'Times New Roman';"> </span></span><span style="line-height: 115%;">Тестирование при приёмке (smoke testing)<o:p></o:p></span></div><div class="MsoListParagraphCxSpMiddle" style="margin-left: 64.35pt; mso-add-space: auto; mso-list: l17 level1 lfo15; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: -18.0pt;"><span style="font-family: Symbol; line-height: 115%;">·<span style="font: normal normal normal 7pt/normal 'Times New Roman';"> </span></span><span style="line-height: 115%;">Тестирование новых функциональностей (new feature testing)<o:p></o:p></span></div><div class="MsoListParagraphCxSpMiddle" style="margin-left: 64.35pt; mso-add-space: auto; mso-list: l17 level1 lfo15; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: -18.0pt;"><span style="font-family: Symbol; line-height: 115%;">·<span style="font: normal normal normal 7pt/normal 'Times New Roman';"> </span></span><span style="line-height: 115%;">Регрессионное тестирование (regression testing)<o:p></o:p></span></div><div class="MsoListParagraphCxSpMiddle" style="margin-left: 64.35pt; mso-add-space: auto; mso-list: l17 level1 lfo15; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: -18.0pt;"><span style="font-family: Symbol; line-height: 115%;">·<span style="font: normal normal normal 7pt/normal 'Times New Roman';"> </span></span><span style="line-height: 115%;">Тестирование при сдаче (acceptance testing)<o:p></o:p></span></div><div class="MsoListParagraphCxSpLast" style="margin-left: 64.35pt; mso-add-space: auto; mso-list: l17 level1 lfo15; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: -18.0pt;"><span style="font-family: Symbol; line-height: 115%;">·<span style="font: normal normal normal 7pt/normal 'Times New Roman';"> </span></span><span style="line-height: 115%;">Бета тестирование (beta testing)<o:p></o:p></span></div><div class="MsoNormal" style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: 1.0cm;"><b style="mso-bidi-font-weight: normal;"><span style="line-height: 115%;">По признаку позитивности сценариев:<o:p></o:p></span></b></div><div class="MsoListParagraphCxSpFirst" style="margin-left: 64.35pt; mso-add-space: auto; mso-list: l4 level1 lfo16; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: -18.0pt;"><span style="font-family: Symbol; line-height: 115%;">·<span style="font: normal normal normal 7pt/normal 'Times New Roman';"> </span></span><span style="line-height: 115%;">Позитивное тестирование (positive testing)<o:p></o:p></span></div><div class="MsoListParagraphCxSpLast" style="margin-left: 64.35pt; mso-add-space: auto; mso-list: l4 level1 lfo16; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: -18.0pt;"><span style="font-family: Symbol; line-height: 115%;">·<span style="font: normal normal normal 7pt/normal 'Times New Roman';"> </span></span><span style="line-height: 115%;">Негативное тестирование (negative testing)<o:p></o:p></span></div><div class="MsoNormal" style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: 1.0cm;"><b style="mso-bidi-font-weight: normal;"><span style="line-height: 115%;">По степени подготовленности к тестированию:<o:p></o:p></span></b></div><div class="MsoListParagraphCxSpFirst" style="margin-left: 64.35pt; mso-add-space: auto; mso-list: l16 level1 lfo17; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: -18.0pt;"><span style="font-family: Symbol; line-height: 115%;">·<span style="font: normal normal normal 7pt/normal 'Times New Roman';"> </span></span><span style="line-height: 115%;">Тестирование по документации (formal testing)<o:p></o:p></span></div><div class="MsoListParagraphCxSpLast" style="margin-left: 64.35pt; mso-add-space: auto; mso-list: l16 level1 lfo17; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: -18.0pt;"><span style="font-family: Symbol; line-height: 115%;">·<span style="font: normal normal normal 7pt/normal 'Times New Roman';"> </span></span><span style="line-height: 115%;">Эд Хок (интуитивное) тестирование (ad hoc testing)<o:p></o:p></span></div><div class="MsoNormal" style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: 1.0cm;"><br />
</div><h2><span style="font-size: 11pt; line-height: 115%;">Уровни тестирования</span><span style="font-size: 11pt; line-height: 115%;"><o:p></o:p></span></h2><div class="MsoNormal" style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: 1.0cm;"><b style="mso-bidi-font-weight: normal;"><span style="line-height: 115%;">Модульное тестирование (юнит-тестирование)</span></b><span style="line-height: 115%;"> — тестируется минимально возможный для тестирования компонент, например, отдельный класс или функция. Часто модульное тестирование осуществляется разработчиками ПО.<o:p></o:p></span></div><div class="MsoNormal" style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: 1.0cm;"><b style="mso-bidi-font-weight: normal;"><span style="line-height: 115%;">Интеграционное тестирование</span></b><span style="line-height: 115%;"> — тестируются интерфейсы между компонентами, подсистемами. При наличии резерва времени на данной стадии тестирование ведётся итерационно, с постепенным подключением последующих подсистем.<o:p></o:p></span></div><div class="MsoNormal" style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: 1.0cm;"><b style="mso-bidi-font-weight: normal;"><span style="line-height: 115%;">Системное тестирование</span></b><span style="line-height: 115%;"> — тестируется интегрированная система на её соответствие требованиям. <o:p></o:p></span></div><div class="MsoNormal" style="margin-left: 1.0cm; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: 1.0cm;"><b style="mso-bidi-font-weight: normal;"><span style="line-height: 115%;">Альфа-тестирование</span></b><span style="line-height: 115%;"> — имитация реальной работы с системой штатными разработчиками, либо реальная работа с системой потенциальными пользователями/заказчиком. Чаще всего альфа-тестирование проводится на ранней стадии разработки продукта, но в некоторых случаях может применяться для законченного продукта в качестве внутреннего приёмочного тестирования. Иногда альфа-тестирование выполняется под отладчиком или с использованием окружения, которое помогает быстро выявлять найденные ошибки. Обнаруженные ошибки могут быть переданы тестировщикам для дополнительного исследования в окружении, подобном тому, в котором будет использоваться ПО.<o:p></o:p></span></div><div class="MsoNormal" style="margin-left: 1.0cm; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: 1.0cm;"><b style="mso-bidi-font-weight: normal;"><span style="line-height: 115%;">Бета-тестирование</span></b><span style="line-height: 115%;"> — в некоторых случаях выполняется распространение версии с ограничениями (по функциональности или времени работы) для некоторой группы лиц, с тем чтобы убедиться, что продукт содержит достаточно мало ошибок. Иногда бета-тестирование выполняется для того, чтобы получить обратную связь о продукте от его будущих пользователей.<o:p></o:p></span></div><div class="MsoNormal" style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: 1.0cm;"><span style="line-height: 115%;">Часто для свободного/открытого ПО стадия Альфа-тестирования характеризует функциональное наполнение кода, а Бета тестирования — стадию исправления ошибок. При этом как правило на каждом этапе разработки промежуточные результаты работы доступны конечным пользователям.<o:p></o:p></span></div><div class="MsoNormal" style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: 1.0cm;"><br />
</div><h2><span style="font-size: 11pt; line-height: 115%;">Тестирование «белого ящика» и «чёрного ящика»</span><span style="font-size: 11pt; line-height: 115%;"><o:p></o:p></span></h2><div class="MsoNormal" style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: 1.0cm;"><span style="line-height: 115%;">В терминологии профессионалов тестирования (программного и некоторого аппаратного обеспечения), фразы «тестирование белого ящика» и «тестирование чёрного ящика» относятся к тому, имеет ли разработчик тестов доступ к исходному коду тестируемого ПО, или же тестирование выполняется через пользовательский интерфейс либо прикладной программный интерфейс, предоставленный тестируемым модулем.<o:p></o:p></span></div><div class="MsoNormal" style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: 1.0cm;"><span style="line-height: 115%;">При тестировании белого ящика (англ. white-box testing, также говорят — прозрачного ящика), разработчик теста имеет доступ к исходному коду программ и может писать код, который связан с библиотеками тестируемого ПО. Это типично для юнит-тестирования (англ. unit testing), при котором тестируются только отдельные части системы. Оно обеспечивает то, что компоненты конструкции — работоспособны и устойчивы, до определённой степени. При тестировании белого ящика используются метрики покрытия кода.<o:p></o:p></span></div><div class="MsoNormal" style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: 1.0cm;"><span style="line-height: 115%;">При тестировании чёрного ящика, тестировщик имеет доступ к ПО только через те же интерфейсы, что и заказчик или пользователь, либо через внешние интерфейсы, позволяющие другому компьютеру либо другому процессу подключиться к системе для тестирования. Например, тестирующий модуль может виртуально нажимать клавиши или кнопки мыши в тестируемой программе с помощью механизма взаимодействия процессов, с уверенностью в том, все ли идёт правильно, что эти события вызывают тот же отклик, что и реальные нажатия клавиш и кнопок мыши. Как правило, тестирование чёрного ящика ведётся с использованием спецификаций или иных документов, описывающих требования к системе. Как правило, в данном виде тестирования критерий покрытия складывается из покрытия структуры входных данных, покрытия требований и покрытия модели (в тестировании на основе моделей).<o:p></o:p></span></div><div class="MsoNormal" style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: 1.0cm;"><span style="line-height: 115%;">Если «альфа-» и «бета-тестирование» относятся к стадиям до выпуска продукта (а также, неявно, к объёму тестирующего сообщества и ограничениям на методы тестирования), тестирование «белого ящика» и «чёрного ящика» имеет отношение к способам, которыми тестировщик достигает цели.<o:p></o:p></span></div><div class="MsoNormal" style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: 1.0cm;"><span style="line-height: 115%;">Бета-тестирование в целом ограничено техникой чёрного ящика (хотя постоянная часть тестировщиков обычно продолжает тестирование белого ящика параллельно бета-тестированию). Таким образом, термин «бета-тестирование» может указывать на состояние программы (ближе к выпуску чем «альфа»), или может указывать на некоторую группу тестировщиков и процесс, выполняемый этой группой. Итак, тестировщик может продолжать работу по тестированию белого ящика, хотя ПО уже «в бете» (стадия), но в этом случае он не является частью «бета-тестирования» (группы/процесса).<o:p></o:p></span></div><div class="MsoNormal" style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: 1.0cm;"><br />
</div><h2><span style="font-size: 11pt; line-height: 115%;">Статическое и динамическое тестирование</span><span style="font-size: 11pt; line-height: 115%;"><o:p></o:p></span></h2><div class="MsoNormal" style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: 1.0cm;"><span style="line-height: 115%;">Описанные выше техники — тестирование белого ящика и тестирование чёрного ящика — предполагают, что код исполняется, и разница состоит лишь в той информации, которой владеет тестировщик. В обоих случаях это динамическое тестирование.<o:p></o:p></span></div><div class="MsoNormal" style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: 1.0cm;"><span style="line-height: 115%;">При статическом тестировании программный код не выполняется — анализ программы происходит на основе исходного кода, который вычитывается вручную, либо анализируется специальными инструментами. В некоторых случаях, анализируется не исходный, а промежуточный код (такой как байт-код или код на MSIL).<o:p></o:p></span></div><div class="MsoNormal" style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: 1.0cm;"><span style="line-height: 115%;">Также к статическому тестированию относят тестирование требований, спецификаций, документации.<o:p></o:p></span></div><div class="MsoNormal" style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: 1.0cm;"><br />
</div><h2><span style="font-size: 11pt; line-height: 115%;">Регрессионное тестирование</span><span style="font-size: 11pt; line-height: 115%;"><o:p></o:p></span></h2><div class="MsoNormal" style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: 1.0cm;"><span style="line-height: 115%;">Регрессио́нное тести́рование (англ. regression testing, от лат. regressio — движение назад) — собирательное название для всех видов тестирования программного обеспечения, направленных на обнаружение ошибок в уже протестированных участках исходного кода. Такие ошибки — когда после внесения изменений в программу перестает работать то, что должно было продолжать работать, — называют регрессионными ошибками (англ. regression bugs).<o:p></o:p></span></div><div class="MsoNormal" style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: 1.0cm;"><span style="line-height: 115%;">Обычно используемые методы регрессионного тестирования включают повторные прогоны предыдущих тестов, а также проверки, не попали ли регрессионные ошибки в очередную версию в результате слияния кода.<o:p></o:p></span></div><div class="MsoNormal" style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: 1.0cm;"><span style="line-height: 115%;">Из опыта разработки ПО известно, что повторное появление одних и тех же ошибок — случай достаточно частый. Иногда это происходит из-за слабой техники управления версиями или по причине человеческой ошибки при работе с системой управления версиями. Но настолько же часто решение проблемы бывает «недолго живущим»: после следующего изменения в программе решение перестаёт работать. И наконец, при переписывании какой-либо части кода часто всплывают те же ошибки, что были в предыдущей реализации.<o:p></o:p></span></div><div class="MsoNormal" style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: 1.0cm;"><span style="line-height: 115%;">Поэтому считается хорошей практикой при исправлении ошибки создать тест на неё и регулярно прогонять его при последующих изменениях программы. Хотя регрессионное тестирование может быть выполнено и вручную, но чаще всего это делается с помощью специализированных программ, позволяющих выполнять все регрессионные тесты автоматически. В некоторых проектах даже используются инструменты для автоматического прогона регрессионных тестов через заданный интервал времени. Обычно это выполняется после каждой удачной компиляции (в небольших проектах) либо каждую ночь или каждую неделю.<o:p></o:p></span></div><div class="MsoNormal" style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: 1.0cm;"><span style="line-height: 115%;">Регрессионное тестирование является неотъемлемой частью экстремального программирования. В этой методологии проектная документация заменяется на расширяемое, повторяемое и автоматизированное тестирование всего программного пакета на каждой стадии цикла разработки программного обеспечения.<o:p></o:p></span></div><div class="MsoNormal" style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: 1.0cm;"><span style="line-height: 115%;">Регрессионное тестирование может быть использовано не только для проверки корректности программы, часто оно также используется для оценки качества полученного результата. Так, при разработке компилятора, при прогоне регрессионных тестов рассматривается размер получаемого кода, скорость его выполнения и время компиляции каждого из тестовых примеров.<o:p></o:p></span></div><div class="MsoNormal" style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: 1.0cm;"><span style="line-height: 115%;">Цитата<o:p></o:p></span></div><div class="MsoNormal" style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: 1.0cm;"><span style="line-height: 115%;">«Фундаментальная проблема при сопровождении программ состоит в том, что исправление одной ошибки с большой вероятностью (20-50%) влечет появление новой. Поэтому весь процесс идет по принципу "два шага вперед, шаг назад".<o:p></o:p></span></div><div class="MsoNormal" style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: 1.0cm;"><span style="line-height: 115%;">Почему не удается устранять ошибки более аккуратно? Во-первых, даже скрытый дефект проявляет себя как отказ в каком-то одном месте. В действительности же он часто имеет разветвления по всей системе, обычно неочевидные. Всякая попытка исправить его минимальными усилиями приведет к исправлению локального и очевидного, но если только структура не является очень ясной или документация очень хорошей, отдаленные последствия этого исправления останутся незамеченными. Во-вторых, ошибки обычно исправляет не автор программы, а зачастую младший программист или стажер.<o:p></o:p></span></div><div class="MsoNormal" style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: 1.0cm;"><span style="line-height: 115%;">Вследствие внесения новых ошибок сопровождение программы требует значительно больше системной отладки на каждый оператор, чем при любом другом виде программирования. Теоретически, после каждого исправления нужно прогнать весь набор контрольных примеров, по которым система проверялась раньше, чтобы убедиться, что она каким-нибудь непонятным образом не повредилась. На практике такое возвратное (регрессионное) тестирование действительно должно приближаться к этому теоретическому идеалу, и оно очень дорого стоит.»<o:p></o:p></span></div><div class="MsoNormal" style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: 1.0cm;"><span style="line-height: 115%;">После внесения изменений в очередную версию программы, регрессионные тесты подтверждают, что сделанные изменения не повлияли на работоспособность остальной функциональности приложения. Регрессионное тестирование может выполняться как вручную, так и средствами автоматизации тестирования.<o:p></o:p></span></div><div class="MsoNormal" style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: 1.0cm;"><br />
</div><h2><span style="font-size: 11pt; line-height: 115%;">Тестовые скрипты</span><span style="font-size: 11pt; line-height: 115%;"><o:p></o:p></span></h2><div class="MsoNormal" style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: 1.0cm;"><span style="line-height: 115%;">Тестировщики используют тестовые скрипты на разных уровнях: как в модульном, так и в интеграционном и системном тестировании. Тестовые скрипты, как правило, пишутся для проверки компонентов, в которых наиболее высока вероятность появления отказов или вовремя не найденная ошибка может быть дорогостоящей.<o:p></o:p></span></div><div class="MsoNormal" style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: 1.0cm;"><br />
</div><h2><span style="font-size: 11pt; line-height: 115%;">Покрытие кода</span><span style="font-size: 11pt; line-height: 115%;"><o:p></o:p></span></h2><div class="MsoNormal" style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: 1.0cm;"><span style="line-height: 115%;">Покрытие кода — мера, используемая при тестировании программного обеспечения. Она показывает процент, насколько исходный код программы был протестирован. Техника покрытия кода была одной из первых методик, изобретённых для систематического тестирования ПО. Первое упоминание покрытия кода в публикациях появилось в 1963 году.<o:p></o:p></span></div><div class="MsoNormal" style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: 1.0cm;"><b style="mso-bidi-font-weight: normal;"><span style="line-height: 115%;">Критерии<o:p></o:p></span></b></div><div class="MsoNormal" style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: 1.0cm;"><span style="line-height: 115%;">Существует несколько различных способов измерения покрытия, основные из них:<o:p></o:p></span></div><div class="MsoListParagraphCxSpFirst" style="margin-left: 64.35pt; mso-add-space: auto; mso-list: l15 level1 lfo18; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: -18.0pt;"><span style="font-family: Symbol; line-height: 115%;">·<span style="font: normal normal normal 7pt/normal 'Times New Roman';"> </span></span><span style="line-height: 115%;">Покрытие операторов — каждая ли строка исходного кода была выполнена и протестирована?<o:p></o:p></span></div><div class="MsoListParagraphCxSpMiddle" style="margin-left: 64.35pt; mso-add-space: auto; mso-list: l15 level1 lfo18; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: -18.0pt;"><span style="font-family: Symbol; line-height: 115%;">·<span style="font: normal normal normal 7pt/normal 'Times New Roman';"> </span></span><span style="line-height: 115%;">Покрытие условий — каждая ли точка решения (вычисления истинно ли или ложно выражение) была выполнена и протестирована?<o:p></o:p></span></div><div class="MsoListParagraphCxSpMiddle" style="margin-left: 64.35pt; mso-add-space: auto; mso-list: l15 level1 lfo18; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: -18.0pt;"><span style="font-family: Symbol; line-height: 115%;">·<span style="font: normal normal normal 7pt/normal 'Times New Roman';"> </span></span><span style="line-height: 115%;">Покрытие путей — все ли возможные пути через заданную часть кода были выполнены и протестированы?<o:p></o:p></span></div><div class="MsoListParagraphCxSpMiddle" style="margin-left: 64.35pt; mso-add-space: auto; mso-list: l15 level1 lfo18; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: -18.0pt;"><span style="font-family: Symbol; line-height: 115%;">·<span style="font: normal normal normal 7pt/normal 'Times New Roman';"> </span></span><span style="line-height: 115%;">Покрытие функций — каждая ли функция программы была выполнена<o:p></o:p></span></div><div class="MsoListParagraphCxSpLast" style="margin-left: 64.35pt; mso-add-space: auto; mso-list: l15 level1 lfo18; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: -18.0pt;"><span style="font-family: Symbol; line-height: 115%;">·<span style="font: normal normal normal 7pt/normal 'Times New Roman';"> </span></span><span style="line-height: 115%;">Покрытие вход/выход — все ли вызовы функций и возвраты из них были выполнены<o:p></o:p></span></div><div class="MsoNormal" style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: 1.0cm;"><br />
</div><div class="MsoNormal" style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: 1.0cm;"><span style="line-height: 115%;">Для программ с особыми требованиями к безопасности часто требуется продемонстрировать, что тестами достигается 100 % покрытие для одного из критериев. Некоторые из приведённых критериев покрытия связаны между собой; например, покрытие путей включает в себя и покрытие условий и покрытие операторов. Покрытие операторов не включает покрытие условий, как показывает этот код на Си:<o:p></o:p></span></div><div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0cm; text-align: justify; text-indent: 1.0cm;"><span lang="EN-US" style="line-height: 115%;">printf("this is "); <o:p></o:p></span></div><div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0cm; text-align: justify; text-indent: 1.0cm;"><span lang="EN-US" style="line-height: 115%;">if (bar < 1)<o:p></o:p></span></div><div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0cm; text-align: justify; text-indent: 1.0cm;"><span lang="EN-US" style="line-height: 115%;">{<o:p></o:p></span></div><div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0cm; text-align: justify; text-indent: 1.0cm;"><span lang="EN-US" style="line-height: 115%;"> printf("not ");<o:p></o:p></span></div><div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0cm; text-align: justify; text-indent: 1.0cm;"><span lang="EN-US" style="line-height: 115%;">}<o:p></o:p></span></div><div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0cm; text-align: justify; text-indent: 1.0cm;"><span lang="EN-US" style="line-height: 115%;">printf("a positive integer");<o:p></o:p></span></div><div class="MsoNormal" style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: 1.0cm;"><span style="line-height: 115%;">Если здесь bar = −1, то покрытие операторов будет полным, а покрытие условий — нет, так как случай несоблюдения условия в операторе if — не покрыт. Полное покрытие путей обычно невозможно. Фрагмент кода, имеющий n условий содержит 2n путей; конструкция цикла порождает бесконечное количество путей. Некоторые пути в программе могут быть не достигнуты из-за того, что в тестовых данных отсутствовали такие, которые могли привести к выполнению этих путей. Не существует универсального алгоритма, который решал бы проблему недостижимых путей (этот алгоритм можно было бы использовать для решения проблемы останова). На практике для достижения покрытия путей используется следующий подход: выделяются классы путей (например, к одному классу можно отнести пути отличающиеся только количеством итераций в одном и том же цикле), 100 % покрытие достигнуто, если покрыты все классы путей (класс считается покрытым, если покрыт хотя бы один путь из него).<o:p></o:p></span></div><div class="MsoNormal" style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: 1.0cm;"><span style="line-height: 115%;">Покрытие кода, по своей сути, является тестированием методом белого ящика. Тестируемое ПО собирается со специальными настройками или библиотеками и/или запускается в особом окружении, в результате чего для каждой используемой (выполняемой) функции программы определяется местонахождение этой функции в исходном коде. Этот процесс позволяет разработчикам и специалистам по обеспечению качества определить части системы, которые, при нормальной работе, используются очень редко или никогда не используются (такие как код обработки ошибок и т.п.). Это позволяет сориентировать тестировщиков на тестирование наиболее важных режимов.<o:p></o:p></span></div><div class="MsoNormal" style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: 1.0cm;"><br />
</div><div class="MsoNormal" style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: 1.0cm;"><b style="mso-bidi-font-weight: normal;"><span style="line-height: 115%;">Практическое применение<o:p></o:p></span></b></div><div class="MsoNormal" style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: 1.0cm;"><span style="line-height: 115%;">Обычно исходный код снабжается тестами, которые регулярно выполняются. Полученный отчёт анализируется с целью выявить невыполнявшиеся области кода, набор тестов обновляется, пишутся тесты для непокрытых областей. Цель состоит в том, чтобы получить набор тестов для регрессионного тестирования, тщательно проверяющих весь исходный код.<o:p></o:p></span></div><div class="MsoNormal" style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: 1.0cm;"><span style="line-height: 115%;">Степень покрытия кода обычно выражают в виде процента. Например, «мы протестировали 67 % кода». Смысл этой фразы зависит от того какой критерий был использован. Например, 67 % покрытия путей — это лучший результат чем 67 % покрытия операторов. Вопрос о связи значения покрытия кода и качеством тестового набора ещё до конца не решён.<o:p></o:p></span></div><div class="MsoNormal" style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: 1.0cm;"><span style="line-height: 115%;">Тестировщики могут использовать результаты теста покрытия кода для разработки тестов или тестовых данных, которые расширят покрытие кода на важные функции.<o:p></o:p></span></div><div class="MsoNormal" style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: 1.0cm;"><span style="line-height: 115%;">Как правило, инструменты и библиотеки, используемые для получения покрытия кода, требуют значительных затрат производительности и/или памяти, недопустимых при нормальном функционировании ПО. Поэтому они могут использоваться только в лабораторных условиях.<o:p></o:p></span></div><div class="MsoNormal" style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: 1.0cm;"><br />
</div><h1><span style="font-size: 11pt; line-height: 115%;">Метрика программного обеспечения</span><span style="font-size: 11pt; line-height: 115%;"><o:p></o:p></span></h1><div class="MsoNormal" style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: 1.0cm;"><b style="mso-bidi-font-weight: normal;"><span style="line-height: 115%;">Метрика программного обеспечения</span></b><span style="line-height: 115%;"> (англ. software metric) — это мера, позволяющая получить численное значение некоторого свойства программного обеспечения или его спецификаций.<o:p></o:p></span></div><div class="MsoNormal" style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: 1.0cm;"><span style="line-height: 115%;">Поскольку количественные методы хорошо зарекомендовали себя в других областях, многие теоретики и практики информатики пытались перенести данный подход и в разработку программного обеспечения. Как сказал Том ДеМарко, «вы не можете контролировать то, что не можете измерить».<o:p></o:p></span></div><div class="MsoNormal" style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: 1.0cm;"><br />
</div><h2><span style="font-size: 11pt; line-height: 115%;">Метрики</span><span style="font-size: 11pt; line-height: 115%;"><o:p></o:p></span></h2><div class="MsoNormal" style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: 1.0cm;"><span style="line-height: 115%;">Набор используемых метрик включает:<o:p></o:p></span></div><div class="MsoListParagraphCxSpFirst" style="margin-left: 64.35pt; mso-add-space: auto; mso-list: l6 level1 lfo19; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: -18.0pt;"><span style="font-family: Symbol; line-height: 115%;">·<span style="font: normal normal normal 7pt/normal 'Times New Roman';"> </span></span><span style="line-height: 115%;">порядок роста (имеется в виду анализ алгоритмов в терминах асимптотического анализа и O-нотации)<o:p></o:p></span></div><div class="MsoListParagraphCxSpMiddle" style="margin-left: 64.35pt; mso-add-space: auto; mso-list: l6 level1 lfo19; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: -18.0pt;"><span style="font-family: Symbol; line-height: 115%;">·<span style="font: normal normal normal 7pt/normal 'Times New Roman';"> </span></span><span style="line-height: 115%;">количество строк кода<o:p></o:p></span></div><div class="MsoListParagraphCxSpMiddle" style="margin-left: 64.35pt; mso-add-space: auto; mso-list: l6 level1 lfo19; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: -18.0pt;"><span style="font-family: Symbol; line-height: 115%;">·<span style="font: normal normal normal 7pt/normal 'Times New Roman';"> </span></span><span style="line-height: 115%;">цикломатическая сложность<o:p></o:p></span></div><div class="MsoListParagraphCxSpMiddle" style="margin-left: 64.35pt; mso-add-space: auto; mso-list: l6 level1 lfo19; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: -18.0pt;"><span style="font-family: Symbol; line-height: 115%;">·<span style="font: normal normal normal 7pt/normal 'Times New Roman';"> </span></span><span style="line-height: 115%;">анализ функциональных точек<o:p></o:p></span></div><div class="MsoListParagraphCxSpMiddle" style="margin-left: 64.35pt; mso-add-space: auto; mso-list: l6 level1 lfo19; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: -18.0pt;"><span style="font-family: Symbol; line-height: 115%;">·<span style="font: normal normal normal 7pt/normal 'Times New Roman';"> </span></span><span style="line-height: 115%;">количество ошибок на 1000 строк кода<o:p></o:p></span></div><div class="MsoListParagraphCxSpMiddle" style="margin-left: 64.35pt; mso-add-space: auto; mso-list: l6 level1 lfo19; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: -18.0pt;"><span style="font-family: Symbol; line-height: 115%;">·<span style="font: normal normal normal 7pt/normal 'Times New Roman';"> </span></span><span style="line-height: 115%;">покрытие кода<o:p></o:p></span></div><div class="MsoListParagraphCxSpMiddle" style="margin-left: 64.35pt; mso-add-space: auto; mso-list: l6 level1 lfo19; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: -18.0pt;"><span style="font-family: Symbol; line-height: 115%;">·<span style="font: normal normal normal 7pt/normal 'Times New Roman';"> </span></span><span style="line-height: 115%;">покрытие требований<o:p></o:p></span></div><div class="MsoListParagraphCxSpMiddle" style="margin-left: 64.35pt; mso-add-space: auto; mso-list: l6 level1 lfo19; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: -18.0pt;"><span style="font-family: Symbol; line-height: 115%;">·<span style="font: normal normal normal 7pt/normal 'Times New Roman';"> </span></span><span style="line-height: 115%;">количество классов и интерфейсов<o:p></o:p></span></div><div class="MsoListParagraphCxSpMiddle" style="margin-left: 64.35pt; mso-add-space: auto; mso-list: l6 level1 lfo19; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: -18.0pt;"><span style="font-family: Symbol; line-height: 115%;">·<span style="font: normal normal normal 7pt/normal 'Times New Roman';"> </span></span><span style="line-height: 115%;">метрики программного пакета от Роберта Сесиль Мартина<o:p></o:p></span></div><div class="MsoListParagraphCxSpLast" style="margin-left: 64.35pt; mso-add-space: auto; mso-list: l6 level1 lfo19; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: -18.0pt;"><span style="font-family: Symbol; line-height: 115%;">·<span style="font: normal normal normal 7pt/normal 'Times New Roman';"> </span></span><span style="line-height: 115%;">связность<o:p></o:p></span></div><div class="MsoNormal" style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: 1.0cm;"><br />
</div><h2><span style="font-size: 11pt; line-height: 115%;">Критика</span><span style="font-size: 11pt; line-height: 115%;"><o:p></o:p></span></h2><div class="MsoNormal" style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: 1.0cm;"><span style="line-height: 115%;">Потенциальные недостатки подхода, на которые нацелена критика:<o:p></o:p></span></div><div class="MsoNormal" style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: 1.0cm;"><span style="line-height: 115%;">Неэтичность: Утверждается, что неэтично сводить оценку работы человека к нескольким числовым параметрам и по ним судить о производительности. Менеджер может назначить наиболее талантливых программистов на сложнейший участок работы; это означает, что разработка этого участка займёт наибольшее время и породит наибольшее количество ошибок, из-за сложности задачи. Не зная об этих трудностях, другой менеджер по полученным показателям может решить, что программист сделал свою работу плохо.<o:p></o:p></span></div><div class="MsoNormal" style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: 1.0cm;"><span style="line-height: 115%;">Замещение «управления людьми» на «управление цифрами», которое не учитывает опыт сотрудников и их другие качества<o:p></o:p></span></div><div class="MsoNormal" style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: 1.0cm;"><span style="line-height: 115%;">Искажение: Процесс измерения может быть искажён за счёт того, что сотрудники знают об измеряемых показателях и стремятся оптимизировать эти показатели, а не свою работу. Например, если количество строк исходного кода является важным показателем, то программисты будут стремиться писать как можно больше строк и не будут использовать способы упрощения кода, сокращающие количество строк.<o:p></o:p></span></div><div class="MsoNormal" style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify; text-indent: 1.0cm;"><span style="line-height: 115%;">Неточность: Нет метрик, которые были бы одновременно и значимы и достаточно точны. Количество строк кода — это просто количество строк, этот показатель не даёт представление о сложности решаемой проблемы. Анализ функциональных точек был разработан с целью лучшего измерения сложности кода и спецификации, но он использует личные оценки измеряющего, поэтому разные люди получат разные результаты.<o:p></o:p></span></div><div class="MsoNormal"><br />
</div><h1><span style="font-size: 11pt; line-height: 115%;">Обратная семантическая трассировка</span><span style="font-size: 11pt; line-height: 115%;"><o:p></o:p></span></h1><div class="MsoNormal"><br />
</div><div class="MsoNormal" style="text-indent: 1.0cm;"><b style="mso-bidi-font-weight: normal;"><span style="line-height: 115%;">Обратная семантическая трассировка</span></b><span style="line-height: 115%;"> (ОСТ) — метод контроля качества, который позволяет обнаруживать ошибки, утечку или искажение информации при создании проектных артефактов: документации, кода и т. д. Метод наиболее ценен на ранних стадиях разработки программного обеспечения, при создании требований и архитектуры будущей системы при отсутствии исполняемого кода для тестирования. ОСТ является частью P-Modeling Framework.<o:p></o:p></span></div><div class="MsoNormal" style="text-indent: 1.0cm;"><br />
</div><h2 style="text-indent: 1.0cm;"><span style="font-size: 11pt; line-height: 115%;">Вступление</span><span style="font-size: 11pt; line-height: 115%;"><o:p></o:p></span></h2><div class="MsoNormal" style="text-indent: 1.0cm;"><span style="line-height: 115%;">Каждый этап процесса разработки программного обеспечения можно рассматривать как серию «переводов» с одного языка на другой. В самом начале проекта заказчик рассказывает команде свои требования к программе на естественном языке: русском, английском и т. д. Эти пожелания клиента иногда могут оказаться неполными, неясными или даже противоречащими друг другу. Первым шагом в цепочке «переводов» является определение и анализ пожеланий заказчика, их преобразование в формальный список требований для будущей системы. Затем требования становятся исходным материалом для архитектуры и проекта системы. Так шаг за шагом команда создает мегабайты кода, написанного на весьма формальном языке программирования. При переводе всегда существует риск ошибки, неправильного толкования или потери информации. Иногда это не имеет значения, но иногда даже небольшой дефект в спецификации требований может вызвать серьезные переделки системы на поздних стадиях проекта.<o:p></o:p></span></div><div class="MsoNormal" style="text-indent: 1.0cm;"><span style="line-height: 115%;">Чаще всего обратная семантическая трассировка применяется для:<o:p></o:p></span></div><div class="MsoListParagraphCxSpFirst" style="margin-left: 64.35pt; mso-add-space: auto; mso-list: l19 level1 lfo20; text-indent: -18.0pt;"><span style="font-family: Symbol; line-height: 115%;">·<span style="font: normal normal normal 7pt/normal 'Times New Roman';"> </span></span><span style="line-height: 115%;">Проверки UML моделей;<o:p></o:p></span></div><div class="MsoListParagraphCxSpMiddle" style="margin-left: 64.35pt; mso-add-space: auto; mso-list: l19 level1 lfo20; text-indent: -18.0pt;"><span style="font-family: Symbol; line-height: 115%;">·<span style="font: normal normal normal 7pt/normal 'Times New Roman';"> </span></span><span style="line-height: 115%;">Проверки изменений в требованиях;<o:p></o:p></span></div><div class="MsoListParagraphCxSpMiddle" style="margin-left: 64.35pt; mso-add-space: auto; mso-list: l19 level1 lfo20; text-indent: -18.0pt;"><span style="font-family: Symbol; line-height: 115%;">·<span style="font: normal normal normal 7pt/normal 'Times New Roman';"> </span></span><span style="line-height: 115%;">Проверки исправлений ошибок в коде;<o:p></o:p></span></div><div class="MsoListParagraphCxSpLast" style="margin-left: 64.35pt; mso-add-space: auto; mso-list: l19 level1 lfo20; text-indent: -18.0pt;"><span style="font-family: Symbol; line-height: 115%;">·<span style="font: normal normal normal 7pt/normal 'Times New Roman';"> </span></span><span style="line-height: 115%;">Быстрой адаптации нового человека в команде (новому члену команды дают задание провести ОСТ сессию — он знакомится с программой, документацией, кодом и т. д. гораздо быстрее, так как ему необходимо не просто прочитать материал, но и проанализировать его).<o:p></o:p></span></div><div class="MsoListParagraphCxSpLast" style="margin-left: 64.35pt; mso-add-space: auto; mso-list: l19 level1 lfo20; text-indent: -18.0pt;"><span style="font-family: Symbol; line-height: 115%;">·</span><span style="line-height: 115%;"><o:p></o:p></span></div><h2><span style="font-size: 11pt; line-height: 115%;">Роли</span><span style="font-size: 11pt; line-height: 115%;"><o:p></o:p></span></h2><div class="MsoNormal" style="text-indent: 1.0cm;"><span style="line-height: 115%;">Основными действующими лицами в процессе обратной семантической трассировки являются:<o:p></o:p></span></div><div class="MsoListParagraphCxSpFirst" style="margin-left: 64.35pt; mso-add-space: auto; mso-list: l9 level1 lfo21; text-indent: -18.0pt;"><span style="font-family: Symbol; line-height: 115%;">·<span style="font: normal normal normal 7pt/normal 'Times New Roman';"> </span></span><span style="line-height: 115%;">авторы артефактов (как исходного, так и результирующего);<o:p></o:p></span></div><div class="MsoListParagraphCxSpMiddle" style="margin-left: 64.35pt; mso-add-space: auto; mso-list: l9 level1 lfo21; text-indent: -18.0pt;"><span style="font-family: Symbol; line-height: 115%;">·<span style="font: normal normal normal 7pt/normal 'Times New Roman';"> </span></span><span style="line-height: 115%;">реверс-инженеры;<o:p></o:p></span></div><div class="MsoListParagraphCxSpMiddle" style="margin-left: 64.35pt; mso-add-space: auto; mso-list: l9 level1 lfo21; text-indent: -18.0pt;"><span style="font-family: Symbol; line-height: 115%;">·<span style="font: normal normal normal 7pt/normal 'Times New Roman';"> </span></span><span style="line-height: 115%;">группа экспертов для оценки качества артефакта;<o:p></o:p></span></div><div class="MsoListParagraphCxSpLast" style="margin-left: 64.35pt; mso-add-space: auto; mso-list: l9 level1 lfo21; text-indent: -18.0pt;"><span style="font-family: Symbol; line-height: 115%;">·<span style="font: normal normal normal 7pt/normal 'Times New Roman';"> </span></span><span style="line-height: 115%;">менеджер проекта.<o:p></o:p></span></div><div class="MsoNormal" style="text-indent: 1.0cm;"><br />
</div><h2><span style="font-size: 11pt; line-height: 115%;">Процесс</span><span style="font-size: 11pt; line-height: 115%;"><o:p></o:p></span></h2><div class="MsoNormal" style="text-align: justify; text-indent: 1.0cm;"><b style="mso-bidi-font-weight: normal;"><span style="line-height: 115%;">Определить все артефакты проекта и их взаимосвязи<o:p></o:p></span></b></div><div class="MsoNormal" style="text-align: justify; text-indent: 1.0cm;"><span style="line-height: 115%;">Обратная семантическая трассировка, как метод контроля качества, может быть применена к любому артефакту проекта, даже к любой части артефакта, вплоть до одной строки документа или кода. Однако очевидно, что выполнение такой процедуры для всех документов и изменений может создать ненужную нагрузку для проектной команды. Чтобы этого избежать, применение ОСТ должно быть обосновано. Какой объем ОСТ нужен для обеспечения качества — решает компания (в соответствие со стандартами качества и процессами, принятым в компании) и проджект менеджер (исходя из специфики конкретного проекта).<o:p></o:p></span></div><div class="MsoNormal" style="text-align: justify; text-indent: 1.0cm;"><span style="line-height: 115%;">В общем случае, количество ОСТ сессий определяется важностью артефактов для проекта и уровнем контроля качества для этого артефакта (тестирование, верификация, рецензии и т. д.)<o:p></o:p></span></div><div class="MsoNormal" style="text-align: justify; text-indent: 1.0cm;"><span style="line-height: 115%;">Количество ОСТ сессий определяется на этапе планирования проекта.<o:p></o:p></span></div><div class="MsoNormal" style="text-align: justify; text-indent: 1.0cm;"><span style="line-height: 115%;">Прежде всего менеджер проекта создает список всех артефактов, которые будут созданы в процессе работы над проектом. Этот список может быть представлен в виде дерева, отображающего связи и отношения артефактов между собой. Артефакты могут быть представлены как в единственном экземпляре (например, документ описывающий ви́дение проекта), так и во многих экземплярах (например, задачи, дефекты или риски). Этот список может меняться в течение проекта, однако принцип принятия решения об ОСТ будет тем же.<o:p></o:p></span></div><div class="MsoNormal" style="text-align: justify; text-indent: 1.0cm;"><br />
</div><div class="MsoNormal" style="text-align: justify; text-indent: 1.0cm;"><b style="mso-bidi-font-weight: normal;"><span style="line-height: 115%;">Расставить приоритеты для артефактов<o:p></o:p></span></b></div><div class="MsoNormal" style="text-align: justify; text-indent: 1.0cm;"><span style="line-height: 115%;">Следующий шаг — анализ важности артефактов и уровня контроля качества, который применяется по отношению к артефакту. Важность документа — это степень его влияния на успех проекта и качество финального продукта. Важность условно можно измерить по следующей шкале:<o:p></o:p></span></div><div class="MsoNormal" style="text-align: justify; text-indent: 1.0cm;"><span style="line-height: 115%;">Очень высокая(1): качество артефакта очень важно для общего качества продукта и влияет на успех проекта в целом. Примеры таких артефактов: спецификация требований, архитектура системы, исправления критических ошибок в системе, риски с очень высокой вероятностью.<o:p></o:p></span></div><div class="MsoNormal" style="text-align: justify; text-indent: 1.0cm;"><span style="line-height: 115%;">Высокая(2): артефакт имеет влияние на качество финального продукта. Например: тест кейсы, требования к интерфейсу и юзабилити, дефекты с высоким приоритетом, риски с высокой вероятностью.<o:p></o:p></span></div><div class="MsoNormal" style="text-align: justify; text-indent: 1.0cm;"><span style="line-height: 115%;">Средняя(3): артефакт имеет среднее или косвенное влияние на качество конечного продукта. Например: план проекта, дефекты со средним приоритетом.<o:p></o:p></span></div><div class="MsoNormal" style="text-align: justify; text-indent: 1.0cm;"><span style="line-height: 115%;">Низкая(4): артефакт имеет незначительное влияние на качество разрабатываемого программного продукта. Например: задачи программистов, косметические дефекты, риски с низкой вероятностью.<o:p></o:p></span></div><div class="MsoNormal" style="text-align: justify; text-indent: 1.0cm;"><span style="line-height: 115%;">Уровень контроля качества для артефакта определяется в соответствии с объемом работ по обеспечению качества артефакта, вероятностью возникновения недоразумений и искажений информации в процессе его создания.<o:p></o:p></span></div><div class="MsoNormal" style="text-align: justify; text-indent: 1.0cm;"><span style="line-height: 115%;">Низкий(1): Не предусмотрены тестирование или проверки (рецензии), недоразумения и потери информации очень вероятны, над артефактом работает распределенная команда, существует языковой барьер и т. д.<o:p></o:p></span></div><div class="MsoNormal" style="text-align: justify; text-indent: 1.0cm;"><span style="line-height: 115%;">Средний(2): Рецензия не предусмотрена, над артефактом работает нераспределенная команда.<o:p></o:p></span></div><div class="MsoNormal" style="text-align: justify; text-indent: 1.0cm;"><span style="line-height: 115%;">Достаточный(3): Предусмотрено рецензирование или парное программирование, над артефактом работает нераспределенная команда.<o:p></o:p></span></div><div class="MsoNormal" style="text-align: justify; text-indent: 1.0cm;"><span style="line-height: 115%;">Отличный(4): Для артефакта предусмотрены парное программирование, верификация и\или тестирование, автоматическое или юнит тестирование. Есть инструменты для создания или тестирования артефактов.<o:p></o:p></span></div><div class="MsoNormal" style="text-align: justify; text-indent: 1.0cm;"><br />
</div><h2><span style="font-size: 11pt; line-height: 115%;">Определить, кто будет проводить ОСТ</span><span style="font-size: 11pt; line-height: 115%;"><o:p></o:p></span></h2><div class="MsoNormal" style="text-align: justify; text-indent: 1.0cm;"><span style="line-height: 115%;">Успех ОСТ сессий во многом зависит от правильного выбора реверс-инженеров — они должны обладать достаточной компетенцией, чтобы суметь восстановить родительский артефакт. Но в то же время, реверс инженеры не должны знать деталей проекта, чтобы избежать предвзятости при восстановлении информации. В идеале, это должны быть инженеры из другого проекта, использующего сходные технологии или процессы.<o:p></o:p></span></div><div class="MsoNormal" style="text-align: justify; text-indent: 1.0cm;"><br />
</div><h2><span style="font-size: 11pt; line-height: 115%;">Провести ОСТ</span><span style="font-size: 11pt; line-height: 115%;"><o:p></o:p></span></h2><div class="MsoNormal" style="text-align: justify; text-indent: 1.0cm;"><span style="line-height: 115%;">Процесс обратной семантической трассировки начинается, когда решение о ее необходимости принято и назначены ответственные инженеры для ее выполнения.<o:p></o:p></span></div><div class="MsoNormal" style="text-align: justify; text-indent: 1.0cm;"><span style="line-height: 115%;">Менеджер проекта определяет какие документы будут являться входными для данной сессии ОСТ. Например, это может быть дополнительная информация, которая позволит реверс-инжерену восстановить родительский артефакт более полно. Рекомендуется также дать информацию о размере восстанавливаемого артефакта, чтобы помочь реверс-инженерам определить объем работы: это может быть одна-две строки или несколько страниц текста. И хотя восстановленный текст может не совпадать с исходным по количеству слов, эти величины должны быть соизмеримы.<o:p></o:p></span></div><div class="MsoNormal" style="text-align: justify; text-indent: 1.0cm;"><span style="line-height: 115%;">После этого реверс-инженеры берут артефакт и восстанавливают из него исходный текст. ОСТ сессия сама по себе занимает около часа (для 1 страницы текста, примерно 750 слов)<o:p></o:p></span></div><div class="MsoNormal" style="text-align: justify; text-indent: 1.0cm;"><br />
</div><h2><span style="font-size: 11pt; line-height: 115%;">Оценить качество артефактов</span><span style="font-size: 11pt; line-height: 115%;"><o:p></o:p></span></h2><div class="MsoNormal" style="text-align: justify; text-indent: 1.0cm;"><span style="line-height: 115%;">Чтобы завершить ОСТ сессию, необходимо сравнить исходный и восстановленный текст и оценить качество артефактов. Решение о переработке, доработке и исправлении артефактов делается на основании этой оценки.<o:p></o:p></span></div><div class="MsoNormal" style="text-align: justify; text-indent: 1.0cm;"><span style="line-height: 115%;">Для оценки формируется группа экспертов. Эксперты должны иметь представление о предметной области проекта и иметь достаточно опыта, чтобы оценить качество артефакта. Например, аналитик может быть экспертом для сравнения и оценки документа описывающего видение проекта и видения, восстановленного из требований и сценариев.<o:p></o:p></span></div><div class="MsoNormal" style="text-align: justify; text-indent: 1.0cm;"><span style="line-height: 115%;">Критерии оценки и шкала:<o:p></o:p></span></div><div class="MsoListParagraphCxSpFirst" style="margin-left: 64.35pt; mso-add-space: auto; mso-list: l0 level1 lfo22; text-align: justify; text-indent: -18.0pt;"><span style="line-height: 115%;">1.<span style="font: normal normal normal 7pt/normal 'Times New Roman';"> </span></span><span style="line-height: 115%;">Восстановленный и оригинальный тексты имеют очень большие смысловые различия и потери критической информации.<o:p></o:p></span></div><div class="MsoListParagraphCxSpMiddle" style="margin-left: 64.35pt; mso-add-space: auto; mso-list: l0 level1 lfo22; text-align: justify; text-indent: -18.0pt;"><span style="line-height: 115%;">2.<span style="font: normal normal normal 7pt/normal 'Times New Roman';"> </span></span><span style="line-height: 115%;">Восстановленный и оригинальный тексты имеют смысловые различия, потерю или искажение важной информации.<o:p></o:p></span></div><div class="MsoListParagraphCxSpMiddle" style="margin-left: 64.35pt; mso-add-space: auto; mso-list: l0 level1 lfo22; text-align: justify; text-indent: -18.0pt;"><span style="line-height: 115%;">3.<span style="font: normal normal normal 7pt/normal 'Times New Roman';"> </span></span><span style="line-height: 115%;">Восстановленный и оригинальный тексты имеют смысловые различия, незначительную потерю или искажение информации.<o:p></o:p></span></div><div class="MsoListParagraphCxSpMiddle" style="margin-left: 64.35pt; mso-add-space: auto; mso-list: l0 level1 lfo22; text-align: justify; text-indent: -18.0pt;"><span style="line-height: 115%;">4.<span style="font: normal normal normal 7pt/normal 'Times New Roman';"> </span></span><span style="line-height: 115%;">Восстановленный и оригинальный тексты близки по смыслу, незначительное искажение информации.<o:p></o:p></span></div><div class="MsoListParagraphCxSpLast" style="margin-left: 64.35pt; mso-add-space: auto; mso-list: l0 level1 lfo22; text-align: justify; text-indent: -18.0pt;"><span style="line-height: 115%;">5.<span style="font: normal normal normal 7pt/normal 'Times New Roman';"> </span></span><span style="line-height: 115%;">Восстановленный и оригинальный тексты очень близки, информация не потеряна (искажена).<o:p></o:p></span></div><div class="MsoNormal" style="text-align: justify; text-indent: 1.0cm;"><span style="line-height: 115%;">Каждый эксперт даёт свою оценку, затем вычисляется средняя оценка (среднее арифметическое). В зависимости от этой оценки, проджект менеджер принимает решение о исправлении артефактов, переделке их или доработке.<o:p></o:p></span></div><div class="MsoNormal" style="text-align: justify; text-indent: 1.0cm;"><span style="line-height: 115%;">Если оценка ОСТ находится между 1 и 2 — качество артефакта очень низкое. Рекомендуется переработать не только тестируемый артефакт, но и родительский, для того чтобы внести однозначность в представленную там информацию. В этом случае может потребоваться несколько сессий ОСТ после доработки артефактов.<o:p></o:p></span></div><div class="MsoNormal" style="text-align: justify; text-indent: 1.0cm;"><span style="line-height: 115%;">Для артефактов с оценкой от 2 до 3 требуется доработка оцениваемого артефакта и рекомендуется ревью родительского артефакта для того, чтобы понять, что привело к потере информации. Дополнительные ОСТ сессии не требуются.<o:p></o:p></span></div><div class="MsoNormal" style="text-align: justify; text-indent: 1.0cm;"><span style="line-height: 115%;">Если средняя оценка от 3 до 4, требуется доработка тестируемого артефакта, чтобы исправить неточности.<o:p></o:p></span></div><div class="MsoNormal" style="text-align: justify; text-indent: 1.0cm;"><span style="line-height: 115%;">Если оценка больше 4, это подразумевает что артефакт хорошего качества, доработка не предполагается.<o:p></o:p></span></div><span style="font-family: Calibri, sans-serif; font-size: 11pt; line-height: 115%;">Естественно, финальное решение принимает менеджер проекта, и оно должно учитывать причины расхождений в исходном и восстановленном текстах.</span></div>Святослав Панкратовhttp://www.blogger.com/profile/13039405381364404095noreply@blogger.com0tag:blogger.com,1999:blog-4678276506533150023.post-22396552322904629462011-01-11T19:20:00.002+03:002011-08-13T20:38:21.571+04:00Аспектно-ориентированное программирование<div dir="ltr" style="text-align: left;" trbidi="on">Замечательный видео-обзор по АОП (<span class="Apple-style-span" style="font-family: tahoma, arial, verdana, sans-serif, 'Lucida Sans'; font-size: 11px; line-height: 15px;"><a href="http://spbalt.net/Content/Dmitri_Nesteruk_AOP.wmv">http://spbalt.net/Content/Dmitri_Nesteruk_AOP.wmv</a>)</span></div>Святослав Панкратовhttp://www.blogger.com/profile/13039405381364404095noreply@blogger.com0tag:blogger.com,1999:blog-4678276506533150023.post-56140972736116395232011-01-11T19:19:00.001+03:002011-01-11T23:21:25.028+03:00Звонок в техподдержку<iframe frameborder="0" height="360" src="http://vkontakte.ru/video_ext.php?oid=5568949&id=151375914&hash=a18f895012332958" width="480"></iframe>Святослав Панкратовhttp://www.blogger.com/profile/13039405381364404095noreply@blogger.com0tag:blogger.com,1999:blog-4678276506533150023.post-43946659125264413412011-01-11T19:17:00.003+03:002011-01-11T23:21:50.844+03:00Недостатки управления в IT<iframe frameborder="0" height="360" src="http://vkontakte.ru/video_ext.php?oid=5568949&id=155978939&hash=b0229db7153cff37" width="480"></iframe>Святослав Панкратовhttp://www.blogger.com/profile/13039405381364404095noreply@blogger.com0tag:blogger.com,1999:blog-4678276506533150023.post-69582894378135243732011-01-11T19:17:00.001+03:002011-01-11T23:22:04.542+03:00Думай иначе<iframe frameborder="0" height="360" src="http://vkontakte.ru/video_ext.php?oid=5568949&id=159596081&hash=13f940a906a6a0bd" width="480"></iframe>Святослав Панкратовhttp://www.blogger.com/profile/13039405381364404095noreply@blogger.com0