<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-5342535388237643243</id><updated>2012-02-04T21:54:01.121+02:00</updated><category term='подкасты для разработчика'/><category term='javascript'/><category term='Разное'/><category term='screenshoot'/><category term='xunit'/><category term='задачки'/><category term='юмор'/><category term='Access'/><category term='Super Mario'/><category term='обфускация'/><category term='рефакторинг'/><category term='moq'/><category term='ORM'/><category term='uml'/><category term='nosql'/><category term='.net'/><category term='tdd'/><category term='DDD'/><category term='юзабилити'/><category term='таблица html-кодов символов'/><category term='.net framework'/><category term='Windows 7'/><category term='переводы'/><category term='SpicIE'/><category term='Ошибка 720'/><category term='linq'/><category term='Оптимизация сайта'/><category term='java'/><category term='IoC'/><category term='php'/><category term='mpress'/><category term='sqlite'/><category term='разработка ПО'/><category term='html-верстка'/><category term='IE plugins'/><category term='NetBeans'/><category term='декомпилятор'/><category term='Shortcut'/><category term='DI'/><category term='visual studio'/><category term='C#'/><category term='RegExpr'/><category term='monodroid'/><category term='Библиотека'/><category term='slq'/><category term='книги'/><category term='IE8'/><category term='ms sql ce'/><category term='virus'/><category term='object db'/><category term='Tools'/><category term='unit testing'/><category term='IE'/><category term='html-entities'/><category term='отдых'/><category term='testing'/><category term='mono'/><category term='256'/><category term='Custom splash screen'/><category term='batch file'/><category term='Silverlight'/><category term='torrents.ru'/><category term='unity'/><title type='text'>холодильник - тоже космос...</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://sly-and-fluffy.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://sly-and-fluffy.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default?start-index=101&amp;max-results=100'/><author><name>Tatiana Shemyakina</name><uri>https://profiles.google.com/115825956619949451947</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-4MfXIVcZdJA/AAAAAAAAAAI/AAAAAAAAAbA/Iv1Gt6j8YgI/s512-c/photo.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>129</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-5342535388237643243.post-8836150562145488310</id><published>2012-02-04T21:54:00.000+02:00</published><updated>2012-02-04T21:54:01.139+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Разное'/><title type='text'>Мотивация</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-q3HCraYUgfs/Ty2MpDiMUuI/AAAAAAAAAoY/ytDybzA7P8U/s1600/motivation.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="256" src="http://1.bp.blogspot.com/-q3HCraYUgfs/Ty2MpDiMUuI/AAAAAAAAAoY/ytDybzA7P8U/s320/motivation.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt; &lt;o:OfficeDocumentSettings&gt;  &lt;o:RelyOnVML/&gt;  &lt;o:AllowPNG/&gt; &lt;/o:OfficeDocumentSettings&gt;&lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt; &lt;w:WordDocument&gt;  &lt;w:View&gt;Normal&lt;/w:View&gt;  &lt;w:Zoom&gt;0&lt;/w:Zoom&gt;  &lt;w:TrackMoves/&gt;  &lt;w:TrackFormatting/&gt;  &lt;w:PunctuationKerning/&gt;  &lt;w:ValidateAgainstSchemas/&gt;  &lt;w:SaveIfXMLInvalid&gt;false&lt;/w:SaveIfXMLInvalid&gt;  &lt;w:IgnoreMixedContent&gt;false&lt;/w:IgnoreMixedContent&gt;  &lt;w:AlwaysShowPlaceholderText&gt;false&lt;/w:AlwaysShowPlaceholderText&gt;  &lt;w:DoNotPromoteQF/&gt;  &lt;w:LidThemeOther&gt;RU&lt;/w:LidThemeOther&gt;  &lt;w:LidThemeAsian&gt;X-NONE&lt;/w:LidThemeAsian&gt;  &lt;w:LidThemeComplexScript&gt;X-NONE&lt;/w:LidThemeComplexScript&gt;  &lt;w:Compatibility&gt;   &lt;w:BreakWrappedTables/&gt;   &lt;w:SnapToGridInCell/&gt;   &lt;w:WrapTextWithPunct/&gt;   &lt;w:UseAsianBreakRules/&gt;   &lt;w:DontGrowAutofit/&gt;   &lt;w:SplitPgBreakAndParaMark/&gt;   &lt;w:DontVertAlignCellWithSp/&gt;   &lt;w:DontBreakConstrainedForcedTables/&gt;   &lt;w:DontVertAlignInTxbx/&gt;   &lt;w:Word11KerningPairs/&gt;   &lt;w:CachedColBalance/&gt;  &lt;/w:Compatibility&gt;  &lt;m:mathPr&gt;   &lt;m:mathFont m:val="Cambria Math"/&gt;   &lt;m:brkBin m:val="before"/&gt;   &lt;m:brkBinSub m:val="&amp;#45;-"/&gt;   &lt;m:smallFrac m:val="off"/&gt;   &lt;m:dispDef/&gt;   &lt;m:lMargin m:val="0"/&gt;   &lt;m:rMargin m:val="0"/&gt;   &lt;m:defJc m:val="centerGroup"/&gt;   &lt;m:wrapIndent m:val="1440"/&gt;   &lt;m:intLim m:val="subSup"/&gt;   &lt;m:naryLim m:val="undOvr"/&gt;  &lt;/m:mathPr&gt;&lt;/w:WordDocument&gt;&lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt; &lt;w:LatentStyles DefLockedState="false" DefUnhideWhenUsed="true"  DefSemiHidden="true" DefQFormat="false" DefPriority="99"  LatentStyleCount="267"&gt;  &lt;w:LsdException Locked="false" Priority="0" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="Normal"/&gt;  &lt;w:LsdException Locked="false" Priority="9" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="heading 1"/&gt;  &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 2"/&gt;  &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 3"/&gt;  &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 4"/&gt;  &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 5"/&gt;  &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 6"/&gt;  &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 7"/&gt;  &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 8"/&gt;  &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 9"/&gt;  &lt;w:LsdException Locked="false" Priority="39" Name="toc 1"/&gt;  &lt;w:LsdException Locked="false" Priority="39" Name="toc 2"/&gt;  &lt;w:LsdException Locked="false" Priority="39" Name="toc 3"/&gt;  &lt;w:LsdException Locked="false" Priority="39" Name="toc 4"/&gt;  &lt;w:LsdException Locked="false" Priority="39" Name="toc 5"/&gt;  &lt;w:LsdException Locked="false" Priority="39" Name="toc 6"/&gt;  &lt;w:LsdException Locked="false" Priority="39" Name="toc 7"/&gt;  &lt;w:LsdException Locked="false" Priority="39" Name="toc 8"/&gt;  &lt;w:LsdException Locked="false" Priority="39" Name="toc 9"/&gt;  &lt;w:LsdException Locked="false" Priority="35" QFormat="true" Name="caption"/&gt;  &lt;w:LsdException Locked="false" Priority="10" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="Title"/&gt;  &lt;w:LsdException Locked="false" Priority="1" Name="Default Paragraph Font"/&gt;  &lt;w:LsdException Locked="false" Priority="11" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="Subtitle"/&gt;  &lt;w:LsdException Locked="false" Priority="22" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="Strong"/&gt;  &lt;w:LsdException Locked="false" Priority="20" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="Emphasis"/&gt;  &lt;w:LsdException Locked="false" Priority="59" SemiHidden="false"   UnhideWhenUsed="false" Name="Table Grid"/&gt;  &lt;w:LsdException Locked="false" UnhideWhenUsed="false" Name="Placeholder Text"/&gt;  &lt;w:LsdException Locked="false" Priority="1" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="No Spacing"/&gt;  &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Shading"/&gt;  &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"   UnhideWhenUsed="false" Name="Light List"/&gt;  &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Grid"/&gt;  &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 1"/&gt;  &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 2"/&gt;  &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 1"/&gt;  &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 2"/&gt;  &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 1"/&gt;  &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 2"/&gt;  &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 3"/&gt;  &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"   UnhideWhenUsed="false" Name="Dark List"/&gt;  &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Shading"/&gt;  &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful List"/&gt;  &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Grid"/&gt;  &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Shading Accent 1"/&gt;  &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"   UnhideWhenUsed="false" Name="Light List Accent 1"/&gt;  &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Grid Accent 1"/&gt;  &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 1"/&gt;  &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 1"/&gt;  &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 1 Accent 1"/&gt;  &lt;w:LsdException Locked="false" UnhideWhenUsed="false" Name="Revision"/&gt;  &lt;w:LsdException Locked="false" Priority="34" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="List Paragraph"/&gt;  &lt;w:LsdException Locked="false" Priority="29" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="Quote"/&gt;  &lt;w:LsdException Locked="false" Priority="30" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="Intense Quote"/&gt;  &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 2 Accent 1"/&gt;  &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 1"/&gt;  &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 1"/&gt;  &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 1"/&gt;  &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"   UnhideWhenUsed="false" Name="Dark List Accent 1"/&gt;  &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Shading Accent 1"/&gt;  &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful List Accent 1"/&gt;  &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Grid Accent 1"/&gt;  &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Shading Accent 2"/&gt;  &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"   UnhideWhenUsed="false" Name="Light List Accent 2"/&gt;  &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Grid Accent 2"/&gt;  &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 2"/&gt;  &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 2"/&gt;  &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 1 Accent 2"/&gt;  &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 2 Accent 2"/&gt;  &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 2"/&gt;  &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 2"/&gt;  &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 2"/&gt;  &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"   UnhideWhenUsed="false" Name="Dark List Accent 2"/&gt;  &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Shading Accent 2"/&gt;  &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful List Accent 2"/&gt;  &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Grid Accent 2"/&gt;  &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Shading Accent 3"/&gt;  &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"   UnhideWhenUsed="false" Name="Light List Accent 3"/&gt;  &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Grid Accent 3"/&gt;  &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 3"/&gt;  &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 3"/&gt;  &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 1 Accent 3"/&gt;  &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 2 Accent 3"/&gt;  &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 3"/&gt;  &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 3"/&gt;  &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 3"/&gt;  &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"   UnhideWhenUsed="false" Name="Dark List Accent 3"/&gt;  &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Shading Accent 3"/&gt;  &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful List Accent 3"/&gt;  &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Grid Accent 3"/&gt;  &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Shading Accent 4"/&gt;  &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"   UnhideWhenUsed="false" Name="Light List Accent 4"/&gt;  &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Grid Accent 4"/&gt;  &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 4"/&gt;  &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 4"/&gt;  &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 1 Accent 4"/&gt;  &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 2 Accent 4"/&gt;  &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 4"/&gt;  &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 4"/&gt;  &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 4"/&gt;  &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"   UnhideWhenUsed="false" Name="Dark List Accent 4"/&gt;  &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Shading Accent 4"/&gt;  &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful List Accent 4"/&gt;  &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Grid Accent 4"/&gt;  &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Shading Accent 5"/&gt;  &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"   UnhideWhenUsed="false" Name="Light List Accent 5"/&gt;  &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Grid Accent 5"/&gt;  &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 5"/&gt;  &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 5"/&gt;  &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 1 Accent 5"/&gt;  &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 2 Accent 5"/&gt;  &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 5"/&gt;  &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 5"/&gt;  &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 5"/&gt;  &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"   UnhideWhenUsed="false" Name="Dark List Accent 5"/&gt;  &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Shading Accent 5"/&gt;  &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful List Accent 5"/&gt;  &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Grid Accent 5"/&gt;  &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Shading Accent 6"/&gt;  &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"   UnhideWhenUsed="false" Name="Light List Accent 6"/&gt;  &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Grid Accent 6"/&gt;  &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 6"/&gt;  &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 6"/&gt;  &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 1 Accent 6"/&gt;  &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 2 Accent 6"/&gt;  &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 6"/&gt;  &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 6"/&gt;  &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 6"/&gt;  &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"   UnhideWhenUsed="false" Name="Dark List Accent 6"/&gt;  &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Shading Accent 6"/&gt;  &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful List Accent 6"/&gt;  &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Grid Accent 6"/&gt;  &lt;w:LsdException Locked="false" Priority="19" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="Subtle Emphasis"/&gt;  &lt;w:LsdException Locked="false" Priority="21" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="Intense Emphasis"/&gt;  &lt;w:LsdException Locked="false" Priority="31" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="Subtle Reference"/&gt;  &lt;w:LsdException Locked="false" Priority="32" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="Intense Reference"/&gt;  &lt;w:LsdException Locked="false" Priority="33" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="Book Title"/&gt;  &lt;w:LsdException Locked="false" Priority="37" Name="Bibliography"/&gt;  &lt;w:LsdException Locked="false" Priority="39" QFormat="true" Name="TOC Heading"/&gt; &lt;/w:LatentStyles&gt;&lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 10]&gt;&lt;style&gt; /* Style Definitions */ table.MsoNormalTable {mso-style-name:"Обычная таблица"; mso-tstyle-rowband-size:0; mso-tstyle-colband-size:0; mso-style-noshow:yes; mso-style-priority:99; mso-style-qformat:yes; mso-style-parent:""; mso-padding-alt:0cm 5.4pt 0cm 5.4pt; mso-para-margin-top:0cm; mso-para-margin-right:0cm; mso-para-margin-bottom:10.0pt; mso-para-margin-left:0cm; line-height:115%; mso-pagination:widow-orphan; font-size:11.0pt; font-family:"Calibri","sans-serif"; mso-ascii-font-family:Calibri; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:"Times New Roman"; mso-fareast-theme-font:minor-fareast; mso-hansi-font-family:Calibri; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi;}&lt;/style&gt;&lt;![endif]--&gt;&lt;br /&gt;&lt;div class="MsoNormal"&gt;Да, эта статья, именно, о мотивации. Нет, это неочередные&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp; &lt;/span&gt;«стопицот способовзамотивироваться». И не очередное тыканье &lt;a href="http://ru.wikipedia.org/wiki/%D0%9F%D0%B8%D1%80%D0%B0%D0%BC%D0%B8%D0%B4%D0%B0_%D0%9C%D0%B0%D1%81%D0%BB%D0%BE%D1%83"&gt;пирамидойМаслоу&lt;/a&gt; (хотя с неё, наверное, стоило бы начать, ведь именно потребностиявляются основными двигателями). Все мы знаем свои потребности – именно тенедостающие детали мозаики наших поступков, объясняющие всё – и на нихостанавливаться не будем. &lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp;&lt;/span&gt;Есть цель,определяющаяся потребностями, есть дорога к цели, состоящая, например, изтасков в проекте или материалов к экзамену, и есть мотивация, которая изаставляет нас, двигатель, работать. Но порой двигатель глохнет. Вроде и дорогане ухабистая, вроде и ехать не далеко, а вот не едется. То ли бензинзакончился, то ли бак вообще не заправляли, то ли слил кто-то весь бензин.Бывало? У всех бывало. И не раз. Ведь слабая мотивация занимает третье место вперечне причин, препятствующих росту бизнеса*.&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;div class="MsoNormal"&gt;Причины отсутствия мотивации можно перечислять иперечислять. Но меня больше интересует момент, когда мотивации нет из-за цели.Когда цель уже не привлекательна. В какой-то момент непреступные доселе горныевершины превращаются в холмики, на которые уже просто скучно взбираться. Идаже, если на холмике тебя будет ожидать сундук с сокровищами, - всё равноскучно. &lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp;&lt;/span&gt;В книге Э.Йордона «Путькамикадзе» есть хорошая цитат по этому поводу:&lt;/div&gt;&lt;div class="Cite" style="margin-left: 0cm;"&gt;«Деньги, выгода, комфорт и тому подобноеявляются факторами «гигиены» – их отсутствие вызывает неудовлетворённость,однако они не могут заставить людей полюбить свою работу и дать им необходимыевнутренние стимулы. Что действительно может дать такие стимулы, так этоощущение значительности достигнутых результатов, гордость за хорошо выполненнуюработу, более высокая ответственность, продвижение по службе и профессиональныйрост – все то, что обогащает работу»&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;Джоел Спольски в своей книге «Джоэл о программировании» тожезатрагивает эту тему. Обсуждая такой способ мотивации, как поощрительные премиина основе оценок продуктивности, он всячески советует не использовать его. И онполностью прав, т.к. , наверно, каждый разработчик уверен, что работает хорошо,и его код, как минимум, достаточно хорош, если не идеален. И оценка, отличнаяот его самооценки, может вызвать обратный эффект – «зачем стараться, если всёравно меня никто не ценит?». Людей же, неуверенных в себе, плохая оценка вообщеможет убить. «Ну вот, ещё одно подтверждение, что я – никудышный программист» &lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;Как же правильно мотивировать людей? Как правильно ихпоощрять за проделанную работу? Какое самое запоминающееся поощрение вы получали?&lt;/div&gt;&lt;div class="MsoNormal"&gt;Для меня, например, большой наградой стала фраза: «Эй, мывтроем – два разработчика и один менеджер – за два года сделали то, что несмогла сделать команда из 6-ти людей за 2 с половиной года!», сказаннаяневзначай после сдачи проекта, который, казалось, никогда не закончится. Ну, и,конечно же, греют положительные отзывы пользователей &lt;span style="font-family: Wingdings; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-char-type: symbol; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-symbol-font-family: Wingdings;"&gt;&lt;span style="mso-char-type: symbol; mso-symbol-font-family: Wingdings;"&gt;J&lt;/span&gt;&lt;/span&gt;, осознание, что продукт,выпущенный в итоге, востребован, нужен людям, что время, потраченное наразработку окупается с торицей. &lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span lang="DE" style="mso-ansi-language: DE;"&gt;P&lt;/span&gt;.&lt;span lang="DE" style="mso-ansi-language: DE;"&gt;S&lt;/span&gt;. &lt;a href="http://www.hanselman.com/blog/MaslowsHierarchyOfNeedsOfSoftwareDevelopment.aspx"&gt;Авот пирамида Маслоу в свете потребностей разработчиков&lt;/a&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0cm;"&gt;* Поисследованию&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp; &lt;/span&gt;«Управление ростом иконкурентоспособностью российских компаний», проведенном Ассоциацией менеджерови консалтинговой компанией Accenture.&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0cm;"&gt;* FrederickHerzberg&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5342535388237643243-8836150562145488310?l=sly-and-fluffy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sly-and-fluffy.blogspot.com/feeds/8836150562145488310/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://sly-and-fluffy.blogspot.com/2012/02/blog-post_04.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/8836150562145488310'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/8836150562145488310'/><link rel='alternate' type='text/html' href='http://sly-and-fluffy.blogspot.com/2012/02/blog-post_04.html' title='Мотивация'/><author><name>Tatiana Shemyakina</name><uri>https://profiles.google.com/115825956619949451947</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-4MfXIVcZdJA/AAAAAAAAAAI/AAAAAAAAAbA/Iv1Gt6j8YgI/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-q3HCraYUgfs/Ty2MpDiMUuI/AAAAAAAAAoY/ytDybzA7P8U/s72-c/motivation.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5342535388237643243.post-2981959000192802406</id><published>2012-02-01T10:52:00.003+02:00</published><updated>2012-02-01T10:52:43.328+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='юмор'/><title type='text'>Чужой код</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-avcBTpfw_j0/Tyj9QCfhXbI/AAAAAAAAAnw/4QR2Ko8xe74/s1600/y_1385123a.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="524" src="http://4.bp.blogspot.com/-avcBTpfw_j0/Tyj9QCfhXbI/AAAAAAAAAnw/4QR2Ko8xe74/s640/y_1385123a.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5342535388237643243-2981959000192802406?l=sly-and-fluffy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sly-and-fluffy.blogspot.com/feeds/2981959000192802406/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://sly-and-fluffy.blogspot.com/2012/02/blog-post.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/2981959000192802406'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/2981959000192802406'/><link rel='alternate' type='text/html' href='http://sly-and-fluffy.blogspot.com/2012/02/blog-post.html' title='Чужой код'/><author><name>Tatiana Shemyakina</name><uri>https://profiles.google.com/115825956619949451947</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-4MfXIVcZdJA/AAAAAAAAAAI/AAAAAAAAAbA/Iv1Gt6j8YgI/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-avcBTpfw_j0/Tyj9QCfhXbI/AAAAAAAAAnw/4QR2Ko8xe74/s72-c/y_1385123a.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5342535388237643243.post-5229901525441385783</id><published>2012-01-30T11:09:00.001+02:00</published><updated>2012-01-30T11:09:47.700+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='юмор'/><category scheme='http://www.blogger.com/atom/ns#' term='Разное'/><title type='text'>Over engineering</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;b&gt;Загадка&lt;/b&gt;: "На столе сидело три мухи. Я взял тапок и прибил им одну муху. Сколько мух осталось на столе?"&lt;br /&gt;&lt;b&gt;Официальная отгадка&lt;/b&gt;: одна (две других улетели).&lt;br /&gt;&lt;b&gt;Неофициальная отгадка умного человека&lt;/b&gt;:&lt;br /&gt;"Если она не прилипла к тапку, то 3;&lt;br /&gt;Если 2 улетели от страха, а одна прилипла к тапку - 0;&lt;br /&gt;Если 2 бесстрашно остались сидеть, и одна не прилипла к тапку - 3;&lt;br /&gt;Если 2 улетели, а одна не прилипла к тапку- 1;&lt;br /&gt;Если 1 прилипла к тапку, а 2 бесстрышно остались сидеть - 2"&lt;br /&gt;Вывод: умные люди даже в простых загадках всегда рассматривают проблему не поверхностно и проводят глубокий анализ ситуации:)"&lt;br /&gt;&lt;b&gt;Дополнение&lt;/b&gt;: &lt;br /&gt;Также возможно, что одна муха улетает, другая бесстрашно сидит на столе, а третья прилипает/не прилипает к тапку.&lt;br /&gt;Еще не рассмотрены варианты прилета новых мух, не зарегестрированных на столе в начальный момент времени.&lt;br /&gt;Так же в условии задачи не говорится какую именно муху убили. Может быть случайно мимо пролетавшую, и эти три даже ничего не заметели (а трупик убитой мухи кстати мог упасть на стол).&lt;br /&gt;Так же автор почему-то не рассматривает (что я нахожу крайне странным) возможность встречи стола с антистолом и их анигиляции. В этих условиях поиск решения становится довольно затруднительным.&lt;br /&gt;&lt;a href="http://bash.org.ru/"&gt;bash.org.ru&lt;/a&gt;&amp;nbsp; &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5342535388237643243-5229901525441385783?l=sly-and-fluffy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sly-and-fluffy.blogspot.com/feeds/5229901525441385783/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://sly-and-fluffy.blogspot.com/2012/01/over-engineering.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/5229901525441385783'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/5229901525441385783'/><link rel='alternate' type='text/html' href='http://sly-and-fluffy.blogspot.com/2012/01/over-engineering.html' title='Over engineering'/><author><name>Tatiana Shemyakina</name><uri>https://profiles.google.com/115825956619949451947</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-4MfXIVcZdJA/AAAAAAAAAAI/AAAAAAAAAbA/Iv1Gt6j8YgI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5342535388237643243.post-3751474711064322129</id><published>2012-01-25T11:41:00.000+02:00</published><updated>2012-01-25T11:41:53.385+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='visual studio'/><title type='text'>Возвращение блудных шаблонов в VS</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Постигла такая беда: пропали все шаблоны создания новых файлов / проектов в Visual Studio.&lt;br /&gt;Лечится так: в Visual Studio Comand Prompt запускаем команду &lt;strong&gt;devenv /installvstemplates. &lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;&amp;nbsp;&lt;/strong&gt;&lt;img alt="" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAqUAAAFWCAIAAADfVHNPAAAbqUlEQVR4nO3dzXIbR7omYNwGdSlzC3MJ0kLenaXD0Y7ouYCOoFaO8abvYGyGF82NgmO7JcIO+6g9MW2H58jqnvaivXG7dSyChGjrx4aaZwESLFRlZmUVCgSRep5wKKBi4ssvswr1EhBljX744YfxeLx/YQ8A2H6LZB+Pxz/88MPo4ODgyy+/fPHixSkAXCefffbZs2fPfh7Cs2fPDg4Ohqq2joIrevbs2WeffdbcwxcvXnz55ZcHBwej/f39Fy9eTKfTYwC4Tj755JOnT59Oh3B6enpwcHB6ejpItXUUXNHTp08/+eST5h5Op9MXL17s7++P9vf3nz59OgGAa2Y8Hk8Hejs6nU7/+Mc/DlVtHQVXNJ1Ox+NxcBufPn16nvfT6fSKTyEAtBo27westo6CK0rk/XQ6vcz7o7W54osDWFjf6xquxuHh4cnJySAvh+Pj488+++z4+HiQausouKKTk5PDw8PgNp7n/d7e3snJybBnaNOrBuqGfY3D1Tg8PDw+Ph6k1PHx8Z/+9Kehqq2j4IqOj49jeX9ycrK3tzdw3iduN5v6iANeN1KfYgyY95PJ5M9//nP6VfDfQ1YpmPDGG2+88cYbzce9HWfm/ZPVBCcY8r0J0Ffw5bniSx6uxuHh4WQyGaTU0dHR119/nb74/3fIKgVb57p9+/bt27fTE2WaTCaHh4fBL13m/fHx8Spz5CT9ht/vwGsmJ/VXedXD1Rg27//yl7/k5P3iddSa960FExb1F5P2q7OQyPvj4+PLvP8x4p13f9/pvyfL8R98t7GhGyAUrvXNffMuEHvhwzVx//79o6OjxID/FhIc+eTJk7/97W/py/7g4ODg4CD222bBb7/9dpXX0UFF7yILR0dH9+/fD37peJH3k8kk9vx33v39f/z/72L//dv/+J/VX9959/eRpP/m/Vs7Ozf3Hm36hnhNjO/cWN6NR3u3dm7uPRrfubGzc2e8Ut3G08d3buzM9TkBi5Kdenu0d+t8zhVWswahDbrcn821e37+l5pZnK3LzVw6gfWLqDrsm/lL7ub73zRSX96zXVrz/iAkNvi7775LTzd/+uJP7luTuLVgwu3bt6s93759u3epuUTeTyaTrLz/P//3z5n/RfP+m/dv9c2bMtVyZ3G7H7bseeWLQ4/2bs0fBb8tyC6Z9ZSL5az6HczAYnk/P/Zob83flUY289HerfnhR3u3LqZfpPllrC8/qn0D0Bg2mUwOd28sEj/xLn/FWwysVWveB19rscHff/99erpO3z3kFGyda97wIG/xc/P+PyPeeff3o2zzz/ObH+l/8/6tnd3Dxd1n6LvoNlq68w8V94E8ib7jX1veNz67uE7Sed/ru5tVp6/EfWhs9SnL18nS7+bDLr+7nr/SDndv3HzvYSjmqzeC2GsfroN79+49efJkqGqt8Rx85SbGf//9972bmb9gm497Ozo6unfvXmyu87w/OjqKPX+IvJ/H/fnbjdoHktW3KfMPJJdScGfxWXL1fc/lB8yN+3RwZPWzzp07d6qf3+7s3Bk/2ru1c/POnZvLH5pWnrJzc+/R8se+88L1IRc34XqtUJ5Xur/8cmXg0lu4aoHLx9WOom/cG+9Zlz8xjoTd5ew3b+4s3nvGtqY+Xzjum+3OZ7w4HxcLrS0n/uVmG8u7vxSGtdWEz8Ti8eXM1Wmj5/niKZFG4h/VX5QKfxNwc+/R8nZGv0u8fDyZx/zO7uGkHvjynm107969REJ1tcrb8VjeD1twFYm8Pzo66pD3Z2dnZ2dn1XSv/XaR9/Wf11u++1ze6Rp3tPPb6nLgLad47WAi7ysjq59ph2JpPm+lh+W8qn0kvvhq9Y3sYkywVjADFy3XgjT0hPCtfanUIlLC0bFT3YFasNc3sbLgyvdcS3/E3Fh3c1mBHqoTVSKw+q3T0upbvtwsXtn95WON1YQ7Xv5hhcp3HanzfJHji+8TYpdB/NOWxsWxWOOKef/N+7d2du8HPsmv3SaGupnC4OZ5P1Qi/vOf/5xf8MMWvCaGyftFtM8fVH9tzfvLm8/88eJ+dX7zqr27PX8HVn28uCWO79zYubN38Xao9oY7OjKYtvEEXcrh+hvS2hvwyr27sZrAmGDORDpZetcXGVPdgUTeX07XbD2Q94ntWGxtY93R3zcXUKtV+1anWqPly80zFNin9hPS2MX4Di1vUmBE+Bu2pW8j2vM+9g2mvOd1dO/evaH+Pl7xJpPJkHlfe39fOx7K+8Pd5VRu3CWX8/7OeHznxjzpb+7tLb1r37u807a8v18e2S/vw/E4ZN5fflOy9JPYy8+Of55fe9/amvfh2Bk878N/fp/I+8gnJ9V3y+EvB85Q77zPec8f3aRB877+iUn1KctVl363GLb05/fynu03z/vg/0CCqvkuZeX944jE+/vm9wHvvPv7H3/8sfrtxtH93RsXN5zFD+rvHlbvScuPdg8vvkM4f7R7OJlUDl3+NEDjg4PoyPlfBrz8q0nLP9N08bcHLt8Q7eweVr9+uHvj4qtLT6sfv5yrVqv+V6MWzpu9/FJj4MWBw90b8y/M618cqsxz8/1vlrdkMUV1jxY/xtVo/LyZ85+zqOxgdTcXkzSfvtxz5eA3798638+lnav3W9/Zi0aiXw6dofpZvdin5mpqZyF1LHqe6+1WJg1eBuGpLi/o8HYun7bK1bF8sdSGnf+h/f3dGzf/1388CcZ89V4Qe/nDxn366aeff/75hAyff/75gwcPgtvYIe+D7+ar8T9/0Mz7StyfR/7h7o2d3d3Gm/6LjF3Km+UUr9wTW/K+PnLpU4bLm/BSMtxc/GzVxS106ZOJQOwsAqT6tGCtWN7PpwjcwiuFq0mws7Ozc3N392bl+6Pl+WPRtVzr8u9HLuJ7Z2dnflYqEVU7WHvXWFt3aGG1EdVjldPSN+9DZyiU9+HV1HpNH4ud53TeBy6ppY2fVMs313O5TZeHl74FSQy7eMXd371x871K3Mt7ts/XX3/96aef/pEMDx48+Otf/xrcxm55nyPw/j78mUP1LwZPloJ5E6JxvOFabK1ul8GQ13/1tXZ/98bN9x4+CeV97bO+td2rYQBff/31l9fY/7s2YmH/uJr3k8kkNqhH3mdEvrynaF0vg4Eum+qr7OF7t3a8uQceP378+PGk+v/biQ3q+v/PX9xQ0pF/rczvjA/bB15xLbbW9bgMgu/svbmH11BW3req3Tuqt5XaXxXY8M0PXhu1l56wh9fcWvL+Pxv/H4MnwIa0/r27AW8owLU1TN7Ptaa+7IerEXzpSXp4nU1y/r2cToI3GjEPGxF7PQ7yYge2yGXeHx8fD1g3dpcBNmvAlzmwRY6Pj9eS91Wbvr/B625NL21gi1zm/cnJyaZvSgDAWpycnJzn/XQ6bf7h3wkAsG2agT6dTlvy/t8BgO3RM+8/+uij/P+ZLgAwlLPuPvroo5XyflyxvoWtu/5QtqXPTq7g/Ha1pn5qZZuzXKt9WP28VJ8eLLW+9Xa9bwx7n4mVWr1+rM/xsuazEnVWP8WJxV7x9TzseXzNXXXet94vgmLDEk/flutjK/rs1OFiRddqaWtqpnonSty1B5+3h8R5ye+w9fW77vVm1k/32a/Ddaw31metbPq3OQNW7KdfzQGvhOvzOtpqW5D3sWGugKvRdZ9fq/MyDtl0U2GDvI56vH6H1eOmsY4sHEqsz8Xjxa/VB81OYuMH76dfqdVd51fWFtlk3tcEL+VxQ/p4Zp3gvKO8q6pT/WbPmXW6jk8fX0ed9P7Ejuevt7V4zrq6rrdrS839GYcu0VX2oVOd1uOt/ScWOxp6/zvVSawif1hsvZn99F5vjmAP4/glEXxucHx6rtrTa49jM+asZcB9G3CfX2dXnfej5UtqIXFt5V8Bia/G6ne9prvWaa2f2IrqRvWeq/b0Hn3mbEttcLXz/PrNZ8Xqd+q/dVGd6sTKNre307yjyD507TP9uFo51mHmemNPHHCfc+q3tppZoXefmevN7Lb523HjMghWTo9PzxgsnjjYaf8TBzeyz6+5DeT9XPp6Sl/c6eOJ+vmP02WbfQ51HVenGEVek50eB+vk95+5LekV5dRvLrO1eKc+E4Mz96Fr2a5NBveh63p77E/OMnPqxw7267O6G727Xb2fruttHd+1yXHjMugxPj1vsHLtSz3WtdZ9zm+DqqvO+x7XUOxL6fOdeIWsch3nNLOO67hr/cXjxa+1B5n1E0+J6dR/1/o99rN10k7nK79s5oD0l7qut8c+b9f+Z3bbdR+G6qd1fLrV5sHFr+klpMenpx7kvHRdV9f6sUkzm2EuFuq/+93vNpb3sUsw83i6SOxLzUs/qHf/+ddr63I6Pa5tUe/+Y43lrCizfo4e/bdOGvzSQn4/wam7zpuov8rjWP1R3/PbWm3w/tOrSAyLtbSOflrHZ/aZKBus3DogMfUg+7Du+p32eXyhtcnXTSzsHzx4EIv8df39+9jxUfz8tdZpveaaT2zdsmCfOddfok6tz9bxrfO2DuvRf+/NaZ03s3izmdZ1jdZ8PWTuc2ufXfet6/FE/VGX8xtcdY/1jjLOY+x4ZreJkWvtJ7/D9KJai+eMT88b/G2sSKd11Z6SUyfneE6fsXkZhfJ+HvZzwcgf5s/vr4nmBbTJbtg01wNQqmacv1pWeN6Pen3fSsFcD0CRYn9In1Ba3gNA8eQ9AJRP3gNA+eQ9AJRP3gNA+eQ9AJTv7Ozs6Ojo9PR0lk3eA8CWmef9V199ddjmq6++evny5cuXL+U9AGyZs7Ozr7766uHDh60f4z98+HAe+fIeALbM2dnZ4eHh2dnZq1evptPp48eP//73vz969Ojbb7/97rvv/vGPf/z444+TyWQ6nc5HynsA2D5nZ2cff/xxZt5//PHH8h4Ats/85+0z8/6jjz6S9wCwfeQ9AJTv7Ozsww8/bOb9W2+91cz7Dz/8cJi8X/2fIIv9o8jbotl/8F99jj1lTf20zj74vP2svg+t/+7t+tbb9TwOe95jpQasH5sxc4pO49PnMVgnXXbArd6Iq28+drKGvW7XZ1v6HEQw7998880PPvjg7bffXkvep1+iNa2vzMw611DOrSr9rH6TJpqZfzXx6u0974Bqfda+1LVIsE7s4IAy67deJENNPch6Wy+bnNd7cHz6um2dq1Mb1+dSz7GO12mPCrF5N9VPjyk63T3W2Mo6NfP+N7/5zXvvvffBBx/84Q9/+O1vfztw3qdfeOMLsQFVidfzVmiutMezVpy0drym9yxrNcidZeMXT+akiT57t72O9cYum8WRxa/pqWPjc056p71KdHKdL/6a9Z3KoZ61eodXczryZ9miy6OpmffzLJ9MJicnJ6enp+vN+5r0LSM4uPa4WiH4mo/VH4fuL/l1xg2pXQ/139pn81mZ6woeD5YNLqFT/eqRxBZdQf+jpOYC+/XTo05iFfnDYuvN7Kf3ert2uzgyDl0SiQrN8cHnZq49p9tO+5O5z5nF83vO7L913szxrfVjzaSb7N1/7/GLx7ElNA8O0k/i+EbE/vw++PN6a8/7mMQZiu37aPnUBs994nGsTqyr6uBYw5n9J5acaDJ/Xekjsf4z5x0NtP/px8FNi+1YUHp/8tfbWiezfmurmRV695m53pxWg0fGjcsgXSE4PlG/X8/V6Trt27of53eePt5j3tY2ggOuuJ/W546zT2u6/6H6SU9xZYKf57/55ptvvfXW22+/vfbP8/Pln6HxhdHy6e93ncWeXv3qKHmd5awofQEljo8bWisk6iSem188uG+t+5xoL3PqnD3PqR872K/P5nnp0e3q/XRdb+v4rk2OG5dBukJsfGafOT3n71XVOsbn99w6MnN/EkXSx2vr6lptqH5a93ncuH7SWx070lxvp34S69qI4Of5iz+/X/vn+cHfxnZn9esj/3HvOuPGdRaTHpO5utaJMveztWz+vJ32Lad+5tQ5e967n6599q6f32enfR5w/zO7rR1Z/JoulTO+xxoTjXWqs9bxmfucHpa5rkS1Tnve2tUV9BM8vvg1c6vz++zUT/6AqxH8PP/JkycffPDBycnJVf98/vhCrN3WyyV2PGfSruc1+Lh5neWsJf+rmddlzkbV2k6vPXPe2HRd++xaP7GWmHFFotrg/adXkRgWa2kd/bSOb+22teyocgoyxyfaS0/dWrbHvgXnHapOTOuwofrJH59uLLbVmX127ac6uNMS1t1PcNKrF/vz+8lkck3//n11r2OnLVi5ddLmuUnXGUXOffO3sbla+4y1lNNq63oXw9L9d5o3c129j6cXlbPe5vhEn63rHUWuh5zjmd0mRq61n/wO04tKLDZ9MD11c4p0V/mDR/H9CT6l66SxJYdWGWgy8aXm1iXmbV1XsMn0/uQcj623dz+Jyol+0vuWWG+nftLrunpX/fN6m15vXfMEb7IbANbA7X0k70fX7PsvAIblJj8n7wGgfGdnZ1988cU88tM+/PDDL774Qt4DwPY5Ozs7Ojq6e/fue23u3r378uVLeQ8A22ee96enpy+zyXsA2DKz2Wye97Ns8h4Atoy8B4DyyXsAKJ+8B4DyyXsAKJ+8B4DyyXsAKJ+8B4DyyXsAKN9m8n71f60o9o8Wb4tm/8F/NTn2lDX10zr74PP2s/o+tP47yOtbb9fzOOx5j5UasH5sxswpOo1Pn8dgnWt1JcNV2kDet95qqxJf7VTnGsq5VaWf1W/SRDPzrwZvtddnh2t91r7UtUiwTuzggDLrt14kQ009yHpbL5uc13twfPq6bZ2raxtQpKvO+/QLr5k0iVdm6y37mmuutMezVpy0drym9yxrlV5CjyIbWWzmpOsIrXWsN3bZLI4sfk1PHRufc9I77dV1vsJhTTac9zXpW0ZwcO1xtULwNR+rH7y/5NcZN6R2PdR/a5/NZ2WuK3g8WDa4hE71q0cSW3QF/Y+Smgvs10+POolV5A+LrTezn97r7drt4sg4dEkkKjTHB5+bufbMbqFs1yvvYxIv9dj9qzpglHdfyKkT66rrfS3Rf2LJiSbz15U+Eus/c97RQPuffhzctNiOBaX3J3+9rXUy67e2mlmhd5+Z681pNXhk3LgM0hWC4xP1+/WcvzQowHbk/ajLJ3LV+2PzQebjWJ3q8eBzM+9rzZqt6003WeuntYf04OZz84sH9611nxPtZU6ds+c59WMH+/XZPC89ul29n67rbR3ftclx4zJIV4iNz+wzp+eupwC23YbzPnaLDPaafm76eI/7YL86mfe11jGZq2udKHM/W8vmz9tp33LqZ06ds+e9++naZ+/6+X122ucB9z+z29qRxa/pUjnje6wx0Ri8Pq4670fZb6mDcm5Dne4R1Ulb7xGJOl3va61jMleXc79LTFRtO732zHlj03Xts2v9xFpixhWJaoP3n15FYlispXX00zq+tdvWsqPKKcgcn2gvPXVmWSjbBvJ+1HarTave42Iv8sQdLTFpzk1ktHyTaj5olkrM1dpnrKWcVlvXuxiW7r/TvJnr6n08vaic9TbHJ/psXe8ocj3kHM/sNjFyrf3kd5heVGKx6YPpqZtTpLtKD272n7lw2CKbyfvro3mD22Q3wCbIe14Hr3vej1b7sAEogLzndSDvAaB88h4AyifvAaB88h4AyifvAaB88h4AyifvAaB88h4AyifvAaB88h4AyifvAaB88h4AyifvAaB88h4AyifvAaB88h4AyifvAaB88h4AyifvAaB88h4AyifvAaB88h4AyifvAaB88h4AyifvAaB88h4AyifvAaB88h4AyifvAaB88h4AyifvAaB88h4AyifvAaB88h4AyifvAaB88h4AyifvAaB88h4AyifvAaB88h4AyifvAaB88h4AyifvAaB88h4AyifvAaB88h4AyifvAaB88h4AyifvAaB88h4AyifvAaB88h4AyifvAaB88h4AyifvAaB88h4AyifvAaB88h4AyifvAaB88h4AyifvAaB88h4AyifvAaB88h4AyifvAaB88h4AyifvAaB88h4AyifvAaB88h4AyifvAaB88h4AyifvAaB88h4AyifvAaB88h4AyifvAaB88h4AyifvAaB88h4AyifvAaB88h4AyifvAaB88h4AyifvAaB88h4AyjebzSaTibwHgJLJewAon7wHgPLJewAo3zzvf/rpJ3kPAMWS9wBQPnkPAOWT9wBQPnkPAOWT9wBQPnkPAOWT9wBQPnkPAOWT9wBQPnkPAOWT9wBQvtlsdnx8LO8BoGTyHgDKJ+8BoHzyHgDKJ+8BoHzyHgDKJ+8BoHzyHgDKN5vNTk5Ofv75Z3kPAMWS9wBQPnkPAOWT9wBQPnkPAOWT9wBQPnkPAOWT9wBQvkXev8om7wFgy8h7ACifvAeA8sl7ACjfbDabTqfyHgBKJu8BoHzyHgDKJ+8BoHzzvH/27Jm8B4BiyXsAKJ+8B4DyyXsAKJ+8B4DyyXsAKJ+8B4DyyXsAKJ+8B4DyzWazp0+fynsAKJm8B4DyyXsAKJ+8B4DyzfP++fPn8h4AiiXvAaB88h4AyifvAaB8s9ns9PRU3gNAyeQ9AJRP3gNA+eQ9AJRP3gNA+eQ9AJRP3gNA+eQ9AJRvNpv99NNP8h4ASibvAaB88h4AyifvAaB8s9ns559/fvHihbwHgGLJewAon7wHgPLJewAo32w2e/bs2cuXL+U9ABRL3gNA+eQ9AJRP3gNA+eQ9AJRP3gNA+eQ9AJRP3gNA+Waz2fPnz3/55Rd5DwDFkvcAUD55DwDlk/cAUL7ZbPbixYtffvnlX9nkPQBsGXkPAOWT9wBQPnkPAOWT9wBQPnkPAOWT9wBQPnkPAOWbzWYvX7789ddf5T0AFEveA0D55D0AlE/eA0D55D0AlE/eA0D55D0AlE/eA0D5ZrPZL7/8MpvN5D0AFEveA0D55D0AlE/eA0D5ZrPZr7/++urVK3kPAMWS9wBQPnkPAOWT9wBQPnkPAOWT9wBQPnkPAOWT9wBQPnkPAOWbzWaz2UzeA0DJ5D0AlE/eA0D55D0AlG8e9q9evTrLJu8BYMvIewAon7wHgPLJewAo3+KH9eQ9ABRL3gNA+eQ9AJRP3gNA+eQ9AJRP3gNA+eQ9AJRP3gNA+eQ9AJRP3gNA+eQ9AJRP3gNA+Waz2b/+9S95DwAlk/cAUD55DwDlk/cAUL78mJf3ALCt5D0AlE/eA0D55D0AlE/eA0D55D0AlE/eA0D5mnH+u2XyHgC2XjPOX7169eDCq1ev5D0AbL3gJ/bzyA+GvbwHgO0T+0P6WNjLewDYPrFQT5D3ALBl5D0AlE/eA0D55D0AlE/eA0D5rjTv/x0A2B498x4A2C6d8x4AKIC8B4Dynef9/v6+vAeAUk2n0/39fXkPACWT9wBQvsu8f/78efAn+gCArXZycvL8+fP9/f3R3bt37969+/z58ykAUJbnz5/Pg/487/cv7AEA22+R7POg/y8lIqQ54nDKdAAAAABJRU5ErkJggg==" /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5342535388237643243-3751474711064322129?l=sly-and-fluffy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sly-and-fluffy.blogspot.com/feeds/3751474711064322129/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://sly-and-fluffy.blogspot.com/2012/01/vs.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/3751474711064322129'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/3751474711064322129'/><link rel='alternate' type='text/html' href='http://sly-and-fluffy.blogspot.com/2012/01/vs.html' title='Возвращение блудных шаблонов в VS'/><author><name>Tatiana Shemyakina</name><uri>https://profiles.google.com/115825956619949451947</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-4MfXIVcZdJA/AAAAAAAAAAI/AAAAAAAAAbA/Iv1Gt6j8YgI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5342535388237643243.post-3211513910572793389</id><published>2012-01-20T15:58:00.000+02:00</published><updated>2012-01-20T15:58:14.225+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Разное'/><title type='text'>Рейтинг языков программирования</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;a href="http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html" target="_blank"&gt;По ежегодному рейтингу языков программирования от компании TIOBE&lt;/a&gt; C# поднялся аж на три позиции вверх и занял третье место, догоняя Java,&amp;nbsp; которая так же остается на первом месте (хотя, если взглянуть на график рейтингов за последние 10 лет, то видно, что она медленно, но уверено теряет). Интересно, что годовая дельта для Java оказалась отрицательной (-0.29%), несмотря на популярность ОС Android как платформы для мобильных приложений. На втором месте восседает С. Поднялся рейтинг и у Objectiv-C, что вполне естественно с ростом спроса на рынке&amp;nbsp; разработки под айфоны и айпады. PHP сдал аж на две позиции. Но кто меня действительно удивил - так это Delphi/Object Pascal, который умудрился стать более популярным за последний год. &lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-bBlYLpF8Q1U/Txlx1f14q_I/AAAAAAAAAmQ/N2KOOy0hJgU/s1600/rates.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-bBlYLpF8Q1U/Txlx1f14q_I/AAAAAAAAAmQ/N2KOOy0hJgU/s1600/rates.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5342535388237643243-3211513910572793389?l=sly-and-fluffy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sly-and-fluffy.blogspot.com/feeds/3211513910572793389/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://sly-and-fluffy.blogspot.com/2012/01/blog-post_20.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/3211513910572793389'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/3211513910572793389'/><link rel='alternate' type='text/html' href='http://sly-and-fluffy.blogspot.com/2012/01/blog-post_20.html' title='Рейтинг языков программирования'/><author><name>Tatiana Shemyakina</name><uri>https://profiles.google.com/115825956619949451947</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-4MfXIVcZdJA/AAAAAAAAAAI/AAAAAAAAAbA/Iv1Gt6j8YgI/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-bBlYLpF8Q1U/Txlx1f14q_I/AAAAAAAAAmQ/N2KOOy0hJgU/s72-c/rates.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5342535388237643243.post-3765985280236277366</id><published>2012-01-18T17:31:00.003+02:00</published><updated>2012-01-18T18:10:10.216+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='разработка ПО'/><title type='text'>Размышления о качестве</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Читаю Э.Голдрат "Цель. Процесс непрерывного совершенствования". Долго откладывала эту книгу в сторону, но пришло и её время. Действительно, хорошая книга. Хоть и не it-тематики, но точки соприкосновения есть. Почитать эту книгу полезно всем, не только управленцам. &lt;br /&gt;&lt;br /&gt;&lt;i&gt;Если вы не производите качественный продукт, всё, что вы имеете в итоге - куча дорогостоящих ошибок.&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Это далеко не новость. Но что такое качественный продукт? Первое, что приходит в голову, это программа без ошибок, т.е. тщательно оттестированный функционал, когда пользователь не переживает, что, ткнув не туда, можно завалить программу. Всю качественность функционала может затмить интерфейс, который не позволяет использовать продукт на все 100%. Т.е. интерфейс тоже должен быть качественным, продуманным, позволяя пользователю не тратить много времени на освоение. Это всё? Нет. Бек-сайд продукта - это код. И качественный код != код без багов. Качественный код - это совокупность характеристик, где одно из первых мест занимает качественная архитектура, позволяющая легко и безболезненно развивать продукт. Это тестируемость (testability) кода как подтверждение качества архитектуры. &lt;br /&gt;И, конечно же, качественный продукт в состоянии выпустить только здоровая команда! (Однако обратное выражение не всегда верно) О влиянии отношений внутри команды на продукт была хорошая цитата &lt;a href="http://ru-quotes.blogspot.com/2012/01/blog-post.html" target="_blank"&gt;тут&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Здоровые отношения в группе разработки вносят непосредственный вклад в архитектуру системы. Нездоровые отношения и гипертрофированные самомнения порождают нездоровые продукты&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;Качество продукта всегда коррелируется временем (сроками) и бюджетом (это внешние факторы) и профессионализмом команды (это внутренние факторы), и эти факторы очень тесно связаны. Бюджет прямо пропорционально влияет на профессионализм команды, а если ужать время, то даже профессионалы не смогут выдать качественный продукт. Тут вспоминается Ф.Брукс и его высказывание "9 женщин не родят ребёнка за 1 месяц" ("Мифический человеко-месяц").&amp;nbsp; А за то время, что команда новичков будет набираться опыта, продукт успеет устареть или надобность в нём отпадёт. &lt;br /&gt;И напоследок - зачем вобще нужно это качество? Оно является одной из главных составляющих жизнеспособности - т.е. конкурентоспособности продукта, а значит, и успеха проекта. &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5342535388237643243-3765985280236277366?l=sly-and-fluffy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sly-and-fluffy.blogspot.com/feeds/3765985280236277366/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://sly-and-fluffy.blogspot.com/2012/01/blog-post.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/3765985280236277366'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/3765985280236277366'/><link rel='alternate' type='text/html' href='http://sly-and-fluffy.blogspot.com/2012/01/blog-post.html' title='Размышления о качестве'/><author><name>Tatiana Shemyakina</name><uri>https://profiles.google.com/115825956619949451947</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-4MfXIVcZdJA/AAAAAAAAAAI/AAAAAAAAAbA/Iv1Gt6j8YgI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5342535388237643243.post-7423504974015658390</id><published>2011-12-29T15:36:00.002+02:00</published><updated>2011-12-29T15:36:21.011+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='IE8'/><category scheme='http://www.blogger.com/atom/ns#' term='IE'/><title type='text'>Utilu IE Collection</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Думаю, что эта штука пригодится многим веб-разработчикам, знакомым со словом "кроссбраузерность": &lt;a href="http://utilu.com/IECollection/" target="_blank"&gt;&lt;b&gt;Utilu IE Collection&lt;/b&gt;&lt;/a&gt; - сборник всех поколений адового броузера Internet Explorer от MS. Сборник содержит версии IE:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Internet Explorer 1.0 (4.40.308)&lt;/li&gt;&lt;li&gt;Internet Explorer 1.5 (0.1.0.10)&lt;/li&gt;&lt;li&gt;Internet Explorer 2.01 (2.01.046)&lt;/li&gt;&lt;li&gt;Internet Explorer 3.0 (3.0.1152)&lt;/li&gt;&lt;li&gt;Internet Explorer 3.01 (3.01.2723)&lt;/li&gt;&lt;li&gt;Internet Explorer 3.03 (3.03.2925)&lt;/li&gt;&lt;li&gt;Internet Explorer 4.01 (4.72.3110.0)&lt;/li&gt;&lt;li&gt;Internet Explorer 5.01 (5.00.3314.2100)&lt;/li&gt;&lt;li&gt;Internet Explorer 5.5 (5.51.4807.2300)&lt;/li&gt;&lt;li&gt;Internet Explorer 6.0 (6.00.2800.1106)&lt;/li&gt;&lt;li&gt;Internet Explorer 6.0 (6.00.2900.2180)&lt;/li&gt;&lt;li&gt;Internet Explorer 7.0 (7.00.5730.13)&lt;/li&gt;&lt;li&gt;Internet Explorer 8.0 (8.00.6001.18702) &lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;На сайте сборника есть даже таблица совместимости ОС и версий броузера. &lt;a href="http://fileforum.betanews.com/detail/Internet-Explorer-Collection/1217189605/1" target="_blank"&gt;Ссылка для скачивания.&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5342535388237643243-7423504974015658390?l=sly-and-fluffy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sly-and-fluffy.blogspot.com/feeds/7423504974015658390/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://sly-and-fluffy.blogspot.com/2011/12/utilu-ie-collection.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/7423504974015658390'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/7423504974015658390'/><link rel='alternate' type='text/html' href='http://sly-and-fluffy.blogspot.com/2011/12/utilu-ie-collection.html' title='Utilu IE Collection'/><author><name>Tatiana Shemyakina</name><uri>https://profiles.google.com/115825956619949451947</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-4MfXIVcZdJA/AAAAAAAAAAI/AAAAAAAAAbA/Iv1Gt6j8YgI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5342535388237643243.post-8078236635310469275</id><published>2011-12-26T12:59:00.003+02:00</published><updated>2011-12-26T12:59:36.604+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Разное'/><title type='text'>42</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Недавно довелось написать небольшую утилиту на Delphi. Да, это не опечатка :) Опустим события, ставшие причиной данного извращения, но, кажется, на меня снизошло озарение, ответ на вопрос жизни, Вселенной и вобще: почему не стало delphi-программистов? Так вот, они не выдержали психологической давки со стороны кода! Легко ли программировать, когда на тебя пялится код, всячески выражая своё пренебрежение?&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-YbYnG7lLfzU/TvhO1FNNT_I/AAAAAAAAAl0/DQpvwIZf50A/s1600/delphi1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-YbYnG7lLfzU/TvhO1FNNT_I/AAAAAAAAAl0/DQpvwIZf50A/s1600/delphi1.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5342535388237643243-8078236635310469275?l=sly-and-fluffy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sly-and-fluffy.blogspot.com/feeds/8078236635310469275/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://sly-and-fluffy.blogspot.com/2011/12/42.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/8078236635310469275'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/8078236635310469275'/><link rel='alternate' type='text/html' href='http://sly-and-fluffy.blogspot.com/2011/12/42.html' title='42'/><author><name>Tatiana Shemyakina</name><uri>https://profiles.google.com/115825956619949451947</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-4MfXIVcZdJA/AAAAAAAAAAI/AAAAAAAAAbA/Iv1Gt6j8YgI/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-YbYnG7lLfzU/TvhO1FNNT_I/AAAAAAAAAl0/DQpvwIZf50A/s72-c/delphi1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5342535388237643243.post-8957762568163103283</id><published>2011-12-02T09:29:00.001+02:00</published><updated>2011-12-02T09:51:14.701+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='подкасты для разработчика'/><title type='text'>Подкасты</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Накопилось еще немного ссылок на интересные подкасты.&lt;br /&gt;&lt;a href="http://distributedpodcast.com/"&gt;http://distributedpodcast.com/&lt;/a&gt; - интересный подкаст о CQRS &lt;br /&gt;&lt;a href="http://www.dotband.com/"&gt;http://www.dotband.com&lt;/a&gt; - русскоязычный подкаст о дотнете.&amp;nbsp; &lt;br /&gt;&lt;a href="http://www.thisdeveloperslife.com/"&gt;http://www.thisdeveloperslife.com/&lt;/a&gt; - англоязычный подкаст о разработчиках и их жизни&lt;br /&gt;&lt;a href="http://deepfriedbytes.com/podcast/"&gt;http://deepfriedbytes.com/podcast/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://polymorphicpodcast.com/shows"&gt;http://polymorphicpodcast.com/shows&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5342535388237643243-8957762568163103283?l=sly-and-fluffy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sly-and-fluffy.blogspot.com/feeds/8957762568163103283/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://sly-and-fluffy.blogspot.com/2011/12/blog-post.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/8957762568163103283'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/8957762568163103283'/><link rel='alternate' type='text/html' href='http://sly-and-fluffy.blogspot.com/2011/12/blog-post.html' title='Подкасты'/><author><name>Tatiana Shemyakina</name><uri>https://profiles.google.com/115825956619949451947</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-4MfXIVcZdJA/AAAAAAAAAAI/AAAAAAAAAbA/Iv1Gt6j8YgI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5342535388237643243.post-5969507576286905472</id><published>2011-11-23T15:25:00.001+02:00</published><updated>2011-11-23T15:54:11.572+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='slq'/><category scheme='http://www.blogger.com/atom/ns#' term='ms sql ce'/><title type='text'>Хитрый Delete для Sql Server CE</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Маленький хак для Sql Server CE, который компенсирует отсутствие возможности удаления записей из таблицы с помощью такой конструкции&lt;br /&gt;&lt;code class="prettyprint"&gt;DELETE FROM bookings LEFT OUTER JOIN accounts ON bookings.AccountID = accounts.ID WHERE accounts.AccountNumber="1100"&lt;br /&gt;&lt;/code&gt;Вместо этого вы можете использовать конструкцию&lt;br /&gt;&lt;code class="prettyprint"&gt;DELETE FROM bookings WHERE AccountID NOT IN (SELECT ID FROM accounts WHERE accounts.AccountNumber&amp;lt;&amp;gt;"1100")&lt;br /&gt;&lt;/code&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5342535388237643243-5969507576286905472?l=sly-and-fluffy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sly-and-fluffy.blogspot.com/feeds/5969507576286905472/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://sly-and-fluffy.blogspot.com/2011/11/delete-sql-server-ce.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/5969507576286905472'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/5969507576286905472'/><link rel='alternate' type='text/html' href='http://sly-and-fluffy.blogspot.com/2011/11/delete-sql-server-ce.html' title='Хитрый Delete для Sql Server CE'/><author><name>Tatiana Shemyakina</name><uri>https://profiles.google.com/115825956619949451947</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-4MfXIVcZdJA/AAAAAAAAAAI/AAAAAAAAAbA/Iv1Gt6j8YgI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5342535388237643243.post-7831828600871816333</id><published>2011-11-16T14:48:00.001+02:00</published><updated>2011-11-16T16:03:17.464+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.net'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>Webbrowser. Сохраняем картинку.</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-mMwtQ_tN7jQ/TsO91ji-KoI/AAAAAAAAAkQ/KtdCnSw9ulg/s1600/save_img_from_webbrowser2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;/a&gt;&lt;/div&gt;Задача: сохранить из webbrowser генерируемую на лету (на основе данных post-запроса) картинку.&lt;br /&gt;Решение:&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-qyL7RUkR-Qc/TsOxTY7UeUI/AAAAAAAAAkA/G0CJmhaFRus/s1600/save_img_from_webbrowser.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="259" src="http://1.bp.blogspot.com/-qyL7RUkR-Qc/TsOxTY7UeUI/AAAAAAAAAkA/G0CJmhaFRus/s640/save_img_from_webbrowser.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Пошагово:&lt;br /&gt;Сначала получаем картинку по её id. Потом получаем Dom-объект страницы и через него создаем HTMLControlRange-объект, который позволит нам выполнять операции над коллекцией объектов, которую он содержит. Объекты добавляются через метод add(), но нам гораздо более интересен метод execCommand(), который выполняет команды на текущем документе (в нашем варианте - объект doc), на выделенной области или на коллекции объектов. В нашем случае, команда будет выполнятся на коллекции объектов IHTMLControlElement, состоящей из одного объекта image. &lt;br /&gt;После копирования нужной картинки в буффер обмена (строка execCommand("Copy", false, null)), извлекаем картинку из буффера и сохраняем на диск. Всё.&lt;br /&gt;Если нужно сохранить все картинки на странице, а не одну, то коллекцию картинок получаем через&lt;br /&gt;HTMLElementCollection imgCollection = web.Document.GetElementsByTagName("img");&lt;br /&gt;и в цикле выполняем код после создания HTMLControlRange-объекта:&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/-mMwtQ_tN7jQ/TsO91ji-KoI/AAAAAAAAAkQ/KtdCnSw9ulg/s1600/save_img_from_webbrowser2.png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="288" src="http://3.bp.blogspot.com/-mMwtQ_tN7jQ/TsO91ji-KoI/AAAAAAAAAkQ/KtdCnSw9ulg/s640/save_img_from_webbrowser2.png" width="640" /&gt;&lt;/a&gt;Как видите, всё просто. Главное - не забыть подключить сборку Microsoft.mshtml.dll (в Solution Explorer правой кнопкой по узлу References в нужном проекте -&amp;gt; Add reference):&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-DbtnODLfE7s/TsOzTUrOSbI/AAAAAAAAAkI/D-QHCzRNe4o/s1600/save_img_from_webbrowser0.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-DbtnODLfE7s/TsOzTUrOSbI/AAAAAAAAAkI/D-QHCzRNe4o/s1600/save_img_from_webbrowser0.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5342535388237643243-7831828600871816333?l=sly-and-fluffy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sly-and-fluffy.blogspot.com/feeds/7831828600871816333/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://sly-and-fluffy.blogspot.com/2011/11/webbrowser.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/7831828600871816333'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/7831828600871816333'/><link rel='alternate' type='text/html' href='http://sly-and-fluffy.blogspot.com/2011/11/webbrowser.html' title='Webbrowser. Сохраняем картинку.'/><author><name>Tatiana Shemyakina</name><uri>https://profiles.google.com/115825956619949451947</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-4MfXIVcZdJA/AAAAAAAAAAI/AAAAAAAAAbA/Iv1Gt6j8YgI/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-qyL7RUkR-Qc/TsOxTY7UeUI/AAAAAAAAAkA/G0CJmhaFRus/s72-c/save_img_from_webbrowser.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5342535388237643243.post-5049397599785941448</id><published>2011-10-23T19:48:00.002+03:00</published><updated>2011-10-23T19:48:47.407+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>Extensions, Static methods &amp; null</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;span class="sentence" id="xn1_606b4a04805eac4625dc15a564accaaf"&gt;Методы расширения (extension methods), появившиеся ещё в &lt;/span&gt;C# 3.0,&amp;nbsp;&lt;span class="sentence" id="xn1_606b4a04805eac4625dc15a564accaaf"&gt; - очень полезная штука. &lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span class="sentence" id="xn1_606b4a04805eac4625dc15a564accaaf"&gt;Методы расширения позволяют "добавлять" методы в существующие типы без создания нового производного типа, перекомпиляции или иного изменения исходного типа.&lt;/span&gt;  &lt;span class="sentence" id="xn2_3bc07ca7b680180ca6881c1ff4d7e61b"&gt;Методы расширения являются особым видом статического метода, но они вызываются, как если бы они были методами экземпляра в расширенном типе. &lt;/span&gt;&lt;span class="sentence" id="xn1_606b4a04805eac4625dc15a564accaaf"&gt;(&lt;a href="http://msdn.microsoft.com/ru-ru/library/bb383977.aspx"&gt;из MSDN&lt;/a&gt;)&lt;/span&gt;&lt;/blockquote&gt;Т.е. если в классе String нам не хватает какого-нибудь метода, то не нужно создавать еще один класс, наследуясь от String или, чего хуже, делая декоратор, а можно создать метод расширения:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;static&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; MyExtensions&lt;br /&gt;{&lt;br /&gt;        &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;static&lt;/span&gt; &lt;span style="color: blue;"&gt;int&lt;/span&gt; WordCount(&lt;span style="color: blue;"&gt;this&lt;/span&gt; String str)&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: blue;"&gt;return&lt;/span&gt; str.Split(&lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: blue;"&gt;char&lt;/span&gt;[] { &lt;span style="color: #a31515;"&gt;' '&lt;/span&gt;, &lt;span style="color: #a31515;"&gt;'.'&lt;/span&gt;, &lt;span style="color: #a31515;"&gt;'?'&lt;/span&gt; }, &lt;br /&gt;                             StringSplitOptions.RemoveEmptyEntries).Length;&lt;br /&gt;        }&lt;br /&gt; }   &lt;/pre&gt;(&lt;a href="http://msdn.microsoft.com/ru-ru/library/bb383977.aspx"&gt;пример тоже из MSDN&lt;/a&gt;)&lt;br /&gt;Иногда бывает ситуация, когда нужно вызвать метод расширения в статическом методе класса. Но этого нельзя сделать, несмотря на то, что&lt;br /&gt;&lt;blockquote&gt;&lt;span class="sentence" id="xn2_3bc07ca7b680180ca6881c1ff4d7e61b"&gt;Методы расширения являются особым видом статического метода, но они вызываются, как если бы они были методами экземпляра в расширенном типе. &lt;/span&gt;&lt;span class="sentence" id="xn1_606b4a04805eac4625dc15a564accaaf"&gt;(&lt;a href="http://msdn.microsoft.com/ru-ru/library/bb383977.aspx"&gt;из MSDN&lt;/a&gt;)&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;Но, если всё же очень надо, то есть пара приёмчиков :) &lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;Например, у нас есть класс Document, и в статическом методе Open нам очень хотелось бы вызвать метод расширения Spell().&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-Log5zdSAQEQ/TqK6lX9iRzI/AAAAAAAAAhU/sHVsyCU0zw0/s1600/code2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-Log5zdSAQEQ/TqK6lX9iRzI/AAAAAAAAAhU/sHVsyCU0zw0/s1600/code2.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Как можно вызвать Spell()? Для начала можно создать новый документ и вызвать у него метод расширения, но это не спортивно, тем более проще будет вызвать метод ChangeText().&lt;br /&gt;var text = default(IDocument).Spell(data);&lt;br /&gt;что, в принципе, эквивалентно, следующему:&lt;br /&gt;var text = (null as IDocument).Spell(data);&lt;br /&gt;Что тут происходит? &lt;a href="http://msdn.microsoft.com/en-us/library/25tdedf5%28v=vs.80%29.aspx"&gt;default&lt;/a&gt; для ссылочных типов данных - это null, а для value-типов - 0. Т.е. мы вызываем метод Spell() не на объекте, а на null? Почему же не случается Null Reference Exception? Чтобы понять, нужно просто взглянуть на реализацию метода расширения:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-ceg2xvaAU5s/TqRBgL1CWUI/AAAAAAAAAhc/FSaYrIo7sVA/s1600/code3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-ceg2xvaAU5s/TqRBgL1CWUI/AAAAAAAAAhc/FSaYrIo7sVA/s1600/code3.png" /&gt;&lt;/a&gt;&lt;/div&gt;Объект document, на котором вызывается метод расширения, будет равен null, и пока мы не попытаемся использовать его без проверки на null, ничего страшного, не произойдёт. &lt;br /&gt;Кстати, используя эту фичу, можно написать расширение для проверки объекта на null, чтобы заменить if (obj == null) ....&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-78n6VbmVH7Q/TqREZSD2xZI/AAAAAAAAAhk/dfNdalQmcyU/s1600/code4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-78n6VbmVH7Q/TqREZSD2xZI/AAAAAAAAAhk/dfNdalQmcyU/s1600/code4.png" /&gt;&lt;/a&gt;&lt;/div&gt;Пример использования:&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-rhAgNMdf4QA/TqREt5SAX6I/AAAAAAAAAhs/_eQPGLi4kR4/s1600/code5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-rhAgNMdf4QA/TqREt5SAX6I/AAAAAAAAAhs/_eQPGLi4kR4/s1600/code5.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5342535388237643243-5049397599785941448?l=sly-and-fluffy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sly-and-fluffy.blogspot.com/feeds/5049397599785941448/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://sly-and-fluffy.blogspot.com/2011/10/extensions-static-methods-null.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/5049397599785941448'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/5049397599785941448'/><link rel='alternate' type='text/html' href='http://sly-and-fluffy.blogspot.com/2011/10/extensions-static-methods-null.html' title='Extensions, Static methods &amp; null'/><author><name>Tatiana Shemyakina</name><uri>https://profiles.google.com/115825956619949451947</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-4MfXIVcZdJA/AAAAAAAAAAI/AAAAAAAAAbA/Iv1Gt6j8YgI/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-Log5zdSAQEQ/TqK6lX9iRzI/AAAAAAAAAhU/sHVsyCU0zw0/s72-c/code2.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5342535388237643243.post-3685929249667787259</id><published>2011-10-21T18:25:00.001+03:00</published><updated>2012-01-30T11:10:30.254+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tdd'/><category scheme='http://www.blogger.com/atom/ns#' term='юмор'/><category scheme='http://www.blogger.com/atom/ns#' term='Разное'/><title type='text'>Assert.True()</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://geekandpoke.typepad.com/.a/6a00d8341d3df553ef0153925eca87970b-800wi" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="640" src="http://geekandpoke.typepad.com/.a/6a00d8341d3df553ef0153925eca87970b-800wi" width="452" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;a href="http://www.blogger.com/goog_105166383"&gt;&lt;br /&gt;&lt;/a&gt;&lt;/div&gt;&lt;a href="http://geekandpoke.typepad.com/geekandpoke/2011/10/ddt.html"&gt;Отсюда&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5342535388237643243-3685929249667787259?l=sly-and-fluffy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sly-and-fluffy.blogspot.com/feeds/3685929249667787259/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://sly-and-fluffy.blogspot.com/2011/10/asserttrue.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/3685929249667787259'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/3685929249667787259'/><link rel='alternate' type='text/html' href='http://sly-and-fluffy.blogspot.com/2011/10/asserttrue.html' title='Assert.True()'/><author><name>Tatiana Shemyakina</name><uri>https://profiles.google.com/115825956619949451947</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-4MfXIVcZdJA/AAAAAAAAAAI/AAAAAAAAAbA/Iv1Gt6j8YgI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5342535388237643243.post-3897310249277221505</id><published>2011-10-20T13:32:00.000+03:00</published><updated>2011-10-20T13:51:15.634+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='рефакторинг'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>Рефакторинг</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Сегодня наткнулась на такой вот метод:&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;a href="http://3.bp.blogspot.com/-UMdFouc2xg4/Tp_tX9CgYxI/AAAAAAAAAeg/XXpHqAB8j6g/s1600/code1.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-UMdFouc2xg4/Tp_tX9CgYxI/AAAAAAAAAeg/XXpHqAB8j6g/s1600/code1.png" /&gt;&amp;nbsp;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;/div&gt;&lt;a name='more'&gt;&lt;/a&gt;Конечно, сразу заинтересовало, что делает VouchersSrv.GetCustomerAdressID():&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-SBDQ6a9JWNg/Tp_t8AQh6bI/AAAAAAAAAeo/2pKDt32Eg7g/s1600/code2.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-SBDQ6a9JWNg/Tp_t8AQh6bI/AAAAAAAAAeo/2pKDt32Eg7g/s1600/code2.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Что же это получается? В цикле создается DataContext и делается чтение из таблицы _vouchers? Расточительно как минимум. Надо что-то с этим делать.&amp;nbsp;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Во-первых, метод GetCustomerAdressID() будто бы прилеплен сбоку. Надо перенести его в другой класс. Сначала нужно посмотреть, где ещё используется это метод ( &lt;b&gt;Shift-F12&lt;/b&gt; в VisualStudio). Отлично, в одном месте. Теперь, чтобы не создавать датаконтекст каждый раз, нужно метод сделать обычным, а не статичным, и вынести DataContext как закрытый член класса. Получилось вот так:&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-q4jl4OJjYe0/Tp_8qoTVWGI/AAAAAAAAAfg/DhO9yY8Y7KY/s1600/code3.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-q4jl4OJjYe0/Tp_8qoTVWGI/AAAAAAAAAfg/DhO9yY8Y7KY/s1600/code3.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;a href="http://3.bp.blogspot.com/-uaV-6uZAn1A/Tp_0qqQr-qI/AAAAAAAAAew/z5xz4OLsiHM/s1600/code3.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;/a&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Очевидна маленькая проблема - контекст создали, а где мы его уничтожим? Конечно, GC подчистит, но на случай форс-мажора лучше реализовать IDisposable:&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-VEWIzWKYsaY/Tp_8OiTJnHI/AAAAAAAAAfY/ZmT5CXnMYiY/s1600/code4.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-VEWIzWKYsaY/Tp_8OiTJnHI/AAAAAAAAAfY/ZmT5CXnMYiY/s1600/code4.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Ну и вот, что получилось в вызывающем методе:&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-R-cbVx5ZONo/Tp_7w_W0MCI/AAAAAAAAAfQ/3BNbnO82WC0/s1600/code5.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-R-cbVx5ZONo/Tp_7w_W0MCI/AAAAAAAAAfQ/3BNbnO82WC0/s1600/code5.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5342535388237643243-3897310249277221505?l=sly-and-fluffy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sly-and-fluffy.blogspot.com/feeds/3897310249277221505/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://sly-and-fluffy.blogspot.com/2011/10/blog-post_20.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/3897310249277221505'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/3897310249277221505'/><link rel='alternate' type='text/html' href='http://sly-and-fluffy.blogspot.com/2011/10/blog-post_20.html' title='Рефакторинг'/><author><name>Tatiana Shemyakina</name><uri>https://profiles.google.com/115825956619949451947</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-4MfXIVcZdJA/AAAAAAAAAAI/AAAAAAAAAbA/Iv1Gt6j8YgI/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-UMdFouc2xg4/Tp_tX9CgYxI/AAAAAAAAAeg/XXpHqAB8j6g/s72-c/code1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5342535388237643243.post-4403427958977395987</id><published>2011-10-18T12:36:00.000+03:00</published><updated>2011-10-18T13:10:46.469+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='unit testing'/><category scheme='http://www.blogger.com/atom/ns#' term='.net'/><category scheme='http://www.blogger.com/atom/ns#' term='tdd'/><category scheme='http://www.blogger.com/atom/ns#' term='testing'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='moq'/><title type='text'>Ещё чуть-чуть о тестах</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-zo_ZfliDLxo/Tp0jtvKN33I/AAAAAAAAAeQ/ZBTln3dMGwg/s1600/testing.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://1.bp.blogspot.com/-zo_ZfliDLxo/Tp0jtvKN33I/AAAAAAAAAeQ/ZBTln3dMGwg/s320/testing.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;И еще одна небольшая заметка о TDD, точнее о том, что такое тест в контексте TDD.&lt;br /&gt;Начинающие тэдэдэшники часто переусердствуют, стараясь тестировать всё и вся, забывая, что тест в TDD - это небольшой метод, проверяющий конкретное &lt;b&gt;бизнес-правило&lt;/b&gt;. Акцент тут следует сделать на бизнес-правилах, они специфицируют поведение приложения, именно их нужно тестировать. С помощью TDD мы разрабатываем &lt;b&gt;бизнес-логику&lt;/b&gt;. Не следует тестировать работу с БД, с файловой системой, сетевое взаимодействие - это уже совсем другой вид тестирования. Это интеграционные тесты. TDD позволяет нам быстро разрабатывать бизнес-логику, подтверждая работоспособность (или наоборот) кода мгновенным фидбеком. Если приходится специально что-то настраивать, чтобы запустить тест, и настройка занимает больше времени, чем написание самого теста, следует насторожиться. Метод для теста должен быть черным ящиком: известно только, что на входе, нужно удостовериться в правильности того, что на выходе. &lt;br /&gt;В реальной жизни часто бывает так, что нужно взять выборку из БД и подсунуть данные методу для выполнения сложных расчетов. Для тестирования таких методов придумали Mocks, Fackes, Dummies &amp;amp; Stubs. Все эти технологии позволяют абстрагироваться от уровня физического взаимодействия, генерируя методы-заглушки. А методы заглушки возвращают тот набор данных, который им подсовываем. Чтобы было понятнее, вот простенький пример с Mock-библиотекой &lt;a href="http://code.google.com/p/moq/"&gt;Moq&lt;/a&gt;. &lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;Например, нам нужно взять из БД данные о продажах и посчитать средние значения по дням и неделям. Как мы будем это делать?&lt;br /&gt;&lt;code class="prettyprint"&gt;[Fact]&lt;br /&gt;public static shouldCalculateAvarageStatistic()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var datasource = new Moq&amp;lt;IDataSource&amp;gt;();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;datasource.Setup(source=&amp;gt;source.GetMonthSales(&lt;/code&gt;&lt;br /&gt;&lt;code class="prettyprint"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; new&amp;nbsp;&amp;nbsp; Month(Monther.October)).Returns(&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;new List&amp;lt;Product&amp;gt;(){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; new Product(){Price=12.50},&amp;nbsp;&lt;/code&gt;&lt;br /&gt;&lt;code class="prettyprint"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; new Product(){Price=12.50},&amp;nbsp;&lt;/code&gt;&lt;br /&gt;&lt;code class="prettyprint"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; new Product(){Price=25.0},&amp;nbsp;&lt;/code&gt;&lt;br /&gt;&lt;code class="prettyprint"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; new Product(){Price=74}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; });&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; var counter = new Counter(datasource);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var stats = counter.GetAvarageStats(new Month(Monther.October));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Assert.Equal( 31.0, stats.ProfitPerWeek);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Assert.Equal( 4.0, stats.ProfitPerDay);&lt;br /&gt;}&lt;/code&gt;&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;&lt;/code&gt;Класс, который получился в итоге:&lt;br /&gt;&lt;br /&gt;&lt;code class="prettyprint"&gt;class Counter&lt;/code&gt;&lt;br /&gt;&lt;code class="prettyprint"&gt; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;IDataSource datasource; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public Counter(IDataSource _datasource)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; datasource = _datasource;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;public IStatistic GetAvarageStats(Month month)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var data = datasource.GetMonthSales(month); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var avarage_per_day = data.Sum(product=&amp;gt;product.Price) / month.Days;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var avarage_per_week = data.Sum(product=&amp;gt;product.Price) / month.Weeks;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return new AvarageStatistics(avarage_per_week, avarage_per_day);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5342535388237643243-4403427958977395987?l=sly-and-fluffy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sly-and-fluffy.blogspot.com/feeds/4403427958977395987/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://sly-and-fluffy.blogspot.com/2011/10/blog-post.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/4403427958977395987'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/4403427958977395987'/><link rel='alternate' type='text/html' href='http://sly-and-fluffy.blogspot.com/2011/10/blog-post.html' title='Ещё чуть-чуть о тестах'/><author><name>Tatiana Shemyakina</name><uri>https://profiles.google.com/115825956619949451947</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-4MfXIVcZdJA/AAAAAAAAAAI/AAAAAAAAAbA/Iv1Gt6j8YgI/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-zo_ZfliDLxo/Tp0jtvKN33I/AAAAAAAAAeQ/ZBTln3dMGwg/s72-c/testing.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5342535388237643243.post-1740553459070239393</id><published>2011-10-16T19:16:00.000+03:00</published><updated>2011-10-16T19:16:48.771+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='slq'/><category scheme='http://www.blogger.com/atom/ns#' term='.net'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='ORM'/><title type='text'>to ORM or not to ORM?</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Плюсы и минусы ORM обсуждались не раз. Скорость vs удобство (отсутствие чистого SQL в коде), возможность тонкой настройки запросов для узких мест vs машинная генерация запросов (порой не оптимизированных)... Да и вобще, кому нужны эти лишние прослойки?&lt;br /&gt;Почему стоит отказаться от ORM рассказывает&amp;nbsp;Rob Conery в своём докладе "Kill Your ORM" на &lt;a href="http://www.ndc2011.no/"&gt;NDC 2011&lt;/a&gt; , где, кстати, было очень много интересных докладов.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;iframe frameborder="0" height="360" src="http://vkontakte.ru/video_ext.php?oid=-4925191&amp;amp;id=161158062&amp;amp;hash=8adea37a88fd5a16&amp;amp;sd" width="607"&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5342535388237643243-1740553459070239393?l=sly-and-fluffy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sly-and-fluffy.blogspot.com/feeds/1740553459070239393/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://sly-and-fluffy.blogspot.com/2011/10/to-orm-or-not-to-orm.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/1740553459070239393'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/1740553459070239393'/><link rel='alternate' type='text/html' href='http://sly-and-fluffy.blogspot.com/2011/10/to-orm-or-not-to-orm.html' title='to ORM or not to ORM?'/><author><name>Tatiana Shemyakina</name><uri>https://profiles.google.com/115825956619949451947</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-4MfXIVcZdJA/AAAAAAAAAAI/AAAAAAAAAbA/Iv1Gt6j8YgI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5342535388237643243.post-8185133452977287714</id><published>2011-10-11T11:11:00.000+03:00</published><updated>2011-10-11T11:11:14.358+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='DDD'/><category scheme='http://www.blogger.com/atom/ns#' term='разработка ПО'/><title type='text'>Максим Цепков. Domain Driven Design - модель вместо требований</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Выступление Максима Цепкова на Летнем Аналитическом Фестивале - 2011. Иваново, 25 июня 2011 года.&lt;br /&gt;&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;iframe allowfullscreen="" frameborder="0" height="360" src="http://player.vimeo.com/video/26547334?portrait=0&amp;amp;color=ff9933" webkitallowfullscreen="" width="480"&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5342535388237643243-8185133452977287714?l=sly-and-fluffy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sly-and-fluffy.blogspot.com/feeds/8185133452977287714/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://sly-and-fluffy.blogspot.com/2011/10/domain-driven-design.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/8185133452977287714'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/8185133452977287714'/><link rel='alternate' type='text/html' href='http://sly-and-fluffy.blogspot.com/2011/10/domain-driven-design.html' title='Максим Цепков. Domain Driven Design - модель вместо требований'/><author><name>Tatiana Shemyakina</name><uri>https://profiles.google.com/115825956619949451947</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-4MfXIVcZdJA/AAAAAAAAAAI/AAAAAAAAAbA/Iv1Gt6j8YgI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5342535388237643243.post-5508061477630232143</id><published>2011-10-08T15:44:00.000+03:00</published><updated>2011-10-08T15:44:09.164+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tdd'/><category scheme='http://www.blogger.com/atom/ns#' term='переводы'/><title type='text'>Запахи TDD</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-QuV5FbP0wZE/TpADQtav0mI/AAAAAAAAAdk/PWSocuJ5cWg/s1600/tddProcessSmells.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-QuV5FbP0wZE/TpADQtav0mI/AAAAAAAAAdk/PWSocuJ5cWg/s1600/tddProcessSmells.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;Перевод статьи "&lt;a href="http://agileinaflash.blogspot.com/2009/03/tdd-process-smells.html"&gt;TDD Process Smells&lt;/a&gt; "&lt;br /&gt;&lt;br /&gt;Данный список запаховболее сфокусирован на выполнении принципов самого  TDD процесса, чем на&amp;nbsp; содержимом тестов. Без сомнения, существует множество подобных запахов; я же выбрал наиболее часто встречающиеся по правилу 7 (+/- 2).&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;&lt;b&gt;Покрытие кода тестами как цель&lt;/b&gt;. Если вы придерживаетесь принципов TDD, то должны получать практически 100% покрытие нового кода тестами даже без использования специальных инструментов для проверки. Существующий код - это другая история. Как получаются системы с низким процентом покрытия тестами? Если начать гнаться за покрытием кода тестами, можно только ухудшить ситуацию: увеличение числа тестов за счет их качества; тесты падают при внесение изменений в систему; часть тестов остаётся поломанными, сводя к нулю смысл самого тестирования.&amp;nbsp;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Отсутствие зелёной полосы в течении &lt;/b&gt;&lt;b&gt;~10 минут. &lt;/b&gt;Размер теста - это одно из наиболее общих заблуждений в TDD. Цель теста - двигаясь маленькими шагами вперёд получать мгновенный фидбэк. Если в среднем цикл разработки теста занимает больше 10 минут, то вы не совсем понимаете, что значит итеративное наращивание функционала. Если вы пишите тест уже 10 минут, остановитесь, вернитесь к последней зеленой полоске и начните двигаться вперёд более мелкими шагами.&amp;nbsp;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Создание сразу рабочих тестов.&lt;/b&gt; В TDD отрицательный фидбек означает, что ваши предположения верны. Написать рабочий тест - лучший способ потратить время зря. Много раз я сталкивался с тем, что разработчик сразу писал рабочий тест, но его код оставался полон багов.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Недостаточный рефакторинг.&lt;/b&gt; Если вы тратите пять минут на написание продакшн-кода, то вы должны потратить еще несколько минут на рефакторинг. Даже если кажется, что всё идеально, посмотрите вокруг - воспользуйтесь шансом отрефакторить код. &lt;/li&gt;&lt;li&gt;&lt;b&gt;Пропуск чего-то слишком лёгкого (или сложного) для тестирования.&lt;/b&gt; "Это обычный геттер, ничего страшного" или "Это ну очень сложный алгорит, понятия не имею, как его тестировать, лучше пропустить этот кусок." Простота часто скрывает под собой проблемы: может, это не такой уж и обычный геттер, а ошибка в реализации ленивой инициализации? В сложных участках кода чаще всего и находятся проблемы. Какой смысл тестировать только те вещи, которые легко тестируются? Внесение изменений наиболее дорого обходится в сложных участках системы, тесты же нужны для того, чтобы сделать разрабатываемую систему стабильной и уменьшить затраты на сопровождение.&amp;nbsp;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Тестирование методов, а не поведения.&lt;/b&gt; Это распространённая проблема начинающих тэдэдэшников. Они пишут тест testForSomeMethod, внутри которого создают контекст и что-то ассертят. Позже они добавляют в этот же тест вызов &lt;code&gt;someMethod() &lt;/code&gt; с разными входными данными и добавят в комментарий новые детали. Кроме того, что это может привести к ненужным зависимостям, такой подход усложняет понимание смысла теста и дальнейшее сопровождение.&amp;nbsp;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Написание тестов после кода!&lt;/b&gt; По определению, это уже не TDD. Но начинающие тэдэдэшники по старой привычке часто пишут код без написания неработающего теста. Почитайте "&lt;a href="http://agileinaflash.blogspot.com/2009/02/why-pout-aka-tad-sucks.html"&gt;Why TAD Sucks&lt;/a&gt;" (TAD = Test-After Development) , чтобы найти для себя несколько причин начинать с написания неработающего теста. &lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5342535388237643243-5508061477630232143?l=sly-and-fluffy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sly-and-fluffy.blogspot.com/feeds/5508061477630232143/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://sly-and-fluffy.blogspot.com/2011/10/tdd.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/5508061477630232143'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/5508061477630232143'/><link rel='alternate' type='text/html' href='http://sly-and-fluffy.blogspot.com/2011/10/tdd.html' title='Запахи TDD'/><author><name>Tatiana Shemyakina</name><uri>https://profiles.google.com/115825956619949451947</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-4MfXIVcZdJA/AAAAAAAAAAI/AAAAAAAAAbA/Iv1Gt6j8YgI/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-QuV5FbP0wZE/TpADQtav0mI/AAAAAAAAAdk/PWSocuJ5cWg/s72-c/tddProcessSmells.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5342535388237643243.post-1347457081009653053</id><published>2011-10-07T14:40:00.001+03:00</published><updated>2011-10-07T16:25:55.551+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.net'/><category scheme='http://www.blogger.com/atom/ns#' term='linq'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>Linq DataContext и Dispose</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Как известно, любой DataContext объект является IDisposable. При использовании конструкции вида&lt;br /&gt;&lt;code class="prettyprint"&gt;using (CDataContext db = new CDataContext(ConnectionPool.Connection))            {...}&lt;/code&gt;&lt;br /&gt;метод&amp;nbsp; Dispose() вызывается автоматически, и все занимаемые ресурсы освобождаются.&lt;br /&gt;Насколько критично вызывать метод Dispose() вручную для такого кода?&lt;br /&gt;&lt;code class="prettyprint"&gt;CDataContext db = new CDataContext(ConnectionPool.Connection);&lt;br /&gt;&amp;nbsp;return (from tbl in db._addresses&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; where tbl.IsCustomer.Equals(true)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; select tbl).ToList();&lt;/code&gt;&lt;br /&gt;Перефразируя вопрос: что плохого случится, если не вызвать&amp;nbsp; Dispose()? Ведь GC всё равно вызовет этот метод, разве что не сразу. DataContext не держит соединение c БД открытым (только, если не открывать его явным способом вроде &lt;span id="comment-6a00e54fc3203e88340120a8b4ceb6970b-content"&gt;DataContext.Connection.Open() ) т.е. никаких тяжеловесных ресурсов не занимает, и ничего плохого не происходит. Т.е. совсем не обязательно вручную вызывать &lt;/span&gt;Dispose().&lt;br /&gt;Но. Если вы напишите такой код&lt;br /&gt;&lt;code class="prettyprint"&gt;using(CDataContext db = new CDataContext(ConnectionPool.Connection))&lt;/code&gt;&lt;br /&gt;&lt;code class="prettyprint"&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;return (from tbl in db._addresses&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; where tbl.IsCustomer.Equals(true)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; select tbl);&lt;/code&gt;&lt;br /&gt;&lt;code class="prettyprint"&gt;} &lt;/code&gt;&lt;br /&gt;произойдёт исключение "Cannot access a disposed object. Object name: 'DataContext accessed after Dispose.", потому что дерево запроса (возвращаемый тип&amp;nbsp; IQueryable&amp;lt;_address&amp;gt;) попытается выполнится после того, как DataContext будет уничтожен. Произойдёт это потому, что запрос выполнится тогда, когда будет впервые вызвано перечисление элементов (метод ToList&amp;lt;T&amp;gt;(), например). Если же написать такой код &lt;br /&gt;&lt;code class="prettyprint"&gt;CDataContext db = new CDataContext(ConnectionPool.Connection)&lt;br /&gt;&amp;nbsp;return (from tbl in db._addresses&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; where tbl.IsCustomer.Equals(true)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; select tbl);&lt;/code&gt;&lt;br /&gt;то нужно понимать, что DataContext откроет соединение к базе, извлечет элементы и будет уничтожен только в том месте кода, где произойдет IQueryable&amp;lt;_address&amp;gt;.ToIEnumerable&amp;lt;_address&amp;gt;()&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5342535388237643243-1347457081009653053?l=sly-and-fluffy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sly-and-fluffy.blogspot.com/feeds/1347457081009653053/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://sly-and-fluffy.blogspot.com/2011/10/linq-datacontext-dispose.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/1347457081009653053'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/1347457081009653053'/><link rel='alternate' type='text/html' href='http://sly-and-fluffy.blogspot.com/2011/10/linq-datacontext-dispose.html' title='Linq DataContext и Dispose'/><author><name>Tatiana Shemyakina</name><uri>https://profiles.google.com/115825956619949451947</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-4MfXIVcZdJA/AAAAAAAAAAI/AAAAAAAAAbA/Iv1Gt6j8YgI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5342535388237643243.post-5641760922917299896</id><published>2011-10-04T10:42:00.000+03:00</published><updated>2011-10-04T10:50:18.618+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ms sql ce'/><title type='text'>Чего нет в  SQL Server Compact 4.0</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;А нет в 4-ом компакте целой кучи всего:&lt;br /&gt;&lt;ol style="text-align: left;"&gt;&lt;li&gt;Репликация данных с SQL Server - ни через Sync Framework, ни через слияние или удаленный доступ к данным.&amp;nbsp;&lt;/li&gt;&lt;li&gt;Нет поддержки службы SQL Server 2008 Integration Services (SSIS)&lt;/li&gt;&lt;li&gt;SQL Server Management Studio для Sql Server Compact 4 тоже не поддерживается&lt;/li&gt;&lt;li&gt; О мобильных платформах (Windows Mobile, Windows Phone или Windows CE) тоже можно забыть.&amp;nbsp;&lt;/li&gt;&lt;li&gt;Не поддерживается LINQ to SQL (чего стоило, но не хотелось, ожидать). Все дружно переходим на Entity Framework. &lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;Но всё это поддерживается в SQL Server Compact 3.5 SP2.&lt;br /&gt;Т.е. для того, чтобы перевести существующий проект (SQL CE 3.5 + Linq2Sql) на использование Sql Server CE 4.0, нужно заодно&amp;nbsp; переехать на Entity Framwork либо другую ORM-прослойку. Стоит ли оно того, вот в чем вопрос. &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5342535388237643243-5641760922917299896?l=sly-and-fluffy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sly-and-fluffy.blogspot.com/feeds/5641760922917299896/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://sly-and-fluffy.blogspot.com/2011/10/sql-server-compact-40.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/5641760922917299896'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/5641760922917299896'/><link rel='alternate' type='text/html' href='http://sly-and-fluffy.blogspot.com/2011/10/sql-server-compact-40.html' title='Чего нет в  SQL Server Compact 4.0'/><author><name>Tatiana Shemyakina</name><uri>https://profiles.google.com/115825956619949451947</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-4MfXIVcZdJA/AAAAAAAAAAI/AAAAAAAAAbA/Iv1Gt6j8YgI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5342535388237643243.post-5977814269874074892</id><published>2011-09-30T18:30:00.001+03:00</published><updated>2012-01-30T11:10:55.082+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='юмор'/><category scheme='http://www.blogger.com/atom/ns#' term='Разное'/><title type='text'>Выучить С++ за 21 день</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://habrahabr.ru/blogs/humour/87737/"&gt;Выучить С++ за 21 день&lt;/a&gt;&lt;a href="http://1.bp.blogspot.com/-ssy9dXOEpLU/ToXgaQbnLlI/AAAAAAAAAdg/BFfgeMxcw70/s1600/559d74831571891cd6409218a8d9.jpeg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="547" src="http://1.bp.blogspot.com/-ssy9dXOEpLU/ToXgaQbnLlI/AAAAAAAAAdg/BFfgeMxcw70/s640/559d74831571891cd6409218a8d9.jpeg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5342535388237643243-5977814269874074892?l=sly-and-fluffy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sly-and-fluffy.blogspot.com/feeds/5977814269874074892/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://sly-and-fluffy.blogspot.com/2011/09/21.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/5977814269874074892'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/5977814269874074892'/><link rel='alternate' type='text/html' href='http://sly-and-fluffy.blogspot.com/2011/09/21.html' title='Выучить С++ за 21 день'/><author><name>Tatiana Shemyakina</name><uri>https://profiles.google.com/115825956619949451947</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-4MfXIVcZdJA/AAAAAAAAAAI/AAAAAAAAAbA/Iv1Gt6j8YgI/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-ssy9dXOEpLU/ToXgaQbnLlI/AAAAAAAAAdg/BFfgeMxcw70/s72-c/559d74831571891cd6409218a8d9.jpeg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5342535388237643243.post-2317535805362948368</id><published>2011-09-30T12:26:00.000+03:00</published><updated>2011-09-30T12:26:26.329+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='разработка ПО'/><title type='text'>8 советов</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-B1sF8jQi5Tw/ToWLHYjAWrI/AAAAAAAAAdc/zzQzCwKMHOk/s1600/images.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="http://4.bp.blogspot.com/-B1sF8jQi5Tw/ToWLHYjAWrI/AAAAAAAAAdc/zzQzCwKMHOk/s200/images.jpg" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;Сегодня попались мне две статьи о том, как улучшить свой код. В сумме это дало 8 советов.&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;В первой статье ( &lt;a href="http://objology.blogspot.com/2011/09/one-of-best-bits-of-programming-advice.html?spref=tw"&gt;One of the Best Bits of Programming Advice I ever Got&lt;/a&gt; ) - всего один совет, и звучит он так "&lt;b&gt;Не создавайте объекты, название которых заканчивается на -er&lt;/b&gt;"*. Чем же автору не нравятся все Loader'ы, Manager'ы, Builder'ы...? "В классическом (структурном) программировании, - говорит автор, - мы концентрируемся на поведении (глагол), а потом смотрим, какие данные (существительное) нужны для выполнения работы т.е. мы привязываем данные к поведению." В ООП наоборот: мы ставим на первое место данные (существительные), а потом смотрим, как они должны себя вести (добавляем поведение (глагол)). &lt;br /&gt;Что же дает переименование объектов с именами на "-er"? Более инкапсулированная структура, меньше спагетти-кода и более выраженная объекно-ориентированность. Такой простой совет даёт столько бенефитов.&lt;br /&gt;Вторая статья содержит целых семь советов (&lt;a href="http://sixrevisions.com/web-development/crazy-tips-help-become-better-coder/"&gt;7 Crazy Tips That Will Help You Become a Better Coder&lt;/a&gt;), но их с трудом можно назвать адекватными.&lt;br /&gt;1. Напишите свой фреймворк (читай: изобретите велосипед) - автор говорит, что искусство программирования превратилось в копи-паст, аргументируя это тем, что даже Гугл решил использовать готовый фреймворк JQuery, а не написать свой собственный. Да уж, давайте каждый раз писать новые фреймворки, и как далеко мы удём, каждый раз изучая новую систему для написания какого-нибудь маленького скрипта?&lt;br /&gt;2. Не используйте инструменты разработчиков (читай: вернитесь в каменный век)&lt;br /&gt;3. Не используйте браузер (что-то невнятное)&lt;br /&gt;4. Не используйте кодогенераторы (чем-то перекликается с п.2) - тут есть доля здравого смысла, т.к. код, порождаемый генераторами не оптимален. Но! Пусть попробует вручную создать DataContext mapping БД на 20-30 таблиц, тогда и поговорим :)&lt;br /&gt;5. Примеры из книг печатать, а не копипастить&lt;br /&gt;6. Используйте "ванильный" текстовый редактор (читай: вернитесь в каменный век) - читая такое, кажется, что автор только с html и css работал.&lt;br /&gt;7. Изобретите колесо (no comments) - понятно, что колесо изобретать полезно для понимания принципов его работы (сомнительно).&lt;br /&gt;Все мы учимся на своих и, порой, чужих ошибках. Но советы автора призывают проходить путь от обезьяны до человека, изобретая на ходу тонны велосипедов. Зачем? Может, новичкам и полезно перепечатывать примеры из книг, но для более быстрого продвижения в освоении языка использовать "ванильный" редактор без интелсенс и подсветки синтаксиса - это просто кощунство и пустая трата времени. &lt;br /&gt;____________&lt;br /&gt;*тут речь об отглагольных существительных&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5342535388237643243-2317535805362948368?l=sly-and-fluffy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sly-and-fluffy.blogspot.com/feeds/2317535805362948368/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://sly-and-fluffy.blogspot.com/2011/09/8.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/2317535805362948368'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/2317535805362948368'/><link rel='alternate' type='text/html' href='http://sly-and-fluffy.blogspot.com/2011/09/8.html' title='8 советов'/><author><name>Tatiana Shemyakina</name><uri>https://profiles.google.com/115825956619949451947</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-4MfXIVcZdJA/AAAAAAAAAAI/AAAAAAAAAbA/Iv1Gt6j8YgI/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-B1sF8jQi5Tw/ToWLHYjAWrI/AAAAAAAAAdc/zzQzCwKMHOk/s72-c/images.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5342535388237643243.post-3922142718690293591</id><published>2011-09-29T15:13:00.000+03:00</published><updated>2011-09-29T15:13:19.672+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.net'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='moq'/><title type='text'>Moq: ошибка номер раз</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Дабы не получить ошибку "Invalid setup on a non-virtual (overridable in VB) member" при работе с библиотекой Moq, мокать нужно либо интерфейс класса:&lt;br /&gt;&lt;br /&gt;&lt;code class="prettyprint"&gt;var mock = new Mock&amp;lt;IEventsStorage&amp;gt;(); //этот подход является рекомендуемым&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;либо мокаемый метод нужно объявлять виртуальным:&lt;br /&gt;&lt;br /&gt;&lt;code class="prettyprint"&gt;var mock = new Mock&amp;lt;EventsStorage&amp;gt;();&lt;br /&gt;mock.Setup(storage =&amp;gt; storage.LoadEvents(Monthes.Januar)).Returns(new List&amp;lt;Event&amp;gt;());&lt;br /&gt;&amp;nbsp;&lt;/code&gt;&lt;br /&gt;&lt;code class="prettyprint"&gt;...&lt;br /&gt;&amp;nbsp;&lt;/code&gt;&lt;br /&gt;&lt;code class="prettyprint"&gt;public class EventsStorage&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public virtual List&amp;lt;Event&amp;gt; LoadEvents(Monthes monthNumber) {...}&lt;br /&gt;}&lt;/code&gt;&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;&lt;/code&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5342535388237643243-3922142718690293591?l=sly-and-fluffy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sly-and-fluffy.blogspot.com/feeds/3922142718690293591/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://sly-and-fluffy.blogspot.com/2011/09/moq.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/3922142718690293591'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/3922142718690293591'/><link rel='alternate' type='text/html' href='http://sly-and-fluffy.blogspot.com/2011/09/moq.html' title='Moq: ошибка номер раз'/><author><name>Tatiana Shemyakina</name><uri>https://profiles.google.com/115825956619949451947</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-4MfXIVcZdJA/AAAAAAAAAAI/AAAAAAAAAbA/Iv1Gt6j8YgI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5342535388237643243.post-8888839677970383626</id><published>2011-09-29T10:21:00.001+03:00</published><updated>2011-10-08T15:56:32.861+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='visual studio'/><category scheme='http://www.blogger.com/atom/ns#' term='Tools'/><category scheme='http://www.blogger.com/atom/ns#' term='.net'/><title type='text'>20 аддонов для VS</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Пройдя по ссылке вы сможете найти 20 бесплатных аддонов для Visual Studio, помогающих ускорить разработку и избавить вас от некоторых рутинных действий. &lt;br /&gt;&lt;a href="http://msdn.microsoft.com/ru-ru/vstudio/hh162051"&gt;http://msdn.microsoft.com/ru-ru/vstudio/hh162051&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5342535388237643243-8888839677970383626?l=sly-and-fluffy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sly-and-fluffy.blogspot.com/feeds/8888839677970383626/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://sly-and-fluffy.blogspot.com/2011/09/20-vs.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/8888839677970383626'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/8888839677970383626'/><link rel='alternate' type='text/html' href='http://sly-and-fluffy.blogspot.com/2011/09/20-vs.html' title='20 аддонов для VS'/><author><name>Tatiana Shemyakina</name><uri>https://profiles.google.com/115825956619949451947</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-4MfXIVcZdJA/AAAAAAAAAAI/AAAAAAAAAbA/Iv1Gt6j8YgI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5342535388237643243.post-2571146953744365519</id><published>2011-08-18T09:42:00.000+03:00</published><updated>2011-08-18T09:42:45.045+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Библиотека'/><category scheme='http://www.blogger.com/atom/ns#' term='tdd'/><title type='text'>Библиотека</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-aja9RTyYU6w/TkyznLfHM6I/AAAAAAAAAYE/Rt1G8YuuaZw/s1600/cover.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-aja9RTyYU6w/TkyznLfHM6I/AAAAAAAAAYE/Rt1G8YuuaZw/s1600/cover.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;b&gt;Steve Freeman, Nat Pryce. Growing Object-Oriented Software, Guided by Tests (&lt;a href="http://letitbit.net/download/55032.542f0072e6d309d07f26f0179713/Growing.Object-Oriented.Software_.Guided.by.Tests.pdf.html"&gt;скачать&lt;/a&gt;)&lt;/b&gt;&lt;br /&gt;Test-Driven Development (TDD) is now an established technique for     delivering better software faster. TDD is based on a simple idea: write     tests for your code before you write the code itself. However, this     "simple" idea takes skill and judgment to do well. Now there's a practical     guide to TDD that takes you beyond the basic concepts. Drawing on a decade     of experience building real-world systems, two TDD pioneers show how to     let tests guide your development and “grow” software that is coherent,     reliable, and maintainable.&lt;br /&gt;Steve Freeman and Nat Pryce describe the processes they use, the design     principles they strive to achieve, and some of the tools that help them     get the job done. Through an extended worked example, you’ll learn how TDD     works at multiple levels, using tests to drive the features and the     object-oriented structure of the code, and using Mock Objects to discover     and then describe relationships between objects. Along the way, the book     systematically addresses challenges that development teams encounter with     TDD—from integrating TDD into your processes to testing your most     difficult features. &lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;Coverage includes&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Implementing TDD effectively: getting started, and maintaining your       momentum throughout the project&lt;/li&gt;&lt;li&gt;Creating cleaner, more expressive, more sustainable code&lt;/li&gt;&lt;li&gt;Using tests to stay relentlessly focused on sustaining quality&lt;/li&gt;&lt;li&gt;Understanding how TDD, Mock Objects, and Object-Oriented Design come       together in the context of a real software development project&lt;/li&gt;&lt;li&gt;Using Mock Objects to guide object-oriented designs&lt;/li&gt;&lt;li&gt;Succeeding where TDD is difficult: managing complex test data, and       testing persistence and concurrency&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5342535388237643243-2571146953744365519?l=sly-and-fluffy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sly-and-fluffy.blogspot.com/feeds/2571146953744365519/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://sly-and-fluffy.blogspot.com/2011/08/blog-post_8675.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/2571146953744365519'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/2571146953744365519'/><link rel='alternate' type='text/html' href='http://sly-and-fluffy.blogspot.com/2011/08/blog-post_8675.html' title='Библиотека'/><author><name>Tatiana Shemyakina</name><uri>https://profiles.google.com/115825956619949451947</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-4MfXIVcZdJA/AAAAAAAAAAI/AAAAAAAAAbA/Iv1Gt6j8YgI/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-aja9RTyYU6w/TkyznLfHM6I/AAAAAAAAAYE/Rt1G8YuuaZw/s72-c/cover.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5342535388237643243.post-5584556791824958939</id><published>2011-08-18T09:36:00.000+03:00</published><updated>2011-08-18T09:36:04.080+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Библиотека'/><title type='text'>Библиотека</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-N1BEHTs7zog/Tkyw9mvIvDI/AAAAAAAAAX4/aiB87HSMfxQ/s1600/osnovu_oorps.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-N1BEHTs7zog/Tkyw9mvIvDI/AAAAAAAAAX4/aiB87HSMfxQ/s1600/osnovu_oorps.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;b&gt;Фридман А.Л. - Основы объектно-ориентированной разработки программных систем. (&lt;a href="http://letitbit.net/download/13225.18e3be800b96ddce3871f167e642/%D0%A4%D1%80%D0%B8%D0%B4%D0%BC%D0%B0%D0%BD_%D0%90.%D0%9B._%D0%9E%D1%81%D0%BD%D0%BE%D0%B2%D1%8B_%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D0%BD%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D0%BE%D0%B9_%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B8_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%BD%D1%8B%D1%85_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC.djvu.html"&gt;скачать&lt;/a&gt;)&lt;/b&gt;&lt;br /&gt;Книга написана как учебное пособие для студентов старших курсов. В ней рассматриваются основные понятия объектно-ориентированного программирования, методы анализа задач и проектирования программных систем на его основе. Исследуются современные способы организации процесса создания программного обеспечения и их взаимосвязь с методами анализа проектирования систем, прежде всего на основе подхода "проектирование по образцам".&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-0Qk720krxB4/TkyyMkZwi7I/AAAAAAAAAYA/VbeP9u1ttLk/s1600/oop-v-deistv.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-0Qk720krxB4/TkyyMkZwi7I/AAAAAAAAAYA/VbeP9u1ttLk/s1600/oop-v-deistv.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&amp;nbsp;&lt;b&gt;Тимоти Бадд - Объектно-ориентированное программирование в действии (&lt;a href="http://letitbit.net/download/35963.33268589d29b16da6eadc644ef90/%D0%A2._%D0%91%D0%B0%D0%B4%D0%B4.-_%D0%9E%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D0%BD%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D0%BE%D0%B5.pdf.html"&gt;скачать&lt;/a&gt;)&lt;/b&gt;&lt;br /&gt;Второе американское издание книги известного специалиста по объектно - ориентированному программированию выпускается на русском языке по лицензии издательства Addison Wesley Longman. В ней рассматриваются теоретические и практические аспекты ООП (как на уровне разработки программ, так и на уровне работы компиляторов), позволяющие с наименьшими затратами получать современные программы со сложной логической структурой. Автор обобщает опыт объектно - ориентированного программирования на примерах таких языков, как Java, C++, Object Pascal и др. Соответствующий круг вопросов весьма актуален, поскольку в практике современного программирования приходится иметь дело со все более сложными логическими и программными объектами. Рассмотрение теоретических вопросов настраницах книги удачно сочетается с многочисленными наглядными примерами. Для понимания материала достаточно владения каким - либо традиционным языком программирования типа С или Pascal, хотя в отдельных случаях (особенно в последней четверти книги) могут оказаться желательны (но не необходимы) и более глубокие знания. Книга будет полезна преподавателям, студентам, разработчикам прикладных программ и всем, кто хочет освоить современные подходы к программированию.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5342535388237643243-5584556791824958939?l=sly-and-fluffy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sly-and-fluffy.blogspot.com/feeds/5584556791824958939/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://sly-and-fluffy.blogspot.com/2011/08/blog-post_7720.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/5584556791824958939'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/5584556791824958939'/><link rel='alternate' type='text/html' href='http://sly-and-fluffy.blogspot.com/2011/08/blog-post_7720.html' title='Библиотека'/><author><name>Tatiana Shemyakina</name><uri>https://profiles.google.com/115825956619949451947</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-4MfXIVcZdJA/AAAAAAAAAAI/AAAAAAAAAbA/Iv1Gt6j8YgI/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-N1BEHTs7zog/Tkyw9mvIvDI/AAAAAAAAAX4/aiB87HSMfxQ/s72-c/osnovu_oorps.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5342535388237643243.post-200761300633807076</id><published>2011-08-18T09:25:00.000+03:00</published><updated>2011-08-18T09:25:34.304+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Библиотека'/><title type='text'>Библиотека</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-K0C4xfMBsrM/TkyvC7HlxwI/AAAAAAAAAX0/Ki3JYjg2LUg/s1600/5178bb8974541131853e69c9c21e2aa5.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://2.bp.blogspot.com/-K0C4xfMBsrM/TkyvC7HlxwI/AAAAAAAAAX0/Ki3JYjg2LUg/s320/5178bb8974541131853e69c9c21e2aa5.jpg" width="224" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;span style="line-height: normal;"&gt;Мартин Р. &lt;b&gt;Чистый код. Создание, анализ и рефакторинг (&lt;a href="http://letitbit.net/download/98151.90ddbff67dcff390b6b262028859/%D0%9C%D0%B0%D1%80%D1%82%D0%B8%D0%BD._%D0%A7%D0%B8%D1%81%D1%82%D1%8B%D0%B9_%D0%BA%D0%BE%D0%B4.pdf.html"&gt;скачать&lt;/a&gt;)&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="post-b"&gt;&lt;/span&gt; Эта книга посвящена хорошему  программированию. Она полна реальных примеров кода. Мы будем  рассматривать код с различных направлений: сверху вниз, снизу вверх и  даже изнутри. Прочитав книгу, вы узнаете много нового о коде. Более  того, вы научитесь отличать хороший код от плохого. Вы узнаете, как  писать хороший код и как преобразовать плохой код в хороший.&lt;br /&gt;Книга состоит из трех частей. В первой части излагаются принципы,  паттерны и приемы написания чистого кода; приводится большой объем  примеров кода. Вторая часть состоит из практических сценариев  нарастающей сложности. Каждый сценарий представляет собой упражнение по  чистке кода или преобразованию проблемного кода в код с меньшим  количеством проблем. Третья часть книги — концентрированное выражение ее  сути. Она состоит из одной главы с перечнем эвристических правил и  «запахов кода», собранных во время анализа. Эта часть представляет собой  базу знаний, описывающую наш путь мышления в процессе чтения, написания  и чистки кода&lt;span style="line-height: normal;"&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5342535388237643243-200761300633807076?l=sly-and-fluffy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sly-and-fluffy.blogspot.com/feeds/200761300633807076/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://sly-and-fluffy.blogspot.com/2011/08/blog-post_18.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/200761300633807076'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/200761300633807076'/><link rel='alternate' type='text/html' href='http://sly-and-fluffy.blogspot.com/2011/08/blog-post_18.html' title='Библиотека'/><author><name>Tatiana Shemyakina</name><uri>https://profiles.google.com/115825956619949451947</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-4MfXIVcZdJA/AAAAAAAAAAI/AAAAAAAAAbA/Iv1Gt6j8YgI/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-K0C4xfMBsrM/TkyvC7HlxwI/AAAAAAAAAX0/Ki3JYjg2LUg/s72-c/5178bb8974541131853e69c9c21e2aa5.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5342535388237643243.post-2082053123027079952</id><published>2011-08-09T13:18:00.000+03:00</published><updated>2011-08-09T13:18:09.830+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.net'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>Статические методы и методы экземпляра: кто быстрее</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Для некоторых методов класса Microsoft Code Analysis даёт такой совет: &lt;br /&gt;&lt;blockquote&gt;CA1822 : Microsoft.Performance : The 'this' parameter (or 'Me' in Visual Basic) is never used. Mark the member as static (or Shared in Visual Basic) or use 'this'/'Me' in the method body or at least one property accessor, if appropriate.&amp;nbsp; &lt;/blockquote&gt;В &lt;a href="http://msdn.microsoft.com/en-us/library/ms245046.aspx"&gt;MSDN по этому поводу написано&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;«Members that do not access instance data or call instance  methods can be marked as static (Shared in Visual Basic). After you mark  the methods as static, the compiler will emit non-virtual call sites to  these members. Emitting non-virtual call sites will prevent a check at  runtime for each call that ensures that the current object pointer is  non-null. This can result in a measurable performance gain for  performance-sensitive code. In some cases, the failure to access the  current object instance represents a correctness issue.»&lt;/blockquote&gt;Какие преимущества у static метода перед методом экземпляра? При каждом вызове метода экземпляра происходит проверка указателя на null. Для статических методов такого не делается, что даёт небольшой прирост производительности. Кроме того, &lt;a href="http://msdn.microsoft.com/en-us/library/79b3xss3.aspx"&gt;согласно MSDN&lt;/a&gt;, для всех объектов класса будет существовать только один экземпляр метода, что так же увеличит производительность.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5342535388237643243-2082053123027079952?l=sly-and-fluffy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sly-and-fluffy.blogspot.com/feeds/2082053123027079952/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://sly-and-fluffy.blogspot.com/2011/08/blog-post.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/2082053123027079952'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/2082053123027079952'/><link rel='alternate' type='text/html' href='http://sly-and-fluffy.blogspot.com/2011/08/blog-post.html' title='Статические методы и методы экземпляра: кто быстрее'/><author><name>Tatiana Shemyakina</name><uri>https://profiles.google.com/115825956619949451947</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-4MfXIVcZdJA/AAAAAAAAAAI/AAAAAAAAAbA/Iv1Gt6j8YgI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5342535388237643243.post-3508187695798332321</id><published>2011-07-13T17:23:00.002+03:00</published><updated>2011-07-18T13:07:14.614+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='разработка ПО'/><title type='text'>Аспектно-ориентированное программирование</title><content type='html'>Что же такое&amp;nbsp; аспектно-ориентированное программирование? Ещё одна модная тенденция в мире разработки? &lt;a href="http://ru.wikipedia.org/wiki/%D0%90%D1%81%D0%BF%D0%B5%D0%BA%D1%82%D0%BD%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5"&gt;Вики дает такое определение&lt;/a&gt;:&lt;br /&gt;&lt;blockquote&gt;&lt;b&gt;Аспе́ктно-ориенти́рованное программи́рование (АОП)&lt;/b&gt; — парадигма программирования, основанная на идее разделения функциональности для улучшения разбиения программы на модули.&lt;/blockquote&gt;Как-то знакомо звучит. &lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;Ведь и другие парадигмы программирования поощряют разбиение функционала программы на модули, а также есть методологии, призванные помочь решить данную проблему - &lt;a href="http://sly-and-fluffy.blogspot.com/2010/09/ioc-di-wtf.html"&gt;инверсия управления&lt;/a&gt;, например. Вот тут и проявляются главные отличия.&amp;nbsp; АОП заботится о выделении &lt;i&gt;сквозной функциональности (аспектов)&lt;/i&gt;. Сквозная функциональность - это раскиданный по коду функционал, который невозможно декомпозировать ни процедурными, ни объектно-оринетированными- средствами, например, логирование, проверка прав доступа., обработка ошибок. ООП позволяет проектировать программы в терминах объектов, каким-то образом связанных друг с другом. Случается так, что между объектами возникает слишком большая связанность (обычно при программировании на конкретные классы, а не на интерфейсы). С одной стороны, тут может иметь дело ошибка проектирования, с другой - программирования. И тут приходит на помощь методология IoC и программирование по контракту (программирование на интерфейс, а не на конкретный класс). IoC призвана уменьшить связанность, разорвать жесткие зависимости между классами, сделав возможным разбиение кода на отдельные модули.&lt;br /&gt;&lt;br /&gt;Итак, у нас есть аспекты и объекты. Объекты - это маленькие целостные подсистемы одной большой декомпозированной системы. Например, объект "колесо"&amp;nbsp; в системе "машина" или "выключатель" в системе "лампа". Аспект будет подсистемой, включающей в себя служебный (т.е. не влияющий на поведение объектов) функционал. Например, логирование события, когда была включена/выключена лампа. Такой функционал никаким IoC не локализировать. &lt;br /&gt;&lt;br /&gt;АОП - мощный инструмент при условии правильного применения. Перед тем, как решить внедрять его в проект (впрочем, как и любой другой инструмент), стоит задуматься: а надо ли? Тот ли масштаб у проекта? Не усложнит ли это жизнь? Не стоит кидаться на него только из-за того, что сейчас это модно.&lt;br /&gt;&lt;br /&gt;Почитать:&lt;br /&gt;&lt;a href="http://www.javable.com/columns/aop/workshop/02/"&gt;Аспектно-ориентированное программирование&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.javable.com/columns/aop/workshop/01/"&gt;Использование АОП&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5342535388237643243-3508187695798332321?l=sly-and-fluffy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sly-and-fluffy.blogspot.com/feeds/3508187695798332321/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://sly-and-fluffy.blogspot.com/2011/07/blog-post_13.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/3508187695798332321'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/3508187695798332321'/><link rel='alternate' type='text/html' href='http://sly-and-fluffy.blogspot.com/2011/07/blog-post_13.html' title='Аспектно-ориентированное программирование'/><author><name>Tatiana Shemyakina</name><uri>https://profiles.google.com/115825956619949451947</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-4MfXIVcZdJA/AAAAAAAAAAI/AAAAAAAAAbA/Iv1Gt6j8YgI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5342535388237643243.post-3580686470835984147</id><published>2011-07-13T09:58:00.000+03:00</published><updated>2011-07-13T09:58:51.322+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.net'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>C# Finalize/Dispose pattern</title><content type='html'>Два интересных обсуждения о Finalize/Dispose в C#&amp;nbsp; на StackOverflow (&lt;a href="http://stackoverflow.com/questions/898828/c-finalize-dispose-pattern/898867#898867"&gt;http://stackoverflow.com/questions/898828/c-finalize-dispose-pattern/898867#898867&lt;/a&gt;) и Хабре (&lt;a href="http://habrahabr.ru/blogs/net/122639/"&gt;http://habrahabr.ru/blogs/net/122639/&lt;/a&gt;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5342535388237643243-3580686470835984147?l=sly-and-fluffy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sly-and-fluffy.blogspot.com/feeds/3580686470835984147/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://sly-and-fluffy.blogspot.com/2011/07/c-finalizedispose-pattern.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/3580686470835984147'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/3580686470835984147'/><link rel='alternate' type='text/html' href='http://sly-and-fluffy.blogspot.com/2011/07/c-finalizedispose-pattern.html' title='C# Finalize/Dispose pattern'/><author><name>Tatiana Shemyakina</name><uri>https://profiles.google.com/115825956619949451947</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-4MfXIVcZdJA/AAAAAAAAAAI/AAAAAAAAAbA/Iv1Gt6j8YgI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5342535388237643243.post-1053616260479197696</id><published>2011-07-08T21:54:00.000+03:00</published><updated>2012-01-30T11:11:13.779+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='юмор'/><category scheme='http://www.blogger.com/atom/ns#' term='Разное'/><title type='text'>Боян про отладку</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-TXCxkFAV8sY/ThdSSltBIqI/AAAAAAAAAWY/0oox-LVugbo/s1600/122879_schastlivoj-otladki-suki.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-TXCxkFAV8sY/ThdSSltBIqI/AAAAAAAAAWY/0oox-LVugbo/s1600/122879_schastlivoj-otladki-suki.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5342535388237643243-1053616260479197696?l=sly-and-fluffy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sly-and-fluffy.blogspot.com/feeds/1053616260479197696/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://sly-and-fluffy.blogspot.com/2011/07/blog-post.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/1053616260479197696'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/1053616260479197696'/><link rel='alternate' type='text/html' href='http://sly-and-fluffy.blogspot.com/2011/07/blog-post.html' title='Боян про отладку'/><author><name>Tatiana Shemyakina</name><uri>https://profiles.google.com/115825956619949451947</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-4MfXIVcZdJA/AAAAAAAAAAI/AAAAAAAAAbA/Iv1Gt6j8YgI/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-TXCxkFAV8sY/ThdSSltBIqI/AAAAAAAAAWY/0oox-LVugbo/s72-c/122879_schastlivoj-otladki-suki.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5342535388237643243.post-1064238542745532485</id><published>2011-06-15T15:08:00.002+03:00</published><updated>2012-01-30T11:11:32.204+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='юмор'/><category scheme='http://www.blogger.com/atom/ns#' term='Разное'/><title type='text'>Злободневно с баша</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;br /&gt;&lt;b&gt;XXX&lt;/b&gt;: Если бы компьютер был стройкой, то на просьбу посоветовать  инструмент для забивания гвоздя большинство окружающих посоветовали бы  использовать различные модели пизженых со склада микроскопов, поливая  говном микроскопы других производителей, и только пара человек молча  протянули бы молоток.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;YYY&lt;/b&gt;: Причем из этих двух молотков, один был бы самодельной киянкой!&lt;br /&gt;&lt;br /&gt;&lt;b&gt;XXX&lt;/b&gt;: Точно. А еще кто-нибудь заявил бы, что все ламеры, а вместо гвоздя нужно использовать шуруп.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;YYY&lt;/b&gt;: И предложил бы свой вариант самореза с правой резьбой под шестигранную отвертку с логотипом Sun…&lt;br /&gt;&lt;br /&gt;&lt;b&gt;XXX&lt;/b&gt;: А потом кто-нибудь прийдет и скажет, что посадил все на суперклей и вроде стоит.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;YYY&lt;/b&gt;: А кто то будет причитать про то, что раньше вообще без гвоздей строили и стояло века…&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5342535388237643243-1064238542745532485?l=sly-and-fluffy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sly-and-fluffy.blogspot.com/feeds/1064238542745532485/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://sly-and-fluffy.blogspot.com/2011/06/blog-post.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/1064238542745532485'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/1064238542745532485'/><link rel='alternate' type='text/html' href='http://sly-and-fluffy.blogspot.com/2011/06/blog-post.html' title='Злободневно с баша'/><author><name>Tatiana Shemyakina</name><uri>https://profiles.google.com/115825956619949451947</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-4MfXIVcZdJA/AAAAAAAAAAI/AAAAAAAAAbA/Iv1Gt6j8YgI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5342535388237643243.post-8597659149523565876</id><published>2011-06-08T14:34:00.000+03:00</published><updated>2011-06-08T14:34:32.224+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='.net'/><category scheme='http://www.blogger.com/atom/ns#' term='mono'/><title type='text'>Сравнительное тестирование производительности платформ .Net, Java и Mono</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;span class="topic" title="http://habrahabr.ru/blogs/development/120090/"&gt;Статья на хабре о сравнении производительности платформ .Net, Java и Mono &lt;/span&gt;&lt;br /&gt;&lt;a href="http://habrahabr.ru/blogs/development/120090/"&gt;http://habrahabr.ru/blogs/development/120090/&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5342535388237643243-8597659149523565876?l=sly-and-fluffy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sly-and-fluffy.blogspot.com/feeds/8597659149523565876/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://sly-and-fluffy.blogspot.com/2011/06/net-java-mono.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/8597659149523565876'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/8597659149523565876'/><link rel='alternate' type='text/html' href='http://sly-and-fluffy.blogspot.com/2011/06/net-java-mono.html' title='Сравнительное тестирование производительности платформ .Net, Java и Mono'/><author><name>Tatiana Shemyakina</name><uri>https://profiles.google.com/115825956619949451947</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-4MfXIVcZdJA/AAAAAAAAAAI/AAAAAAAAAbA/Iv1Gt6j8YgI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5342535388237643243.post-4601317890545578973</id><published>2011-05-25T13:02:00.003+03:00</published><updated>2011-05-25T13:11:47.780+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.net'/><category scheme='http://www.blogger.com/atom/ns#' term='RegExpr'/><title type='text'>RegexOptions</title><content type='html'>Есть файл с содержимым вида &lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;&amp;lt;Book&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;    &amp;lt;Page number='1'&amp;gt;&amp;lt;![CDATA[line1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; line2&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; line3]]&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;    &amp;lt;/Page&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;    &amp;lt;Page number='2'&amp;gt;&amp;lt;![CDATA[line1]]&amp;gt;&lt;/code&gt;&lt;br /&gt;&lt;code class="prettyprint"&gt;&amp;nbsp;&amp;nbsp; &amp;lt;/Page&amp;gt;&lt;br /&gt;&amp;lt;/Book&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Нужно распарсить содержимое через RegExpr. Вроде ничего сложного. Тест для класса PageParser должен срабатывать:&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;//PageParser&lt;br /&gt;class PagePaerser&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;public static IList&amp;lt;Page&amp;gt; Parse(string xml)&lt;br /&gt;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IList&amp;lt;Page&amp;gt; pages = new List&amp;lt;Page&amp;gt;();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; string pattern = "&amp;lt;Page number='(?&amp;lt;number&amp;gt;\\d*?)'&amp;gt;&amp;lt;\\!\\[CDATA\\[(?&amp;lt;content&amp;gt;.*?)\\]\\]&amp;gt;&amp;lt;\\/Page&amp;gt;";&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var matches = Regex.Matches(xml, pattern, RegexOptions.IgnoreCase | RegexOptions.Multiline);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (matches.Count&amp;gt;0)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {                &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;foreach(Match match in matches)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{                    &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pages.Add(new Page()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;       content = match.Groups["content"].Captures[0].Value,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;       number = int.Parse(match.Groups["number"].Captures[0].Value)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;});                    &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return pages;&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;[TestMethod]&lt;br /&gt;public void ParseMethod_ListOfPages_Test()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;      var parsed_pages = PageParser.Parse(@"&lt;/code&gt;&lt;code class="prettyprint"&gt;&amp;lt;Book&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;   &amp;lt;Page number='1'&amp;gt;&amp;lt;![CDATA[line1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; line2&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; line3]]&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;    &amp;lt;/Page&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;   &amp;lt;Page number='2'&amp;gt;&amp;lt;![CDATA[line1]]&amp;gt;&lt;/code&gt;&lt;br /&gt;&lt;code class="prettyprint"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/Page&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;lt;/Book&amp;gt;&lt;/code&gt;&lt;br /&gt;&lt;code class="prettyprint"&gt;");&lt;br /&gt;&amp;nbsp;&amp;nbsp;      Assert.AreEqual(2, parsed_pages.Count);&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Но тест не срабатывает. Дело в том, что в RegExpr для обработки multiline-строк, нужно вместо флага RegexOptions.Multiline устанавливать RegexOptions.Singleline, который &lt;a href="http://msdn.microsoft.com/en-us/library/443e8hc7%28vs.71%29.aspx"&gt;меняет режим символа "." на улавливание совпадений со всеми символами, а не всех символов, кроме новой строки (\n)&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5342535388237643243-4601317890545578973?l=sly-and-fluffy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sly-and-fluffy.blogspot.com/feeds/4601317890545578973/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://sly-and-fluffy.blogspot.com/2011/05/regexoptions.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/4601317890545578973'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/4601317890545578973'/><link rel='alternate' type='text/html' href='http://sly-and-fluffy.blogspot.com/2011/05/regexoptions.html' title='RegexOptions'/><author><name>Tatiana Shemyakina</name><uri>https://profiles.google.com/115825956619949451947</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-4MfXIVcZdJA/AAAAAAAAAAI/AAAAAAAAAbA/Iv1Gt6j8YgI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5342535388237643243.post-2356927126478031568</id><published>2011-05-24T23:11:00.000+03:00</published><updated>2012-01-30T11:11:43.841+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='юмор'/><category scheme='http://www.blogger.com/atom/ns#' term='Разное'/><title type='text'>Coding drunk</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-OzlSuMROau4/TdwQ3mX6kvI/AAAAAAAAAWQ/QC978TmsUio/s1600/Coding_Drunk.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="400" src="http://3.bp.blogspot.com/-OzlSuMROau4/TdwQ3mX6kvI/AAAAAAAAAWQ/QC978TmsUio/s400/Coding_Drunk.jpg" width="335" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5342535388237643243-2356927126478031568?l=sly-and-fluffy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sly-and-fluffy.blogspot.com/feeds/2356927126478031568/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://sly-and-fluffy.blogspot.com/2011/05/coding-drunk.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/2356927126478031568'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/2356927126478031568'/><link rel='alternate' type='text/html' href='http://sly-and-fluffy.blogspot.com/2011/05/coding-drunk.html' title='Coding drunk'/><author><name>Tatiana Shemyakina</name><uri>https://profiles.google.com/115825956619949451947</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-4MfXIVcZdJA/AAAAAAAAAAI/AAAAAAAAAbA/Iv1Gt6j8YgI/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-OzlSuMROau4/TdwQ3mX6kvI/AAAAAAAAAWQ/QC978TmsUio/s72-c/Coding_Drunk.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5342535388237643243.post-6051947821439780180</id><published>2011-05-18T21:52:00.000+03:00</published><updated>2011-05-18T21:52:44.368+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.net'/><category scheme='http://www.blogger.com/atom/ns#' term='nosql'/><category scheme='http://www.blogger.com/atom/ns#' term='object db'/><title type='text'>Объектные NoSql базы для .Net</title><content type='html'>Небольшой обзор объектных БД под .Net. В обзор попали Eloquera, STSdb, Siaqodb, Ninja Database Lite.&lt;br /&gt;&lt;a href="http://weblogs.asp.net/fmarguerie/archive/2010/09/29/object-databases-for-dotnet-eloquera-stsdb-siaqodb-ninja.aspx"&gt;Ссылка &lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5342535388237643243-6051947821439780180?l=sly-and-fluffy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sly-and-fluffy.blogspot.com/feeds/6051947821439780180/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://sly-and-fluffy.blogspot.com/2011/05/nosql-net.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/6051947821439780180'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/6051947821439780180'/><link rel='alternate' type='text/html' href='http://sly-and-fluffy.blogspot.com/2011/05/nosql-net.html' title='Объектные NoSql базы для .Net'/><author><name>Tatiana Shemyakina</name><uri>https://profiles.google.com/115825956619949451947</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-4MfXIVcZdJA/AAAAAAAAAAI/AAAAAAAAAbA/Iv1Gt6j8YgI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5342535388237643243.post-7367932723912084678</id><published>2011-05-17T13:53:00.000+03:00</published><updated>2011-05-17T13:53:39.144+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.net'/><category scheme='http://www.blogger.com/atom/ns#' term='декомпилятор'/><title type='text'>dotPeek - бесплатный декомпилятор от JetBrains</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-GfRiNDjvPLQ/TdJSmFRjpXI/AAAAAAAAAWM/HYt0KSkmEF4/s1600/45a0649e.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-GfRiNDjvPLQ/TdJSmFRjpXI/AAAAAAAAAWM/HYt0KSkmEF4/s1600/45a0649e.png" /&gt;&lt;/a&gt;&lt;/div&gt;На замену .NetReflector, который стал платным, компания JetBrains выпустила свой бесплатный декомпилятор dotPeek, который умеет&lt;br /&gt;&amp;nbsp;- декомпилировать сборки .Net всех версий (1-4) в C#&lt;br /&gt;- делать навигацию по коду (такую же как и в ReSharper) и понимает клавиатурные шорткаты,&amp;nbsp; аналогичные ReSharper’у&lt;br /&gt;- делать подсветку синтаксиса, фолдинг, и в целом предоставлять experience, аналогичный Visual Studio&lt;br /&gt;&lt;br /&gt;&lt;a href="http://confluence.jetbrains.net/display/NETPEEK/Introducing+JetBrains+dotPeek"&gt;Детальный обзор dotPeek&lt;/a&gt; &lt;br /&gt;&lt;a href="http://confluence.jetbrains.net/display/NETPEEK/dotPeek+Early+Access+Program"&gt;Скачать dotPeek&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5342535388237643243-7367932723912084678?l=sly-and-fluffy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sly-and-fluffy.blogspot.com/feeds/7367932723912084678/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://sly-and-fluffy.blogspot.com/2011/05/dotpeek-jetbrains.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/7367932723912084678'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/7367932723912084678'/><link rel='alternate' type='text/html' href='http://sly-and-fluffy.blogspot.com/2011/05/dotpeek-jetbrains.html' title='dotPeek - бесплатный декомпилятор от JetBrains'/><author><name>Tatiana Shemyakina</name><uri>https://profiles.google.com/115825956619949451947</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-4MfXIVcZdJA/AAAAAAAAAAI/AAAAAAAAAbA/Iv1Gt6j8YgI/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-GfRiNDjvPLQ/TdJSmFRjpXI/AAAAAAAAAWM/HYt0KSkmEF4/s72-c/45a0649e.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5342535388237643243.post-955872194175009395</id><published>2011-04-28T13:00:00.002+03:00</published><updated>2011-04-28T13:00:59.269+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Разное'/><title type='text'>Random numbers generator</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-Df82zl4rtJQ/Tbk6zRSoimI/AAAAAAAAAWI/Jzrb93KGJ4I/s1600/x_2b5f1a4e85.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-Df82zl4rtJQ/Tbk6zRSoimI/AAAAAAAAAWI/Jzrb93KGJ4I/s1600/x_2b5f1a4e85.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5342535388237643243-955872194175009395?l=sly-and-fluffy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sly-and-fluffy.blogspot.com/feeds/955872194175009395/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://sly-and-fluffy.blogspot.com/2011/04/random-numbers-generator.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/955872194175009395'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/955872194175009395'/><link rel='alternate' type='text/html' href='http://sly-and-fluffy.blogspot.com/2011/04/random-numbers-generator.html' title='Random numbers generator'/><author><name>Tatiana Shemyakina</name><uri>https://profiles.google.com/115825956619949451947</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-4MfXIVcZdJA/AAAAAAAAAAI/AAAAAAAAAbA/Iv1Gt6j8YgI/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-Df82zl4rtJQ/Tbk6zRSoimI/AAAAAAAAAWI/Jzrb93KGJ4I/s72-c/x_2b5f1a4e85.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5342535388237643243.post-2607691782117317986</id><published>2011-04-12T15:12:00.001+03:00</published><updated>2011-04-12T15:19:08.885+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.net'/><title type='text'>Crack.Net 2.0</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-bUIHO7zp1pA/TaQ_iJ31BqI/AAAAAAAAAV8/n7XL6OVD6Vk/s1600/cracknetlauncher.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="61" src="http://4.bp.blogspot.com/-bUIHO7zp1pA/TaQ_iJ31BqI/AAAAAAAAAV8/n7XL6OVD6Vk/s400/cracknetlauncher.png" width="300" /&gt;&lt;/a&gt;&lt;/div&gt;Crack.Net - freeware runtime debugger для .net-приложений. Позволяет анализировать память, просматривать Debug output, интегрирован с &lt;a href="http://www.red-gate.com/products/reflector/"&gt;Red Gate’s .NET Reflector.&lt;/a&gt; и, что самое вкусное, позволяет работать с объектами и событиями с помощью скриптов на IronPython (для этого нужно добавить IronPython.dll и IronMath.dll в GAC). Мощная штука. Работает под .net framework 3.5 + sp1. Сайт проекта - &lt;a href="http://joshsmithonwpf.wordpress.com/cracknet/"&gt;http://joshsmithonwpf.wordpress.com/cracknet/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5342535388237643243-2607691782117317986?l=sly-and-fluffy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sly-and-fluffy.blogspot.com/feeds/2607691782117317986/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://sly-and-fluffy.blogspot.com/2011/04/cracknet-20.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/2607691782117317986'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/2607691782117317986'/><link rel='alternate' type='text/html' href='http://sly-and-fluffy.blogspot.com/2011/04/cracknet-20.html' title='Crack.Net 2.0'/><author><name>Tatiana Shemyakina</name><uri>https://profiles.google.com/115825956619949451947</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-4MfXIVcZdJA/AAAAAAAAAAI/AAAAAAAAAbA/Iv1Gt6j8YgI/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-bUIHO7zp1pA/TaQ_iJ31BqI/AAAAAAAAAV8/n7XL6OVD6Vk/s72-c/cracknetlauncher.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5342535388237643243.post-4086764627295436020</id><published>2011-04-11T23:57:00.002+03:00</published><updated>2011-04-11T23:59:11.607+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='unity'/><title type='text'>Конфигурируем Unity 2.0 через xml-файл</title><content type='html'>Цель данной заметки - рассмотреть простой случай конфигурации Unity через xml-файл.&amp;nbsp; &lt;br /&gt;Формат конфигурации Unity и более подробная информация касательно каждой секции тут &lt;a href="http://msdn.microsoft.com/en-us/library/ff650027.aspx#config_format"&gt;http://msdn.microsoft.com/en-us/library/ff650027.aspx#config_format&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;И так, если вы не хотите прописывать все зависимости в коде, как это делается, например, тут (&lt;a href="http://sly-and-fluffy.blogspot.com/2011/03/setter-injection-with-unity-20.html"&gt;http://sly-and-fluffy.blogspot.com/2011/03/setter-injection-with-unity-20.html&lt;/a&gt;), то велкам. Сначала рассмотрим простейший случай. У нас есть интерфейс и три класса, его реализующих:&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;public interface IPosition&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; string Position { get; }&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public class JustEmployee : IPosition&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public string Position { get { return "Just employee"; } }&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public class Manager : IPosition&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public string Position { get { return "Manager"; } }&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public class Boss : IPosition&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public string Position { get { return "Boss"; } }&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Теперь конфигурируем Unity таким образом:&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;var map = new ExeConfigurationFileMap { ExeConfigFilename = "Unity.config" };&lt;br /&gt;var config = ConfigurationManager.OpenMappedExeConfiguration(map, ConfigurationUserLevel.None);&lt;br /&gt;var section = (UnityConfigurationSection)config.GetSection("unity");&lt;br /&gt;var container = new UnityContainer();            &lt;br /&gt;section.Containers.Default.Configure(container);&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;И код, использующий IPosition:&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;List&amp;lt;IPosition&amp;gt; positions = new List&amp;lt;IPosition&amp;gt;();&lt;br /&gt;positions.Add( container.Resolve&amp;lt;IPosition&amp;gt;() );&lt;br /&gt;positions.Add(container.Resolve&amp;lt;IPosition&amp;gt;("Manager"));&lt;br /&gt;positions.Add(container.Resolve&amp;lt;IPosition&amp;gt;("Boss"));            &lt;br /&gt;foreach (var position in positions)&lt;br /&gt;{&lt;br /&gt;Console.WriteLine("Position: " + position.Position);&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;И результат:&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-n_s43s_Mkqc/TaNk-kYOIdI/AAAAAAAAAV4/__N0D7igigU/s1600/1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-n_s43s_Mkqc/TaNk-kYOIdI/AAAAAAAAAV4/__N0D7igigU/s1600/1.png" /&gt;&lt;/a&gt;&lt;/div&gt;Что же такого волшебного находится в файле Unity.config? Вот полный текст:&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;&amp;lt;?xml version="1.0" encoding="utf-8" ?&amp;gt;&lt;br /&gt;&amp;lt;configuration&amp;gt;&lt;br /&gt;&amp;lt;configSections&amp;gt;&lt;br /&gt;&amp;lt;section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Microsoft.Practices.Unity.Configuration" /&amp;gt;&lt;br /&gt;&amp;lt;/configSections&amp;gt;&lt;br /&gt;&amp;lt;unity xmlns="http://schemas.microsoft.com/practices/2010/unity"&amp;gt;&lt;br /&gt;&amp;lt;namespace name="UnityTest" /&amp;gt;&lt;br /&gt;&amp;lt;assembly name="UnityTest1" /&amp;gt;&lt;br /&gt;&amp;lt;alias alias="IPosition" type="UnityTest.IPosition" /&amp;gt;&lt;br /&gt;&amp;lt;alias alias="JustEmployee" type="UnityTest.JustEmployee" /&amp;gt;&lt;br /&gt;&amp;lt;alias alias ="Manager" type ="UnityTest.Manager"/&amp;gt;&lt;br /&gt;&amp;lt;alias alias ="Boss" type ="UnityTest.Boss"/&amp;gt;&lt;br /&gt;&amp;lt;container&amp;gt;        &lt;br /&gt;&amp;lt;register type="IPosition" mapTo="JustEmployee" /&amp;gt;&lt;br /&gt;&amp;lt;register name ="Manager" type ="IPosition" mapTo ="Manager" /&amp;gt;&lt;br /&gt;&amp;lt;register name ="Boss" type ="IPosition" mapTo ="Boss" /&amp;gt;&lt;br /&gt;&amp;lt;/container&amp;gt;    &lt;br /&gt;&amp;lt;/unity&amp;gt;&lt;br /&gt;&amp;lt;/configuration&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;А теперь обо всём по порядку.&lt;br /&gt;В теге "section" указывается название тега, в котором находится весь конфиг. В данном случае это "unity". В теге "unity" мы указываем namespace, assembly и aliasы для типов данных. Вроде очевидные вещи, но обратите внимание, что в namespace указываем пространство имён (UnityTest), а в assembly (UnityTest1) - имя сборки. Если не указывать два этих тега, то в alias для в атрибуте type обязательно нужно указывать имя сборки:&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;&amp;lt;alias alias="IPosition" type="UnityTest.IPosition, UnityTest1" /&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Алиасы нужны для удобства, указывать их тоже не обязательно; если их не указывать, то нужно указывать полное имя типа в тегах "register", которые соответствуют методу Register&amp;lt;TypeTType1, TType2&amp;gt;().&lt;br /&gt;Вот и все для начала. В следующем посте рассмотрим конфигурирование через xml injections.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5342535388237643243-4086764627295436020?l=sly-and-fluffy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sly-and-fluffy.blogspot.com/feeds/4086764627295436020/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://sly-and-fluffy.blogspot.com/2011/04/unity-20-xml.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/4086764627295436020'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/4086764627295436020'/><link rel='alternate' type='text/html' href='http://sly-and-fluffy.blogspot.com/2011/04/unity-20-xml.html' title='Конфигурируем Unity 2.0 через xml-файл'/><author><name>Tatiana Shemyakina</name><uri>https://profiles.google.com/115825956619949451947</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-4MfXIVcZdJA/AAAAAAAAAAI/AAAAAAAAAbA/Iv1Gt6j8YgI/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-n_s43s_Mkqc/TaNk-kYOIdI/AAAAAAAAAV4/__N0D7igigU/s72-c/1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5342535388237643243.post-3382272614913237645</id><published>2011-04-09T10:01:00.003+03:00</published><updated>2012-01-30T11:12:13.377+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='юмор'/><category scheme='http://www.blogger.com/atom/ns#' term='Разное'/><title type='text'>Велосипедность</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-cBkS7snLYUc/TaAEpQcAa-I/AAAAAAAAAV0/dnIqafUvYMA/s1600/624505_a-tyi-pridumal-svoj-sposob-delit-na-tselo.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="540" src="http://2.bp.blogspot.com/-cBkS7snLYUc/TaAEpQcAa-I/AAAAAAAAAV0/dnIqafUvYMA/s640/624505_a-tyi-pridumal-svoj-sposob-delit-na-tselo.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;a href="http://demotivators.ru/posters/624505/a-tyi-pridumal-svoj-sposob-delit-na-tselo.htm"&gt;&lt;br /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5342535388237643243-3382272614913237645?l=sly-and-fluffy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sly-and-fluffy.blogspot.com/feeds/3382272614913237645/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://sly-and-fluffy.blogspot.com/2011/04/blog-post.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/3382272614913237645'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/3382272614913237645'/><link rel='alternate' type='text/html' href='http://sly-and-fluffy.blogspot.com/2011/04/blog-post.html' title='Велосипедность'/><author><name>Tatiana Shemyakina</name><uri>https://profiles.google.com/115825956619949451947</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-4MfXIVcZdJA/AAAAAAAAAAI/AAAAAAAAAbA/Iv1Gt6j8YgI/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-cBkS7snLYUc/TaAEpQcAa-I/AAAAAAAAAV0/dnIqafUvYMA/s72-c/624505_a-tyi-pridumal-svoj-sposob-delit-na-tselo.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5342535388237643243.post-729969614904987519</id><published>2011-04-07T21:08:00.000+03:00</published><updated>2011-04-07T21:08:14.436+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='monodroid'/><category scheme='http://www.blogger.com/atom/ns#' term='.net'/><title type='text'>MonoDroid?</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-8L9k7jEnZxI/TZ35c0aFEWI/AAAAAAAAAVw/R9Xx6ICMiC0/s1600/mfa-pro.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-8L9k7jEnZxI/TZ35c0aFEWI/AAAAAAAAAVw/R9Xx6ICMiC0/s1600/mfa-pro.png" /&gt;&lt;/a&gt;&lt;/div&gt;Вышел &lt;a href="http://mono-android.net/"&gt;MonoDroid 1.0&lt;/a&gt;. Вещь для тех, кто хочет писать под Андроид, не слазя с .Net. Этот релиз богат следующим:&lt;br /&gt;&amp;nbsp;- разработка на .Net и C# для Android-планшетов и смартфонов&lt;br /&gt;- .NET-биндинги для Android API&lt;br /&gt;- публикация приложений в Android Market&lt;br /&gt;- интеграция с&amp;nbsp; Visual Studio 2010&lt;br /&gt;- Mono 2.10&lt;br /&gt;Удручает не бесплатность&amp;nbsp; MonoDroid.&lt;br /&gt;Больше о релизе - &lt;a href="http://tirania.org/blog/archive/2011/Apr-06.html"&gt;http://tirania.org/blog/archive/2011/Apr-06.html&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5342535388237643243-729969614904987519?l=sly-and-fluffy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sly-and-fluffy.blogspot.com/feeds/729969614904987519/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://sly-and-fluffy.blogspot.com/2011/04/monodroid.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/729969614904987519'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/729969614904987519'/><link rel='alternate' type='text/html' href='http://sly-and-fluffy.blogspot.com/2011/04/monodroid.html' title='MonoDroid?'/><author><name>Tatiana Shemyakina</name><uri>https://profiles.google.com/115825956619949451947</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-4MfXIVcZdJA/AAAAAAAAAAI/AAAAAAAAAbA/Iv1Gt6j8YgI/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-8L9k7jEnZxI/TZ35c0aFEWI/AAAAAAAAAVw/R9Xx6ICMiC0/s72-c/mfa-pro.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5342535388237643243.post-5991985256248321941</id><published>2011-03-25T23:14:00.003+02:00</published><updated>2011-03-26T08:29:59.976+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='unity'/><category scheme='http://www.blogger.com/atom/ns#' term='IoC'/><title type='text'>Setter injection with Unity 2.0</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Пример Setter injection&amp;nbsp;на Unity 2.0 (продолжая тему &lt;a href="http://sly-and-fluffy.blogspot.com/2011/03/constuctor-injection-with-unity-20.html"&gt;этого&lt;/a&gt; примера)&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;Имеется&amp;nbsp;интерфей IEmployee и класс Employee, его реализующий:&lt;br /&gt;&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;interface IEmployee&lt;br /&gt;{&lt;br /&gt;int Age { get; set; }&lt;br /&gt;string Name { get; set; }&lt;br /&gt;string Surname { get; set; }&lt;br /&gt;IPosition position { get; set; }&lt;br /&gt;string GetPosition();        &lt;br /&gt;}&lt;br /&gt;class Employee : IEmployee&lt;br /&gt;{        &lt;br /&gt;#region IPerson Members&lt;br /&gt;&lt;br /&gt;public int Age &lt;/code&gt;&lt;code class="prettyprint"&gt;{ get; set; }&lt;/code&gt;&lt;br /&gt;&lt;code class="prettyprint"&gt; &lt;br /&gt;public string Name &lt;/code&gt;&lt;code class="prettyprint"&gt;{ get; set; }&lt;/code&gt;&lt;br /&gt;&lt;code class="prettyprint"&gt; &lt;br /&gt;public string Surname &lt;/code&gt;&lt;code class="prettyprint"&gt;{ get; set; }&lt;/code&gt;&lt;br /&gt;&lt;code class="prettyprint"&gt; &lt;br /&gt;public IPosition position { get; set; }&lt;br /&gt;&lt;br /&gt;public String GetPosition()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;return position.Position;&lt;br /&gt;}&lt;br /&gt;#endregion&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;А так же есть интерфейс IPosition и набор классов, его реализующих:&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;public interface IPosition&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; string Position { get; }&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public class JustEmployee : IPosition&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public string Position { get { return "Just employee"; } }&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public class Manager : IPosition&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public string Position { get { return "Manager"; } }&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public class Boss : IPosition&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public string Position { get { return "Boss"; } }&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;/code&gt;&lt;/div&gt;Класс Employee имеет поле property, которое мы и будем инжектить:&lt;/div&gt;&lt;code class="prettyprint"&gt;&amp;gt;&lt;br /&gt;static void Main(string[] args)&lt;br /&gt;{            &lt;br /&gt;IUnityContainer unity = new UnityContainer();&lt;br /&gt;unity.RegisterType&amp;lt;IPosition, JustEmployee&amp;gt;()&lt;br /&gt;.RegisterType&amp;lt;IPosition, Manager&amp;gt;("Manager")&lt;br /&gt;.RegisterType&amp;lt;IPosition, Boss&amp;gt;("Boss")&lt;br /&gt;.RegisterType&amp;lt;IEmployee,Employee&amp;gt;( new InjectionProperty("position",  new ResolvedParameter&amp;lt;IPosition&amp;gt;()))&lt;br /&gt;.RegisterType&amp;lt;IEmployee, Employee&amp;gt;("Boss", new InjectionProperty("position",  new ResolvedParameter&amp;lt;IPosition&amp;gt;("Boss")))&lt;br /&gt;.RegisterType&amp;lt;IEmployee, Employee&amp;gt;("Manager", new InjectionProperty("position",  new ResolvedParameter&amp;lt;IPosition&amp;gt;("Manager")));&lt;br /&gt;&lt;br /&gt;List&amp;lt;iemployee&amp;gt; employees = new List&amp;lt;IEmployee&amp;gt;();            &lt;br /&gt;var emp = unity.Resolve&amp;lt;IEmployee&amp;gt;();&lt;br /&gt;emp.Name = "John";&lt;br /&gt;emp.Surname = "Malkovich";&lt;br /&gt;emp.Age = 35;&lt;br /&gt;employees.Add(emp);&lt;br /&gt;var manager = unity.Resolve&amp;lt;IEmployee&amp;gt;("Manager");&lt;br /&gt;manager.Age = 44;&lt;br /&gt;manager.Name = "Peter";&lt;br /&gt;manager.Surname = "Branch";&lt;br /&gt;employees.Add(manager);&lt;br /&gt;var boss = unity.Resolve&amp;lt;IEmployee&amp;gt;("Boss");&lt;br /&gt;boss.Name = "Bill";&lt;br /&gt;boss.Surname = "Millioner";&lt;br /&gt;boss.Age = 99;&lt;br /&gt;employees.Add(boss);                        &lt;br /&gt;foreach(var employee in employees)&lt;br /&gt;{&lt;br /&gt;Console.WriteLine("Person: " + employee.Name + " " + employee.Surname + ", " + employee.Age + ", " + employee.GetPosition());&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/div&gt;Запускаем, смотрим результат:&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://lh6.googleusercontent.com/-2QWXmpHOKZE/TY0GII-A9KI/AAAAAAAAAU4/BW3WD5pa49Q/s1600/unity_injection.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://lh6.googleusercontent.com/-2QWXmpHOKZE/TY0GII-A9KI/AAAAAAAAAU4/BW3WD5pa49Q/s1600/unity_injection.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5342535388237643243-5991985256248321941?l=sly-and-fluffy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sly-and-fluffy.blogspot.com/feeds/5991985256248321941/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://sly-and-fluffy.blogspot.com/2011/03/setter-injection-with-unity-20.html#comment-form' title='Комментарии: 3'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/5991985256248321941'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/5991985256248321941'/><link rel='alternate' type='text/html' href='http://sly-and-fluffy.blogspot.com/2011/03/setter-injection-with-unity-20.html' title='Setter injection with Unity 2.0'/><author><name>Tatiana Shemyakina</name><uri>https://profiles.google.com/115825956619949451947</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-4MfXIVcZdJA/AAAAAAAAAAI/AAAAAAAAAbA/Iv1Gt6j8YgI/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='https://lh6.googleusercontent.com/-2QWXmpHOKZE/TY0GII-A9KI/AAAAAAAAAU4/BW3WD5pa49Q/s72-c/unity_injection.png' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5342535388237643243.post-1534617525910518738</id><published>2011-03-25T18:35:00.001+02:00</published><updated>2011-03-25T18:38:15.501+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tools'/><title type='text'>Пакеры для .NET exe, dll</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://lh6.googleusercontent.com/-akdEt-pX9iw/TYzE3ClBoOI/AAAAAAAAAUw/haIW3QfoSwY/s1600/binary.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://lh6.googleusercontent.com/-akdEt-pX9iw/TYzE3ClBoOI/AAAAAAAAAUw/haIW3QfoSwY/s1600/binary.png" /&gt;&lt;/a&gt;&lt;/div&gt;Программы, позволяющие&amp;nbsp; сделать из exe и кучи приблудившихся dll один exe модуль:&lt;br /&gt;&lt;br /&gt;Стандартная от MS - ILMerge - &lt;a href="http://www.microsoft.com/downloads/en/details.aspx?FamilyID=22914587-b4ad-4eae-87cf-b14ae6a939b0&amp;amp;displaylang=en"&gt;http://www.microsoft.com/downloads/en/details.aspx?FamilyID=22914587-b4ad-4eae-87cf-b14ae6a939b0&amp;amp;displaylang=en&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;NETZ - &lt;a href="http://madebits.com/netz/index.php"&gt;http://madebits.com/netz/index.php&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Molebox - &lt;a href="http://www.molebox.com/"&gt;http://www.molebox.com/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Nbox - &lt;a href="http://nbox.codeplex.com/"&gt;http://nbox.codeplex.com/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5342535388237643243-1534617525910518738?l=sly-and-fluffy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sly-and-fluffy.blogspot.com/feeds/1534617525910518738/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://sly-and-fluffy.blogspot.com/2011/03/net-exe-dll.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/1534617525910518738'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/1534617525910518738'/><link rel='alternate' type='text/html' href='http://sly-and-fluffy.blogspot.com/2011/03/net-exe-dll.html' title='Пакеры для .NET exe, dll'/><author><name>Tatiana Shemyakina</name><uri>https://profiles.google.com/115825956619949451947</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-4MfXIVcZdJA/AAAAAAAAAAI/AAAAAAAAAbA/Iv1Gt6j8YgI/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='https://lh6.googleusercontent.com/-akdEt-pX9iw/TYzE3ClBoOI/AAAAAAAAAUw/haIW3QfoSwY/s72-c/binary.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5342535388237643243.post-8823062597341301291</id><published>2011-03-25T18:31:00.000+02:00</published><updated>2011-03-25T18:31:31.613+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='рефакторинг'/><category scheme='http://www.blogger.com/atom/ns#' term='разработка ПО'/><title type='text'>Рефакторинг - не панацея</title><content type='html'>Недавно мне попалась фраза&lt;br /&gt;&lt;blockquote&gt;Рефакторинг кода должен осуществляться до полного исчерпания его возможностей, поскольку наибольшая производительность может быть достигнута только в условиях работы с исходным кодом максимально высокого качества.&lt;/blockquote&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;  &lt;w:WordDocument&gt;   &lt;w:View&gt;Normal&lt;/w:View&gt;   &lt;w:Zoom&gt;0&lt;/w:Zoom&gt;   &lt;w:TrackMoves/&gt;   &lt;w:TrackFormatting/&gt;   &lt;w:PunctuationKerning/&gt;   &lt;w:ValidateAgainstSchemas/&gt;   &lt;w:SaveIfXMLInvalid&gt;false&lt;/w:SaveIfXMLInvalid&gt;   &lt;w:IgnoreMixedContent&gt;false&lt;/w:IgnoreMixedContent&gt;   &lt;w:AlwaysShowPlaceholderText&gt;false&lt;/w:AlwaysShowPlaceholderText&gt;   &lt;w:DoNotPromoteQF/&gt;   &lt;w:LidThemeOther&gt;RU&lt;/w:LidThemeOther&gt;   &lt;w:LidThemeAsian&gt;X-NONE&lt;/w:LidThemeAsian&gt;   &lt;w:LidThemeComplexScript&gt;X-NONE&lt;/w:LidThemeComplexScript&gt;   &lt;w:Compatibility&gt;    &lt;w:BreakWrappedTables/&gt;    &lt;w:SnapToGridInCell/&gt;    &lt;w:WrapTextWithPunct/&gt;    &lt;w:UseAsianBreakRules/&gt;    &lt;w:DontGrowAutofit/&gt;    &lt;w:SplitPgBreakAndParaMark/&gt;    &lt;w:DontVertAlignCellWithSp/&gt;    &lt;w:DontBreakConstrainedForcedTables/&gt;    &lt;w:DontVertAlignInTxbx/&gt;    &lt;w:Word11KerningPairs/&gt;    &lt;w:CachedColBalance/&gt;   &lt;/w:Compatibility&gt;   &lt;m:mathPr&gt;    &lt;m:mathFont m:val="Cambria Math"/&gt;    &lt;m:brkBin m:val="before"/&gt;    &lt;m:brkBinSub m:val="&amp;#45;-"/&gt;    &lt;m:smallFrac m:val="off"/&gt;    &lt;m:dispDef/&gt;    &lt;m:lMargin m:val="0"/&gt;    &lt;m:rMargin m:val="0"/&gt;    &lt;m:defJc m:val="centerGroup"/&gt;    &lt;m:wrapIndent m:val="1440"/&gt;    &lt;m:intLim m:val="subSup"/&gt;    &lt;m:naryLim m:val="undOvr"/&gt;   &lt;/m:mathPr&gt;&lt;/w:WordDocument&gt; &lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;  &lt;w:LatentStyles DefLockedState="false" DefUnhideWhenUsed="true"  DefSemiHidden="true" DefQFormat="false" DefPriority="99"  LatentStyleCount="267"&gt;   &lt;w:LsdException Locked="false" Priority="0" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="Normal"/&gt;   &lt;w:LsdException Locked="false" Priority="9" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="heading 1"/&gt;   &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 2"/&gt;   &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 3"/&gt;   &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 4"/&gt;   &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 5"/&gt;   &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 6"/&gt;   &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 7"/&gt;   &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 8"/&gt;   &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 9"/&gt;   &lt;w:LsdException Locked="false" Priority="39" Name="toc 1"/&gt;   &lt;w:LsdException Locked="false" Priority="39" Name="toc 2"/&gt;   &lt;w:LsdException Locked="false" Priority="39" Name="toc 3"/&gt;   &lt;w:LsdException Locked="false" Priority="39" Name="toc 4"/&gt;   &lt;w:LsdException Locked="false" Priority="39" Name="toc 5"/&gt;   &lt;w:LsdException Locked="false" Priority="39" Name="toc 6"/&gt;   &lt;w:LsdException Locked="false" Priority="39" Name="toc 7"/&gt;   &lt;w:LsdException Locked="false" Priority="39" Name="toc 8"/&gt;   &lt;w:LsdException Locked="false" Priority="39" Name="toc 9"/&gt;   &lt;w:LsdException Locked="false" Priority="35" QFormat="true" Name="caption"/&gt;   &lt;w:LsdException Locked="false" Priority="10" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="Title"/&gt;   &lt;w:LsdException Locked="false" Priority="1" Name="Default Paragraph Font"/&gt;   &lt;w:LsdException Locked="false" Priority="11" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="Subtitle"/&gt;   &lt;w:LsdException Locked="false" Priority="22" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="Strong"/&gt;   &lt;w:LsdException Locked="false" Priority="20" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="Emphasis"/&gt;   &lt;w:LsdException Locked="false" Priority="59" SemiHidden="false"   UnhideWhenUsed="false" Name="Table Grid"/&gt;   &lt;w:LsdException Locked="false" UnhideWhenUsed="false" Name="Placeholder Text"/&gt;   &lt;w:LsdException Locked="false" Priority="1" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="No Spacing"/&gt;   &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Shading"/&gt;   &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"   UnhideWhenUsed="false" Name="Light List"/&gt;   &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Grid"/&gt;   &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 1"/&gt;   &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 2"/&gt;   &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 1"/&gt;   &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 2"/&gt;   &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 1"/&gt;   &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 2"/&gt;   &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 3"/&gt;   &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"   UnhideWhenUsed="false" Name="Dark List"/&gt;   &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Shading"/&gt;   &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful List"/&gt;   &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Grid"/&gt;   &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Shading Accent 1"/&gt;   &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"   UnhideWhenUsed="false" Name="Light List Accent 1"/&gt;   &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Grid Accent 1"/&gt;   &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 1"/&gt;   &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 1"/&gt;   &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 1 Accent 1"/&gt;   &lt;w:LsdException Locked="false" UnhideWhenUsed="false" Name="Revision"/&gt;   &lt;w:LsdException Locked="false" Priority="34" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="List Paragraph"/&gt;   &lt;w:LsdException Locked="false" Priority="29" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="Quote"/&gt;   &lt;w:LsdException Locked="false" Priority="30" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="Intense Quote"/&gt;   &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 2 Accent 1"/&gt;   &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 1"/&gt;   &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 1"/&gt;   &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 1"/&gt;   &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"   UnhideWhenUsed="false" Name="Dark List Accent 1"/&gt;   &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Shading Accent 1"/&gt;   &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful List Accent 1"/&gt;   &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Grid Accent 1"/&gt;   &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Shading Accent 2"/&gt;   &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"   UnhideWhenUsed="false" Name="Light List Accent 2"/&gt;   &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Grid Accent 2"/&gt;   &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 2"/&gt;   &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 2"/&gt;   &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 1 Accent 2"/&gt;   &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 2 Accent 2"/&gt;   &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 2"/&gt;   &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 2"/&gt;   &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 2"/&gt;   &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"   UnhideWhenUsed="false" Name="Dark List Accent 2"/&gt;   &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Shading Accent 2"/&gt;   &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful List Accent 2"/&gt;   &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Grid Accent 2"/&gt;   &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Shading Accent 3"/&gt;   &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"   UnhideWhenUsed="false" Name="Light List Accent 3"/&gt;   &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Grid Accent 3"/&gt;   &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 3"/&gt;   &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 3"/&gt;   &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 1 Accent 3"/&gt;   &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 2 Accent 3"/&gt;   &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 3"/&gt;   &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 3"/&gt;   &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 3"/&gt;   &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"   UnhideWhenUsed="false" Name="Dark List Accent 3"/&gt;   &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Shading Accent 3"/&gt;   &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful List Accent 3"/&gt;   &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Grid Accent 3"/&gt;   &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Shading Accent 4"/&gt;   &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"   UnhideWhenUsed="false" Name="Light List Accent 4"/&gt;   &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Grid Accent 4"/&gt;   &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 4"/&gt;   &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 4"/&gt;   &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 1 Accent 4"/&gt;   &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 2 Accent 4"/&gt;   &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 4"/&gt;   &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 4"/&gt;   &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 4"/&gt;   &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"   UnhideWhenUsed="false" Name="Dark List Accent 4"/&gt;   &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Shading Accent 4"/&gt;   &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful List Accent 4"/&gt;   &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Grid Accent 4"/&gt;   &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Shading Accent 5"/&gt;   &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"   UnhideWhenUsed="false" Name="Light List Accent 5"/&gt;   &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Grid Accent 5"/&gt;   &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 5"/&gt;   &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 5"/&gt;   &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 1 Accent 5"/&gt;   &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 2 Accent 5"/&gt;   &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 5"/&gt;   &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 5"/&gt;   &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 5"/&gt;   &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"   UnhideWhenUsed="false" Name="Dark List Accent 5"/&gt;   &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Shading Accent 5"/&gt;   &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful List Accent 5"/&gt;   &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Grid Accent 5"/&gt;   &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Shading Accent 6"/&gt;   &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"   UnhideWhenUsed="false" Name="Light List Accent 6"/&gt;   &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Grid Accent 6"/&gt;   &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 6"/&gt;   &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 6"/&gt;   &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 1 Accent 6"/&gt;   &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 2 Accent 6"/&gt;   &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 6"/&gt;   &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 6"/&gt;   &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 6"/&gt;   &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"   UnhideWhenUsed="false" Name="Dark List Accent 6"/&gt;   &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Shading Accent 6"/&gt;   &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful List Accent 6"/&gt;   &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Grid Accent 6"/&gt;   &lt;w:LsdException Locked="false" Priority="19" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="Subtle Emphasis"/&gt;   &lt;w:LsdException Locked="false" Priority="21" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="Intense Emphasis"/&gt;   &lt;w:LsdException Locked="false" Priority="31" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="Subtle Reference"/&gt;   &lt;w:LsdException Locked="false" Priority="32" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="Intense Reference"/&gt;   &lt;w:LsdException Locked="false" Priority="33" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="Book Title"/&gt;   &lt;w:LsdException Locked="false" Priority="37" Name="Bibliography"/&gt;   &lt;w:LsdException Locked="false" Priority="39" QFormat="true" Name="TOC Heading"/&gt;  &lt;/w:LatentStyles&gt; &lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 10]&gt; &lt;style&gt; /* Style Definitions */ table.MsoNormalTable {mso-style-name:"Обычная таблица"; mso-tstyle-rowband-size:0; mso-tstyle-colband-size:0; mso-style-noshow:yes; mso-style-priority:99; mso-style-qformat:yes; mso-style-parent:""; mso-padding-alt:0cm 5.4pt 0cm 5.4pt; mso-para-margin-top:0cm; mso-para-margin-right:0cm; mso-para-margin-bottom:10.0pt; mso-para-margin-left:0cm; line-height:115%; mso-pagination:widow-orphan; font-size:11.0pt; font-family:"Calibri","sans-serif"; mso-ascii-font-family:Calibri; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:"Times New Roman"; mso-fareast-theme-font:minor-fareast; mso-hansi-font-family:Calibri; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi;}&lt;/style&gt; &lt;![endif]--&gt;  &lt;!--[if gte mso 9]&gt;&lt;xml&gt;  &lt;w:WordDocument&gt;   &lt;w:View&gt;Normal&lt;/w:View&gt;   &lt;w:Zoom&gt;0&lt;/w:Zoom&gt;   &lt;w:TrackMoves/&gt;   &lt;w:TrackFormatting/&gt;   &lt;w:PunctuationKerning/&gt;   &lt;w:ValidateAgainstSchemas/&gt;   &lt;w:SaveIfXMLInvalid&gt;false&lt;/w:SaveIfXMLInvalid&gt;   &lt;w:IgnoreMixedContent&gt;false&lt;/w:IgnoreMixedContent&gt;   &lt;w:AlwaysShowPlaceholderText&gt;false&lt;/w:AlwaysShowPlaceholderText&gt;   &lt;w:DoNotPromoteQF/&gt;   &lt;w:LidThemeOther&gt;RU&lt;/w:LidThemeOther&gt;   &lt;w:LidThemeAsian&gt;X-NONE&lt;/w:LidThemeAsian&gt;   &lt;w:LidThemeComplexScript&gt;X-NONE&lt;/w:LidThemeComplexScript&gt;   &lt;w:Compatibility&gt;    &lt;w:BreakWrappedTables/&gt;    &lt;w:SnapToGridInCell/&gt;    &lt;w:WrapTextWithPunct/&gt;    &lt;w:UseAsianBreakRules/&gt;    &lt;w:DontGrowAutofit/&gt;    &lt;w:SplitPgBreakAndParaMark/&gt;    &lt;w:DontVertAlignCellWithSp/&gt;    &lt;w:DontBreakConstrainedForcedTables/&gt;    &lt;w:DontVertAlignInTxbx/&gt;    &lt;w:Word11KerningPairs/&gt;    &lt;w:CachedColBalance/&gt;   &lt;/w:Compatibility&gt;   &lt;m:mathPr&gt;    &lt;m:mathFont m:val="Cambria Math"/&gt;    &lt;m:brkBin m:val="before"/&gt;    &lt;m:brkBinSub m:val="&amp;#45;-"/&gt;    &lt;m:smallFrac m:val="off"/&gt;    &lt;m:dispDef/&gt;    &lt;m:lMargin m:val="0"/&gt;    &lt;m:rMargin m:val="0"/&gt;    &lt;m:defJc m:val="centerGroup"/&gt;    &lt;m:wrapIndent m:val="1440"/&gt;    &lt;m:intLim m:val="subSup"/&gt;    &lt;m:naryLim m:val="undOvr"/&gt;   &lt;/m:mathPr&gt;&lt;/w:WordDocument&gt; &lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;  &lt;w:LatentStyles DefLockedState="false" DefUnhideWhenUsed="true"  DefSemiHidden="true" DefQFormat="false" DefPriority="99"  LatentStyleCount="267"&gt;   &lt;w:LsdException Locked="false" Priority="0" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="Normal"/&gt;   &lt;w:LsdException Locked="false" Priority="9" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="heading 1"/&gt;   &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 2"/&gt;   &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 3"/&gt;   &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 4"/&gt;   &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 5"/&gt;   &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 6"/&gt;   &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 7"/&gt;   &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 8"/&gt;   &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 9"/&gt;   &lt;w:LsdException Locked="false" Priority="39" Name="toc 1"/&gt;   &lt;w:LsdException Locked="false" Priority="39" Name="toc 2"/&gt;   &lt;w:LsdException Locked="false" Priority="39" Name="toc 3"/&gt;   &lt;w:LsdException Locked="false" Priority="39" Name="toc 4"/&gt;   &lt;w:LsdException Locked="false" Priority="39" Name="toc 5"/&gt;   &lt;w:LsdException Locked="false" Priority="39" Name="toc 6"/&gt;   &lt;w:LsdException Locked="false" Priority="39" Name="toc 7"/&gt;   &lt;w:LsdException Locked="false" Priority="39" Name="toc 8"/&gt;   &lt;w:LsdException Locked="false" Priority="39" Name="toc 9"/&gt;   &lt;w:LsdException Locked="false" Priority="35" QFormat="true" Name="caption"/&gt;   &lt;w:LsdException Locked="false" Priority="10" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="Title"/&gt;   &lt;w:LsdException Locked="false" Priority="1" Name="Default Paragraph Font"/&gt;   &lt;w:LsdException Locked="false" Priority="11" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="Subtitle"/&gt;   &lt;w:LsdException Locked="false" Priority="22" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="Strong"/&gt;   &lt;w:LsdException Locked="false" Priority="20" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="Emphasis"/&gt;   &lt;w:LsdException Locked="false" Priority="59" SemiHidden="false"   UnhideWhenUsed="false" Name="Table Grid"/&gt;   &lt;w:LsdException Locked="false" UnhideWhenUsed="false" Name="Placeholder Text"/&gt;   &lt;w:LsdException Locked="false" Priority="1" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="No Spacing"/&gt;   &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Shading"/&gt;   &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"   UnhideWhenUsed="false" Name="Light List"/&gt;   &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Grid"/&gt;   &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 1"/&gt;   &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 2"/&gt;   &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 1"/&gt;   &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 2"/&gt;   &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 1"/&gt;   &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 2"/&gt;   &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 3"/&gt;   &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"   UnhideWhenUsed="false" Name="Dark List"/&gt;   &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Shading"/&gt;   &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful List"/&gt;   &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Grid"/&gt;   &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Shading Accent 1"/&gt;   &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"   UnhideWhenUsed="false" Name="Light List Accent 1"/&gt;   &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Grid Accent 1"/&gt;   &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 1"/&gt;   &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 1"/&gt;   &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 1 Accent 1"/&gt;   &lt;w:LsdException Locked="false" UnhideWhenUsed="false" Name="Revision"/&gt;   &lt;w:LsdException Locked="false" Priority="34" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="List Paragraph"/&gt;   &lt;w:LsdException Locked="false" Priority="29" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="Quote"/&gt;   &lt;w:LsdException Locked="false" Priority="30" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="Intense Quote"/&gt;   &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 2 Accent 1"/&gt;   &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 1"/&gt;   &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 1"/&gt;   &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 1"/&gt;   &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"   UnhideWhenUsed="false" Name="Dark List Accent 1"/&gt;   &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Shading Accent 1"/&gt;   &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful List Accent 1"/&gt;   &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Grid Accent 1"/&gt;   &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Shading Accent 2"/&gt;   &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"   UnhideWhenUsed="false" Name="Light List Accent 2"/&gt;   &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Grid Accent 2"/&gt;   &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 2"/&gt;   &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 2"/&gt;   &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 1 Accent 2"/&gt;   &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 2 Accent 2"/&gt;   &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 2"/&gt;   &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 2"/&gt;   &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 2"/&gt;   &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"   UnhideWhenUsed="false" Name="Dark List Accent 2"/&gt;   &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Shading Accent 2"/&gt;   &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful List Accent 2"/&gt;   &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Grid Accent 2"/&gt;   &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Shading Accent 3"/&gt;   &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"   UnhideWhenUsed="false" Name="Light List Accent 3"/&gt;   &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Grid Accent 3"/&gt;   &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 3"/&gt;   &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 3"/&gt;   &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 1 Accent 3"/&gt;   &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 2 Accent 3"/&gt;   &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 3"/&gt;   &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 3"/&gt;   &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 3"/&gt;   &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"   UnhideWhenUsed="false" Name="Dark List Accent 3"/&gt;   &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Shading Accent 3"/&gt;   &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful List Accent 3"/&gt;   &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Grid Accent 3"/&gt;   &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Shading Accent 4"/&gt;   &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"   UnhideWhenUsed="false" Name="Light List Accent 4"/&gt;   &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Grid Accent 4"/&gt;   &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 4"/&gt;   &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 4"/&gt;   &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 1 Accent 4"/&gt;   &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 2 Accent 4"/&gt;   &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 4"/&gt;   &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 4"/&gt;   &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 4"/&gt;   &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"   UnhideWhenUsed="false" Name="Dark List Accent 4"/&gt;   &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Shading Accent 4"/&gt;   &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful List Accent 4"/&gt;   &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Grid Accent 4"/&gt;   &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Shading Accent 5"/&gt;   &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"   UnhideWhenUsed="false" Name="Light List Accent 5"/&gt;   &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Grid Accent 5"/&gt;   &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 5"/&gt;   &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 5"/&gt;   &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 1 Accent 5"/&gt;   &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 2 Accent 5"/&gt;   &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 5"/&gt;   &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 5"/&gt;   &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 5"/&gt;   &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"   UnhideWhenUsed="false" Name="Dark List Accent 5"/&gt;   &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Shading Accent 5"/&gt;   &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful List Accent 5"/&gt;   &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Grid Accent 5"/&gt;   &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Shading Accent 6"/&gt;   &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"   UnhideWhenUsed="false" Name="Light List Accent 6"/&gt;   &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Grid Accent 6"/&gt;   &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 6"/&gt;   &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 6"/&gt;   &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 1 Accent 6"/&gt;   &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 2 Accent 6"/&gt;   &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 6"/&gt;   &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 6"/&gt;   &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 6"/&gt;   &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"   UnhideWhenUsed="false" Name="Dark List Accent 6"/&gt;   &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Shading Accent 6"/&gt;   &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful List Accent 6"/&gt;   &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Grid Accent 6"/&gt;   &lt;w:LsdException Locked="false" Priority="19" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="Subtle Emphasis"/&gt;   &lt;w:LsdException Locked="false" Priority="21" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="Intense Emphasis"/&gt;   &lt;w:LsdException Locked="false" Priority="31" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="Subtle Reference"/&gt;   &lt;w:LsdException Locked="false" Priority="32" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="Intense Reference"/&gt;   &lt;w:LsdException Locked="false" Priority="33" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="Book Title"/&gt;   &lt;w:LsdException Locked="false" Priority="37" Name="Bibliography"/&gt;   &lt;w:LsdException Locked="false" Priority="39" QFormat="true" Name="TOC Heading"/&gt;  &lt;/w:LatentStyles&gt; &lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 10]&gt; &lt;style&gt; /* Style Definitions */ table.MsoNormalTable {mso-style-name:"Обычная таблица"; mso-tstyle-rowband-size:0; mso-tstyle-colband-size:0; mso-style-noshow:yes; mso-style-priority:99; mso-style-qformat:yes; mso-style-parent:""; mso-padding-alt:0cm 5.4pt 0cm 5.4pt; mso-para-margin-top:0cm; mso-para-margin-right:0cm; mso-para-margin-bottom:10.0pt; mso-para-margin-left:0cm; line-height:115%; mso-pagination:widow-orphan; font-size:11.0pt; font-family:"Calibri","sans-serif"; mso-ascii-font-family:Calibri; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:"Times New Roman"; mso-fareast-theme-font:minor-fareast; mso-hansi-font-family:Calibri; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi;}&lt;/style&gt; &lt;![endif]--&gt;  &lt;br /&gt;А так ли это? Попахивает&amp;nbsp; фанатизмом.&lt;br /&gt;&lt;br /&gt;Насколько б рефакторинг не был полезной техникой, нужно понимать, что рефакторинг - это не панацея. Сколько не переименовывай названия методов и переменных, если архитектура кода из разряда "а всё, что плохо держится, мы подопрем деревянными распорками" (из байки "Если б программисты строили дома"), то лучше она от этого не станет. Проектирование ПО плюс постоянный рефакторинг при написании кода – это сильная связка. Плохо спроектированную систему будет трудно рефакторить – есть где разгуляться, да понять бы, за что сначала взяться - рефакторинг будет перекраивать ее, и, если браться за это, то явно не перед сдачей проекта проекта – это не то, на что следует тратить время. «Приближение срока окончания работ – единственный случай, когда можно отложить рефакториг, ссылаясь на недостаток времени.» - говорит М. Фаулер («Рефакторинг. Улучшение существующиего кода»). &lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;Но не стоит злоупотреблять этой техникой и в мирные времена, когда срок сдачи еще не близок, а руки чешутся что-нибудь переиначить. Рефакторинг кода к шаблонам может иметь не только положительные стороны, но и отрицательные, например, тотальное усложнение кода. Как и любой техникой, рефакторингом нужно использовать с умом. И вообще, ум нужно использовать, это тоже полезная техника ;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5342535388237643243-8823062597341301291?l=sly-and-fluffy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sly-and-fluffy.blogspot.com/feeds/8823062597341301291/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://sly-and-fluffy.blogspot.com/2011/03/blog-post_25.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/8823062597341301291'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/8823062597341301291'/><link rel='alternate' type='text/html' href='http://sly-and-fluffy.blogspot.com/2011/03/blog-post_25.html' title='Рефакторинг - не панацея'/><author><name>Tatiana Shemyakina</name><uri>https://profiles.google.com/115825956619949451947</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-4MfXIVcZdJA/AAAAAAAAAAI/AAAAAAAAAbA/Iv1Gt6j8YgI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5342535388237643243.post-8988465644281654968</id><published>2011-03-18T23:05:00.004+02:00</published><updated>2011-03-26T08:29:21.380+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='unity'/><category scheme='http://www.blogger.com/atom/ns#' term='IoC'/><title type='text'>Constuctor injection with Unity 2.0</title><content type='html'>Пример Constructor Injection на Unity 2.0.&lt;br /&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;Пусть есть интерфейс IEmployee и класс, его реализующий:&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;interface IEmployee&lt;br /&gt;{&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int Age { get; set; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; string Name { get; set; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; string Surname { get; set; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; string GetPosition();&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;} &lt;br /&gt;class Employee : IEmployee&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #region IPerson Members&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public int Age { get ;&amp;nbsp; set ; }&lt;/code&gt;&lt;br /&gt;&lt;code class="prettyprint"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public string Name&amp;nbsp; { get ;&amp;nbsp; set ; &amp;nbsp; }&lt;/code&gt;&lt;br /&gt;&lt;code class="prettyprint"&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public string Surname&amp;nbsp;&amp;nbsp; { get; set;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public String GetPosition()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return position.Position;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #endregion&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IPosition position;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public Employee(IPosition _position)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; position = _position;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/code&gt;&lt;a class="cssButton" href="javascript:void(0)" id="publishButton" onclick="if (this.className.indexOf(&amp;quot;ubtn-disabled&amp;quot;) == -1) {var e = document['postingForm'].publish;(e.length) ? e[0].click() : e.click(); if (window.event) window.event.cancelBubble = true; return false;}" target=""&gt;&lt;/a&gt;&lt;br /&gt;&lt;div class="cssButtonOuter"&gt;&lt;div class="cssButtonMiddle"&gt;&lt;div class="cssButtonInner"&gt;&lt;a class="cssButton" href="javascript:void(0)" id="publishButton" onclick="if (this.className.indexOf(&amp;quot;ubtn-disabled&amp;quot;) == -1) {var e = document['postingForm'].publish;(e.length) ? e[0].click() : e.click(); if (window.event) window.event.cancelBubble = true; return false;}" target=""&gt;Опубликовать сообщение&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;А так же есть интерфейс IPosition и набор классов, его реализующих:&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;public interface IPosition&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; string Position { get; }&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public class JustEmployee : IPosition&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public string Position { get { return "Just employee"; } }&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public class Manager : IPosition&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public string Position { get { return "Manager"; } }&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public class Boss : IPosition&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public string Position { get { return "Boss"; } }&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;По названию легко догадаться, что IPosition представляет должность работника. Класс Employee имеет конструктор с параметром IPosition. Пример создания Employee с аргументом(IPosition) нужного типа с помощью Unity:&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;static void Main(string[] args)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IUnityContainer unity = new UnityContainer();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; unity.RegisterType&amp;lt;IPosition, JustEmployee&amp;gt;()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .RegisterType&amp;lt;IPosition, Manager&amp;gt;("Manager")&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .RegisterType&amp;lt;IPosition, Boss&amp;gt;("Boss")&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .RegisterType&amp;lt;IEmployee,Employee&amp;gt;(new InjectionConstructor(typeof(IPosition)))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .RegisterType&amp;lt;IEmployee,Employee&amp;gt;("Boss", new InjectionConstructor(typeof(Boss)))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .RegisterType&amp;lt;IEmployee,Employee&amp;gt;("Manager", new InjectionConstructor(typeof(Manager)));&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; List&lt;iemployee&gt; employees = new List&amp;lt;IEmployee&amp;gt;();&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var emp = unity.Resolve&amp;lt;IEmployee&amp;gt;();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; emp.Name = "John";&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; emp.Surname = "Malkovich";&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; emp.Age = 35;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; employees.Add(emp);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var manager = unity.Resolve&amp;lt;IEmployee&amp;gt;("Manager");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; manager.Age = 44;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; manager.Name = "Peter";&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; manager.Surname = "Branch";&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; employees.Add(manager);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var boss = unity.Resolve&amp;lt;IEmployee&amp;gt;("Boss");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; boss.Name = "Bill";&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; boss.Surname = "Millioner";&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; boss.Age = 99;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; employees.Add(boss);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach(var employee in employees)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine("Person: " + employee.Name + " " + employee.Surname + ", " + employee.Age + ", " + employee.GetPosition());&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;/iemployee&gt;&lt;/code&gt;&lt;br /&gt;Имеем:&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://lh6.googleusercontent.com/-6fnEl1rnoeA/TYPHaxOTpVI/AAAAAAAAAUs/FIsWQ-vlgYQ/s1600/unity_constructor_injection.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://lh6.googleusercontent.com/-6fnEl1rnoeA/TYPHaxOTpVI/AAAAAAAAAUs/FIsWQ-vlgYQ/s1600/unity_constructor_injection.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5342535388237643243-8988465644281654968?l=sly-and-fluffy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sly-and-fluffy.blogspot.com/feeds/8988465644281654968/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://sly-and-fluffy.blogspot.com/2011/03/constuctor-injection-with-unity-20.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/8988465644281654968'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/8988465644281654968'/><link rel='alternate' type='text/html' href='http://sly-and-fluffy.blogspot.com/2011/03/constuctor-injection-with-unity-20.html' title='Constuctor injection with Unity 2.0'/><author><name>Tatiana Shemyakina</name><uri>https://profiles.google.com/115825956619949451947</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-4MfXIVcZdJA/AAAAAAAAAAI/AAAAAAAAAbA/Iv1Gt6j8YgI/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='https://lh6.googleusercontent.com/-6fnEl1rnoeA/TYPHaxOTpVI/AAAAAAAAAUs/FIsWQ-vlgYQ/s72-c/unity_constructor_injection.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5342535388237643243.post-2532075515717209312</id><published>2011-03-10T01:16:00.010+02:00</published><updated>2011-03-14T14:13:21.893+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='разработка ПО'/><category scheme='http://www.blogger.com/atom/ns#' term='обфускация'/><title type='text'>Прелести байткода или зачем нужен обфускатор</title><content type='html'>Прекрасная идея портируемости приложений, кроссплатформенности родила языки, использующие виртуальные машины, компилирующие промежуточный платформенно-независимый код (байт-код) в платформенно-специфичный код. Яркие примеры таких языков - Java, C#, VB, ActionScript etc. История, которую я хочу рассказать, будет именно о последнем, но общие моменты касаются всех языков, компилирующихся в промежуточный код.&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;Учеба - такое дело.... Экзамены - не самая любимая часть учебы :) И преподаватель решил устроить тесты. А тесты были хитрые. У него была оболочка на Adobe AIR, а вопросы к тестам брались из шифрованного xml файла ( более 600 вопросов). Для сдачи экзамена выбиралось 30 вопросов, менялись местами варианты ответов, чтобы студенты не могли механически вычислить, где какой правильный ответ. Надо было что-то делать. Удалось раздобыть оболочку. Что ж, здорово. Оказалось, что эйр - это обычный zip-архив. Распаковав его, обнаружилась&amp;nbsp; file.swf, который вызвал дикое желание декомпильнуть его :) &lt;a href="http://www.google.com/search?q=%D0%B4%D0%B5%D0%BA%D0%BE%D0%BC%D0%BF%D0%B8%D0%BB%D1%8F%D1%82%D0%BE%D1%80+swf"&gt;Гуглим&lt;/a&gt; Выбираем декомпилятор, открываем файл и ... как разработчика меня огорчило увиденное. Как злостного сообщника студентов-лодырей - порадовало. Чистый, ничем не тронутый ActionScript. Логика выбора вопросов из файла, перемешивания вариантов ответов, криптование и декриптование файла вопросов, подсчет реузльтатов...&amp;nbsp; Даже контрольный пример для криптора имелся в коде, что позволило написать тест для декриптора (декриптор на С#):&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;[Fact]&lt;br /&gt;public static void DectriptString_Test(){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var k1 = "x73bvs";&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var k2 = "ma";&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var k3 = "qrx9v";&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var loc1 = new XorDecriptor(&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; k1 + k1.Length.ToString() + "XQAWDbsd7%#jsd"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; + k2 + k2.Length.ToString() + "gyVsd34R$sd"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; + k3 + k3.Length.ToString() + "jhJLwNe@$gaSd" &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; + (k1.Length * k2.Length + k3.Length + 23).ToString()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; );&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var loc2 = "4X%5D%06%19%1D%161%22arg%03S%07VUJ%1EE@%0C%0D%12%08%1Fv4%16VU%12PS%26%03%1B%0CX%1F%14%04";&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; loc2 = loc1.xor_unescape(loc2);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Assert.Equal("London is %#a capit6$al of Grea@t Britai!n", loc2);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Обратите внимание, все строки, использующиеся при инициализации декриптора, хранились в коде в открытом виде. Для дешифровки файла с вопросами к тесту используется пароль из трех частей (k1, k2, k3). Правильность пароля проверяется приведенным выше тестом.&lt;br /&gt;Вот такие пироги. Чем мог помочь обфускатор? Обфускация - процесс затруднения анализа исходного кода. Среди методик обфускации есть сокрытие строк, переименование методов, классов и тд - применил бы разработчик хоть что-то из этого и хоть как-то да усложнил и запутал злостных взломщиков. При правильном подходе можно было вобще сделать код нечитабельным. Нужно хоть как-то защищать свой труд.&lt;br /&gt;Как-то при просмотре .net сборки в декомпиляторе попался не менее замечательный кусок кода:&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;static private string BuildConnectionString(string path)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return ("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + path + ";User Id=Admin;Jet OLEDB:Database Password=securepasswrd1023!");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Не знаю, насколько трудно написать хотя бы так:&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;static private string BuildConnectionString(string path)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return ("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + path + ";User Id="+Encoding.Default.GetString( Convert.FromBase64String("QWRtaW4=") )+";Jet OLEDB:Database Password=&lt;/code&gt;&lt;code class="prettyprint"&gt;"+Encoding.Default.GetString( Convert.FromBase64String("c2VjdXJlcGFzc3dyZDEwMjMh")&lt;/code&gt;&lt;code class="prettyprint"&gt;));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;А еще можно строки, &lt;a href="http://www.wsite.in.ua/pages/strbase64converter.html"&gt;предварительно отконвертированные в Base64&lt;/a&gt;, в ресурсы запрятать. А еще... Вариантов много, главное, не хранить в открытом виде такую информацию. Но, к сожалению, и такое встречается. &lt;br /&gt;Полезные ссылки:&lt;br /&gt;&lt;a href="http://habrahabr.ru/blogs/Flash_Platform/110686/"&gt;Способы защиты Flash-приложений&lt;/a&gt;&lt;br /&gt;&lt;a href="http://habrahabr.ru/blogs/net/97062/"&gt;Статья на хабре про обфускаторы для .net&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5342535388237643243-2532075515717209312?l=sly-and-fluffy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sly-and-fluffy.blogspot.com/feeds/2532075515717209312/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://sly-and-fluffy.blogspot.com/2011/03/blog-post_10.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/2532075515717209312'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/2532075515717209312'/><link rel='alternate' type='text/html' href='http://sly-and-fluffy.blogspot.com/2011/03/blog-post_10.html' title='Прелести байткода или зачем нужен обфускатор'/><author><name>Tatiana Shemyakina</name><uri>https://profiles.google.com/115825956619949451947</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-4MfXIVcZdJA/AAAAAAAAAAI/AAAAAAAAAbA/Iv1Gt6j8YgI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5342535388237643243.post-7007049327505254287</id><published>2011-03-09T23:56:00.009+02:00</published><updated>2011-03-10T11:46:58.436+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='разработка ПО'/><category scheme='http://www.blogger.com/atom/ns#' term='Разное'/><title type='text'>История одного приложения</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://lh4.googleusercontent.com/-TdxalSa35xM/TXiX4wjE3eI/AAAAAAAAAUI/iH7iN2fMMGA/s1600/SF15-2090.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="https://lh4.googleusercontent.com/-TdxalSa35xM/TXiX4wjE3eI/AAAAAAAAAUI/iH7iN2fMMGA/s200/SF15-2090.jpg" width="150" /&gt;&lt;/a&gt;&lt;/div&gt;История эта началась давно, в те времена, когда деревья были высокими и трава зеленее, да и &lt;a href="http://www.italia-ru.it/forums/2009/11/07/ranshe-ne-tolko-trava-byla-zelenee-makarony-nazyvalis-pravilno"&gt;макароны назывались правильно&lt;/a&gt; ... И была поставлена задача - написать простенькое приложеньице, дополнение к главной программе, состоящее буквально из одной формы. &lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;Задача приложения была в том, чтобы записывать в БД главного приложения следующее: сколько конкретный работник потратил времени на&amp;nbsp; выполнение конкретной задачи с известной стоимостью (цена в час) для определенного клиента. Данные (клиент (Cusotmer), исполнитель (Supplier), сервис (Task), цена) брались из БД главного приложения. Что может быть проще? На форму были накиданы контролы, к контролам привязаны события - вуаля! Работает, готово.&lt;br /&gt;Тут заказчик говорит: "Да, здорово, но еще здоровее будет, если можно будет изменять путь к БД главного приложения!" Да не проблема! Вот еще одна кнопочка, диалог, файл с сеттингами - всё работает! На этом этапе развития приложение состоит из...из... трудно сказать для такого "масштабного" приложения. Одна форма, пара кнопок - зачем заморачиваться и что-то выделять? В коде формы нет sql-кода, и на этом спасибо :) За работу с БД отвечает статический класс DBManager:&lt;code class="prettyprint"&gt;&lt;br /&gt;static class DBManager{&lt;br /&gt;public static IList&amp;lt;Customers&amp;gt; GetCustomers() {...}&lt;br /&gt;public static IList&amp;lt;supplier&amp;gt; GetSuppliers() {...}&lt;br /&gt;public static IList&amp;lt;Task&amp;gt; GetTasks() {...}&lt;br /&gt;...&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Разработчик рад - работает, заказчик рад - работает! В данном раунде скорость (лень) победила качество.&lt;br /&gt;Проходит время и ... "Общую стоимость нужно вычислять по-другому! " - говорит заказчик. - "Общая стоимость может включать в себя налог или нет в зависимости от типа компании!"&amp;nbsp; Разработчик открывает код класса Task, добавляет private member companyType, которую инициализирует в конструкторе класса, находит метод GetTotalPrice() и пишет:&lt;code class="prettyprint"&gt;&lt;br /&gt;if ( CompanyType.Brutto == companyType) { CalculateBruttoPrice();} else {CalculateNettoPrice();}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Но тут на подстанции сгорает трансформатор, и гаснет свет, и весь вышеприведенный код исчезает, не сохранившись на ограниченных просторах жесткого диска.&lt;br /&gt;На следующий день разработчик еще раз прочитал требования заказчика, и выделил интерфейс ITask, создал базовый абстрактный класс BaseTask и конечные классы BruttoTask и NettoTask, различающиеся только механизмом расчета итоговой стоимости и налога:&lt;br /&gt;&lt;code class="prettyprint"&gt; interface ITask {&lt;br /&gt;&amp;nbsp;&amp;nbsp; ...&lt;br /&gt;&amp;nbsp;&amp;nbsp; double GetTotalPrice();&lt;br /&gt;&amp;nbsp;&amp;nbsp; double GetTotalTax(); &lt;br /&gt;}&lt;br /&gt;/*когда стоимость налога включена в цену*/&lt;br /&gt;class BruttoTask : BaseTask, ITask {&lt;br /&gt;public double GetTotalPrice(){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; retrun Amount * Price;&lt;br /&gt;}&lt;br /&gt;public double GetTotalTax(){&lt;br /&gt;&amp;nbsp;&amp;nbsp; var hundrendPercentsPlusTax = 100 + TaxPercentage;&lt;br /&gt;&amp;nbsp;&amp;nbsp; return (GetTotalPrice() * TaxPercentage / hundrendPercentsPlusTax);&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;/*когда стоимость налога не включена в цену*/&lt;br /&gt;class NettoTask : BaseTask, ITask {&lt;br /&gt;public double GetTotalPrice(){&lt;br /&gt;&amp;nbsp;&amp;nbsp; return Amount * Price + GetTotalTax(); &lt;br /&gt;}&lt;br /&gt;public double GetTotalTax(){&lt;br /&gt;&amp;nbsp;&amp;nbsp; return (Price*Amount * TaxPercentage) / 100;&lt;br /&gt;}&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;После этого разработчик добавил класс-фабрику TaskFactory, которая будет в зависимости от типа компании создает нужный тип сервиса.&lt;code class="prettyprint"&gt;&lt;br /&gt;static class TaskFactory{&lt;br /&gt;public ITask CreateTask(){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (CurrentSettings.CompanyType ==&amp;nbsp; CompanyTypes.Brutto) return new BruttoTask();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (CurrentSettings.CompanyType ==&amp;nbsp; CompanyTypes.Netto) return new NettoTask();&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Ура, заказчик доволен, дело сделано! На этом этапе качество начинает побеждать скорость. Приложение стало немного более гибким. Например, если теперь заказчик скажет, что нужно добавить расчеты для компаний, у которых нет налога, то это потребует совсем не много усилий и займет не так уж много времени - всего лишь добавить class WithoutTaxTask : ITask. &lt;br /&gt;Проходит N времени, и заказчику нужно немного расширить возможности приложения. Теперь нужно, чтобы программа умела сохранять, сколько и чего конкретный работник продал. Разработчик добавляет класс Product, но понимает, что уж очень он похож на Task, и поэтому в интерфейс ITask доавляет свойство IsService, которое и будет отличать сервис от продукта. Теперь нужно как-то получать список продуктов из БД и сохранять их туда. Разработчик открывает свой класс DBManager, начинает добавлять новый метод GetProducts(), и опять какие-то неполадки на подстанции уничтожают результаты его труда. На следующий день разработчик получает email от разработчика главной программы, в котором говорится, что было введено несколько служебных типов сервисов и продуктов, которые ни в коем случае отображать пользователю не нужно. Разработчик отрывает проект, ищет DBManager, начинает править GetTasks() и восклицает "Это ужасно!" И быстро начинает писать:&lt;br /&gt;&lt;code class="prettyprint"&gt; interface IEntity { int ID {get;set;} }&lt;br /&gt;interface ITask : IEntity {…}&lt;br /&gt;class Customer : IEntity {…}&lt;br /&gt;class Supplier : IEntity { … }&lt;br /&gt;class Service : IEntity {...}&lt;br /&gt;&lt;br /&gt;interface IRepository&amp;lt;T&amp;gt; where T : class, IEntity{&lt;br /&gt;&amp;nbsp;&amp;nbsp; IList&amp;lt;T&amp;gt; Load();&lt;br /&gt;}&lt;br /&gt;class CustomerRepository : IRepository&amp;lt;Customer&amp;gt;{&lt;br /&gt;public IList&amp;lt;Customer&amp;gt; Load() { … }&lt;br /&gt;}&lt;br /&gt;...&lt;br /&gt;public interface ITaskRepository{&lt;br /&gt;&amp;nbsp;&amp;nbsp; IList&amp;lt;ITask&amp;gt; Load();&lt;br /&gt;&amp;nbsp;&amp;nbsp; bool Save(ITask task);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public class  ServiceTaskRepository : IRepository&amp;lt;ITask&amp;gt;, ITaskRepository{       &lt;br /&gt;public IList&amp;lt;ITask&amp;gt; Load(){...}              &lt;br /&gt;public bool Save(ITask tsk){...}&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;span style="line-height: 115%;"&gt;Когда он заканчивает, то имеет Entities (хотя тут можно выделить Customer, Supplier, Service как Value-объекты, т.к. в процессе работы они никак не изменяются) и Repositories для них, счастливо улыбается и удаляет DBManager, который был перегружен обязанностями. Теперь каждый класс выполняет только свои обязанности, all inclusive больше не в моде. Разработчик открывает главную форму, код которой разросся на несколько экранов. "Нужно что-то с этим делать"-думает он и принимается за рефакторинг. По-тихоньку из бревна начал получаться Буратино, если б не сломался тесак. Разработчик со вздохом еще раз окинул взглядом код формы, и полез в свой арсенал выбирать рубанок калибра MVC / MVP / etc, но...&lt;/span&gt;&lt;br /&gt;&lt;span style="line-height: 115%;"&gt;Но тут звонит заказчик, просит добавить в программу возможность просмотра закрытых сервисов и просит все это закончить «до завтра». Разработчик легко добавляет новый class ClosedTaskRepository : IRepository &amp;lt;ITask&amp;gt;, но опять тонет в коде главной формы. Выбравшись из трясины после добавления списка на форму, тестирует, отсылает заказчику и закрывает IDE: "На сегодня хватит. А завтра я разберусь с этими макаронами на главной форме". На следующий день довольный заказчик лукаво спрашивает "А можно сделать так, чтобы ….?" "Конечно, можно" - говорит разработчик, одевая макаронолазный костюм...&lt;/span&gt;&lt;br /&gt;&lt;span style="line-height: 115%;"&gt;Мораль.... Какая тут мораль? Делайте сразу качество, даже если заказчик говорит "два поля одна кнопка", и очень хочется&amp;nbsp; по-быстрому все свалить в одну кучу.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5342535388237643243-7007049327505254287?l=sly-and-fluffy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sly-and-fluffy.blogspot.com/feeds/7007049327505254287/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://sly-and-fluffy.blogspot.com/2011/03/blog-post.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/7007049327505254287'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/7007049327505254287'/><link rel='alternate' type='text/html' href='http://sly-and-fluffy.blogspot.com/2011/03/blog-post.html' title='История одного приложения'/><author><name>Tatiana Shemyakina</name><uri>https://profiles.google.com/115825956619949451947</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-4MfXIVcZdJA/AAAAAAAAAAI/AAAAAAAAAbA/Iv1Gt6j8YgI/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='https://lh4.googleusercontent.com/-TdxalSa35xM/TXiX4wjE3eI/AAAAAAAAAUI/iH7iN2fMMGA/s72-c/SF15-2090.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5342535388237643243.post-8940930275006607410</id><published>2011-02-10T12:49:00.002+02:00</published><updated>2011-02-11T23:37:57.892+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='IoC'/><title type='text'>Сравнение IoC-контейнеров</title><content type='html'>Небольшой сравнительный анализ IoC-контейнеров (AutoFac, MEF, Ninject, Spring.Net, StructureMap, Unity, Windsor) &lt;a href="http://elegantcode.com/2009/01/07/ioc-libraries-compared/"&gt;http://elegantcode.com/2009/01/07/ioc-libraries-compared/&lt;/a&gt;&lt;br /&gt;Глубокий сравнительный анализ IoC-контейнеров: &lt;br /&gt;&lt;a href="http://blog.ashmind.com/index.php/2008/08/19/comparing-net-di-ioc-frameworks-part-1/"&gt;http://blog.ashmind.com/index.php/2008/08/19/comparing-net-di-ioc-frameworks-part-1/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://blog.ashmind.com/index.php/2008/09/08/comparing-net-di-ioc-frameworks-part-2/"&gt;http://blog.ashmind.com/index.php/2008/09/08/comparing-net-di-ioc-frameworks-part-2/&lt;/a&gt;&lt;br /&gt;Бенчмарк IoC-контейнеров (Unity, Windsor, StructureMap, Spring.NET):&amp;nbsp; &lt;br /&gt;&lt;a href="http://www.codinginstinct.com/2008/04/ioc-container-benchmark-unity-windsor.html"&gt;http://www.codinginstinct.com/2008/04/ioc-container-benchmark-unity-windsor.html&lt;/a&gt; &lt;br /&gt;Делайте выводы, решайте сами, иметь или не иметь ;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5342535388237643243-8940930275006607410?l=sly-and-fluffy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sly-and-fluffy.blogspot.com/feeds/8940930275006607410/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://sly-and-fluffy.blogspot.com/2011/02/ioc.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/8940930275006607410'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/8940930275006607410'/><link rel='alternate' type='text/html' href='http://sly-and-fluffy.blogspot.com/2011/02/ioc.html' title='Сравнение IoC-контейнеров'/><author><name>Tatiana Shemyakina</name><uri>https://profiles.google.com/115825956619949451947</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-4MfXIVcZdJA/AAAAAAAAAAI/AAAAAAAAAbA/Iv1Gt6j8YgI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5342535388237643243.post-2674756767061446208</id><published>2010-10-27T15:26:00.002+03:00</published><updated>2010-10-27T15:39:06.143+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='рефакторинг'/><category scheme='http://www.blogger.com/atom/ns#' term='разработка ПО'/><title type='text'>Зачем нужен рефакторинг?</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_e8cdtZaFnDI/TMgaOwbwj8I/AAAAAAAAATs/Nb6xR5LRnwg/s1600/image.axd.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="208" src="http://2.bp.blogspot.com/_e8cdtZaFnDI/TMgaOwbwj8I/AAAAAAAAATs/Nb6xR5LRnwg/s320/image.axd.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;Если вы только узнали, что это такое и не совсем понимаете, зачем оно нужно, то, скорее всего, после прочтения книги &lt;a href="http://letitbit.net/download/59831.5014d83d2357230982a0142a77bf/Refaktoring._Uluchshenie_sushhestvuyushhego_koda._Fauler_%282003%29.pdf.html"&gt;М.Фаулера "Рефакторинг"&lt;/a&gt;, этот вопрос отпадет сам собой.&lt;br /&gt;Если у вас уже есть опыт применения рефакторинга, но вы всё равно не понимаете, зачем это нужно, и считаете рефакторинг пустой тратой времени, то есть несколько вариантов объяснения:&lt;br /&gt;а) либо вы - босс и считаете, что так программисты "валяют дурака" - вроде что-то и делают, но нового функционала - 0! Цель рефакторинга - не увеличение производительности кода, не сокращение расходуемой памяти, не ускорение алгоритмов вычислений - это все могут быть положительные побочные эффекты. Цель рефакторинга - структуризация и упрощение кода, приведение его в порядок, чтобы другой программист, который будет работать с ним после, не получил психологическую травму :) &lt;br /&gt;б) либо вы применяете рефакторинг не там, где надо - еще раз почитайте &lt;a href="http://letitbit.net/download/59831.5014d83d2357230982a0142a77bf/Refaktoring._Uluchshenie_sushhestvuyushhego_koda._Fauler_%282003%29.pdf.html"&gt;М.Фаулера&lt;/a&gt;, другие книги (например, &lt;a href="http://letitbit.net/download/81495.80d63ef88cfb1f16e532b6723456/Kerievky_Refactoring_to_patterns_2006.djvu.html"&gt;Д. Кериевски&lt;/a&gt;, &lt;a href="http://letitbit.net/download/47420.4cdce285b689da497dfabfc5799b/Sovershennyy_kod__2-e_izd.djvu.html"&gt;С.Макконнелла&lt;/a&gt; и &lt;a href="http://letitbit.net/download/99868.91437e25b69b4f9c453433915d8d/31DaysRefactoring.pdf.html"&gt;др.&lt;/a&gt;), разберите внимательно примеры... Вспомните, как часто вы слышите фразу (или сами ее говорите) "Этот код готов. Он не совсем идеален, зато работает!". Эдакий "скорокод"! Он ведь просто кричит "Help me! I wanna be refactored!" Вот тут можете смело оттачивать свои навыки!&lt;br /&gt;в) либо вы считаете, что пишете идеальный код! - спуститесь с небес на землю, такого не бывает! Это была плохая новость. А теперь хорошая: вам есть, куда расти. Я считаю, что программист развивается, растет, когда находит все новые и новые пути оптимизации кода. Это значит, что он научился чему-то, увидел проблему в другом свете, и ее решение, раньше казавшееся сложным, теперь для него - само собой разумеющееся, элементарное. И с этими новыми знаниями программист может существенно улучшить старый код. Оглядываясь назад, думаю , как изящно можно было б решить ту или иную проблему с накопленными знаниями!&lt;br /&gt;Помните, что любой код можно улучшить, главное в этом деле - не переборщить. И не стоит гнаться за принципом "совершенству нет предела", тут немного другая математика :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5342535388237643243-2674756767061446208?l=sly-and-fluffy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sly-and-fluffy.blogspot.com/feeds/2674756767061446208/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://sly-and-fluffy.blogspot.com/2010/10/blog-post_27.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/2674756767061446208'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/2674756767061446208'/><link rel='alternate' type='text/html' href='http://sly-and-fluffy.blogspot.com/2010/10/blog-post_27.html' title='Зачем нужен рефакторинг?'/><author><name>Tatiana Shemyakina</name><uri>https://profiles.google.com/115825956619949451947</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-4MfXIVcZdJA/AAAAAAAAAAI/AAAAAAAAAbA/Iv1Gt6j8YgI/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_e8cdtZaFnDI/TMgaOwbwj8I/AAAAAAAAATs/Nb6xR5LRnwg/s72-c/image.axd.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5342535388237643243.post-19653848502766655</id><published>2010-10-26T09:18:00.001+03:00</published><updated>2010-10-26T09:24:59.891+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>VS 2010 Shortcuts Posters for C#, F#, VB, C++</title><content type='html'>Появились новые постеры с горячими сочетаниями клавиш для разработки в Visual Studio 2010 под разные языки. Постеры выполнены в двух разных форматах - 8.5”x11”(Letter) и 210x297mm (А4)&lt;br /&gt;&lt;a href="http://www.microsoft.com/downloads/en/details.aspx?FamilyID=92CED922-D505-457A-8C9C-84036160639F&amp;amp;displaylang=en"&gt;Скачать с сайта Microsoft&lt;/a&gt;&lt;br /&gt;&lt;a href="http://letitbit.net/download/42188.468bc0313dba29e5167cd50a0b48/CSharpPosters.zip.html"&gt;Зеркало на C# for VS 2010 постеры&lt;/a&gt;&lt;br /&gt;&lt;a href="http://letitbit.net/download/10761.1112e1a158d507e001a8910c2cf7/Visual_C_Sharp_2008_Poster.zip.html"&gt;C# for VS 2008&lt;/a&gt;&amp;nbsp;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5342535388237643243-19653848502766655?l=sly-and-fluffy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sly-and-fluffy.blogspot.com/feeds/19653848502766655/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://sly-and-fluffy.blogspot.com/2010/10/vs-2010-shortcuts-posters-for-c-f-vb-c.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/19653848502766655'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/19653848502766655'/><link rel='alternate' type='text/html' href='http://sly-and-fluffy.blogspot.com/2010/10/vs-2010-shortcuts-posters-for-c-f-vb-c.html' title='VS 2010 Shortcuts Posters for C#, F#, VB, C++'/><author><name>Tatiana Shemyakina</name><uri>https://profiles.google.com/115825956619949451947</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-4MfXIVcZdJA/AAAAAAAAAAI/AAAAAAAAAbA/Iv1Gt6j8YgI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5342535388237643243.post-9175374063487328537</id><published>2010-10-14T12:52:00.000+03:00</published><updated>2010-10-14T12:52:52.863+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='задачки'/><category scheme='http://www.blogger.com/atom/ns#' term='Разное'/><title type='text'>Задачка про песочные часы</title><content type='html'>Есть 2 песочных часов: первые отсчитывают 4 минуты, вторые - 7. Как,  начиная с текущего момента, с помощью этих часов отмерить 9 минут?&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;Ответ:&lt;span style="background-color: #663366; color: #663366;"&gt;&lt;br /&gt;Запускаем часы вместе.&lt;br /&gt;Через 4 минуты переворачиваем первые.&lt;br /&gt;Через 7 минут после начала переворачиваем вторые - в первых пройдёт уже 3 минуты.&lt;br /&gt;Через минуту (т.е. через 8 после начала) опять закончатся первые, во вторых отсыпется минута.&lt;br /&gt;Переворачиваем вторые, чтобы отсчитать последнюю минуту.&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5342535388237643243-9175374063487328537?l=sly-and-fluffy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sly-and-fluffy.blogspot.com/feeds/9175374063487328537/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://sly-and-fluffy.blogspot.com/2010/10/blog-post.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/9175374063487328537'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/9175374063487328537'/><link rel='alternate' type='text/html' href='http://sly-and-fluffy.blogspot.com/2010/10/blog-post.html' title='Задачка про песочные часы'/><author><name>Tatiana Shemyakina</name><uri>https://profiles.google.com/115825956619949451947</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-4MfXIVcZdJA/AAAAAAAAAAI/AAAAAAAAAbA/Iv1Gt6j8YgI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5342535388237643243.post-1477163361640638624</id><published>2010-10-12T13:59:00.003+03:00</published><updated>2010-10-12T14:05:55.021+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ms sql ce'/><title type='text'>MS Sql Server CE : какая dll для чего нужна?</title><content type='html'>После установки MS SQL Server CE мы получаем целый набор dll-файлов. Для чего нужна какая dll? Что нужно добавлять в проект, а что нет? Сейчас будем разбираться.&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;Для начала посмотрим на такую замечательную картинку:&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_e8cdtZaFnDI/TLQ4vWRavWI/AAAAAAAAATo/WjCkza_sjKo/s1600/image_18.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_e8cdtZaFnDI/TLQ4vWRavWI/AAAAAAAAATo/WjCkza_sjKo/s1600/image_18.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;На этой картинке хорошо видно, из каких компонент состоит SQL Server CE.&lt;br /&gt;Синим цветом обозначены компоненты ядра (Storage Engine, Query Processor), которые должны быть обязательно для работы с сервером.&lt;br /&gt;Зеленым и фиолетовым выделены опциональные компоненты. Фиолетовые (ADO.NET Provider, Managed Extensions, OLEDB Provider) зависят от выбранной модели доступа к БД. Зеленые компоненты подключаются по желанию - хотите вы работать с LINQ2SQL или нет = подключаете соответствующий компонент или нет. &lt;br /&gt;Теперь определимся, в какой дллке что находится (XX в конце имени dll-файла обозначают версию SQL Server CE. Например, для SQL Server CE 3.5 XX надо заменить на 35, для SQL Server CE 4.0 соответственно на 40) :&lt;br /&gt;&lt;b&gt;Storage Engine&lt;/b&gt; -&amp;nbsp;       sqlceseXX.dll&lt;br /&gt;&lt;b&gt;Query Processor&lt;/b&gt; -        sqlceqpXX.dll&lt;br /&gt;&lt;b&gt;OLEDB Provider&lt;/b&gt;        - sqlceoledbXX.dll&lt;br /&gt;&lt;b&gt;DB Utilities&lt;/b&gt;        - sqlcecompactXX.dll&lt;br /&gt;&lt;b&gt;Managed Extensions - &lt;/b&gt;sqlcemeXX.dll&lt;br /&gt;&lt;b&gt; Merge Replication, Remote Data Access&lt;/b&gt;        - sqlcecaXX.dll&lt;br /&gt;&lt;b&gt;Sync Services&lt;/b&gt;:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;b&gt;Client Sync Provider&lt;/b&gt; - Microsoft.Synchronization.Data.SqlServerCe.dll&lt;br /&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Sync Common&lt;/b&gt; - Microsoft.Synchronization.Data.dll&lt;br /&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Server Sync Provider&lt;/b&gt; - Microsoft.Synchronization.Data.Server.dll&lt;br /&gt;&lt;b&gt;ADO.NET Provider (ADO.NET v2 Provider)&lt;/b&gt; -        System.Data.SqlServerCe.dll &lt;br /&gt;&lt;b&gt;LINQ/Entities (ADO.NET v3 Provider), Entity Framework&lt;/b&gt;        - System.Data.SqlServerCe.Entity.dll&lt;br /&gt;&lt;b&gt;LINQ/SQL&lt;/b&gt; не требуется отдельной dll для подключения&lt;br /&gt;&lt;b&gt;Error Messages&lt;/b&gt; - sqlceer35en.dll (для локализации меняем EN в названии файла на нужную локаль)&lt;br /&gt;Теперь займемся простой арифметикой, а после посмотрим, когда и что применять :)&lt;br /&gt;1) Core Engine = Storage Engine + Query Processor = sqlceseXX.dll + sqlceqpXX.dll&lt;br /&gt;2) Core Engine Native = Core Engine + OLEDB&amp;nbsp; = sqlceseXX.dll + sqlceqpXX.dll + sqlceoledbXX.dll&lt;br /&gt;3) Core Engine Managed = Core Engine + ADO.NET + Managed Extensions =&amp;nbsp; sqlceseXX.dll + sqlceqpXX.dll + System.Data.SqlServerCe.dll + sqlcemeXX.dll&lt;br /&gt;Вот такая простая арифметика.&lt;br /&gt;А теперь, главный вопрос - что же и когда использовать?&lt;br /&gt;Если приложение использует нативный код и подключается к компакт серверу только локально, без всяких Sync-сервисов, то приложению потребуется только dll-набор для Core Engine Native&lt;br /&gt;Если мы пишем приложение на управляемом коде и , опять же, работаем с Sql Server CE только локально, то нужен dll-набор для Core Engine Managed. При этом в приложении мы можем использовать LinQ/SQL. Но если вдруг мы захотим использовать LINQ/Entities, придется подключить дополнительно System.Data.SqlServerCe.Entity.dll.&lt;br /&gt;Если захотим в приложении сделать возможность репликации, то в зависимости от того, как пишем (native или managed) будет Core Engine Native / Managed + sqlceca35.dll.&lt;br /&gt;И так далее: к ядру (native/managed) плюсуем дополнительные библиотеки в зависимости от потребностей. &lt;br /&gt;Данный пост использует материалы http://blogs.msdn.com/b/laxmi/archive/2009/10/07/sql-ce-binaries-details.aspx&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5342535388237643243-1477163361640638624?l=sly-and-fluffy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sly-and-fluffy.blogspot.com/feeds/1477163361640638624/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://sly-and-fluffy.blogspot.com/2010/10/ms-sql-server-ce.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/1477163361640638624'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/1477163361640638624'/><link rel='alternate' type='text/html' href='http://sly-and-fluffy.blogspot.com/2010/10/ms-sql-server-ce.html' title='MS Sql Server CE : какая dll для чего нужна?'/><author><name>Tatiana Shemyakina</name><uri>https://profiles.google.com/115825956619949451947</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-4MfXIVcZdJA/AAAAAAAAAAI/AAAAAAAAAbA/Iv1Gt6j8YgI/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_e8cdtZaFnDI/TLQ4vWRavWI/AAAAAAAAATo/WjCkza_sjKo/s72-c/image_18.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5342535388237643243.post-7694657037083131215</id><published>2010-10-01T13:20:00.002+03:00</published><updated>2012-01-30T11:13:09.820+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='юмор'/><category scheme='http://www.blogger.com/atom/ns#' term='Разное'/><title type='text'>10 заповедей программиста</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;b&gt;&lt;/b&gt;1. Программирование - твоя главная страсть. И да не будет у тебя страсти главней.&lt;br /&gt;&lt;br /&gt;2.  Не сотвори себе кумира из конкретной технологии. Ибо программирование  требует постоянного развития, а технологии-кумиры останавливают  развитие.&lt;br /&gt;&lt;br /&gt;3. Не возноси хвальбу программированию в неподходящей  компании. Ты сам себя накажешь, ибо будешь не понят, и люди отвернутся  от тебя.&lt;br /&gt;&lt;br /&gt;4. Работай много и хорошо, но не забывай и про отдых. Ибо нет ничего страшнее, чем код усталого, засыпающего программиста.&lt;br /&gt;&lt;br /&gt;5.  Уважай учителей и учеников своих. Постоянно учись и учи окружающих,  чтобы было тебе всё легче и легче делать всё более и более сложные вещи.&lt;br /&gt;&lt;br /&gt;6.  Не убий в себе ребенка. Не забывай эмоции от первого запуска первой  написанной тобой программы и воспринимай каждую следующую, как ту -  первую.&lt;br /&gt;&lt;br /&gt;7. Не изменяй программированию. Ибо программист может стать кем угодно, но этот кто угодно обратно программистом уже не станет.&lt;br /&gt;&lt;br /&gt;8. Не кради код ближнего своего.&lt;br /&gt;&lt;br /&gt;9. Не программируй то, что может принести вред другим. Ибо встав раз на путь дьявола - на нем и останешься.&lt;br /&gt;&lt;br /&gt;10.  Не завидуй ближнему твоему, если он умеет лучше программировать. Ибо  программирование - это божественный дар, но его можно развить. Так что  не завидуй, а развивай.&lt;br /&gt;&lt;br /&gt;(скопипастено с инета)&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5342535388237643243-7694657037083131215?l=sly-and-fluffy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sly-and-fluffy.blogspot.com/feeds/7694657037083131215/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://sly-and-fluffy.blogspot.com/2010/10/10.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/7694657037083131215'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/7694657037083131215'/><link rel='alternate' type='text/html' href='http://sly-and-fluffy.blogspot.com/2010/10/10.html' title='10 заповедей программиста'/><author><name>Tatiana Shemyakina</name><uri>https://profiles.google.com/115825956619949451947</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-4MfXIVcZdJA/AAAAAAAAAAI/AAAAAAAAAbA/Iv1Gt6j8YgI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5342535388237643243.post-4509576765702149796</id><published>2010-09-28T13:17:00.002+03:00</published><updated>2010-09-28T13:21:11.822+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='unit testing'/><category scheme='http://www.blogger.com/atom/ns#' term='testing'/><title type='text'>TypeMock Video: The Goals of Unit Testing</title><content type='html'>О целях юнит-тестирования.&lt;br /&gt;&lt;br /&gt;&lt;object width="640" height="385"&gt;&lt;param name="movie" value="http://www.youtube.com/v/vBoZJinFwoQ?fs=1&amp;amp;hl=ru_RU"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/vBoZJinFwoQ?fs=1&amp;amp;hl=ru_RU" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="640" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5342535388237643243-4509576765702149796?l=sly-and-fluffy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sly-and-fluffy.blogspot.com/feeds/4509576765702149796/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://sly-and-fluffy.blogspot.com/2010/09/typemock-video-goals-of-unit-testing.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/4509576765702149796'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/4509576765702149796'/><link rel='alternate' type='text/html' href='http://sly-and-fluffy.blogspot.com/2010/09/typemock-video-goals-of-unit-testing.html' title='TypeMock Video: The Goals of Unit Testing'/><author><name>Tatiana Shemyakina</name><uri>https://profiles.google.com/115825956619949451947</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-4MfXIVcZdJA/AAAAAAAAAAI/AAAAAAAAAbA/Iv1Gt6j8YgI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5342535388237643243.post-6772762849319143067</id><published>2010-09-28T08:34:00.003+03:00</published><updated>2010-09-28T08:39:47.146+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='задачки'/><category scheme='http://www.blogger.com/atom/ns#' term='Разное'/><title type='text'>Задачка для страшеклассников</title><content type='html'>Маленькая и совсем несложная задачка.&lt;br /&gt;&lt;blockquote&gt;Есть две переменные a и b. Поменять местами их значения, не вводя третью переменную.&lt;/blockquote&gt;Решение:&lt;span style="color: rgb(102, 51, 102); background-color: rgb(102, 51, 102);"&gt;&lt;br /&gt;a = a+b&lt;br /&gt;b = a - b&lt;br /&gt;a = a - b&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5342535388237643243-6772762849319143067?l=sly-and-fluffy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sly-and-fluffy.blogspot.com/feeds/6772762849319143067/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://sly-and-fluffy.blogspot.com/2010/09/blog-post_28.html#comment-form' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/6772762849319143067'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/6772762849319143067'/><link rel='alternate' type='text/html' href='http://sly-and-fluffy.blogspot.com/2010/09/blog-post_28.html' title='Задачка для страшеклассников'/><author><name>Tatiana Shemyakina</name><uri>https://profiles.google.com/115825956619949451947</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-4MfXIVcZdJA/AAAAAAAAAAI/AAAAAAAAAbA/Iv1Gt6j8YgI/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5342535388237643243.post-4957860552360266826</id><published>2010-09-22T00:18:00.004+03:00</published><updated>2010-09-22T08:32:04.761+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='задачки'/><category scheme='http://www.blogger.com/atom/ns#' term='Разное'/><title type='text'>Еще одна интересная задачка</title><content type='html'>Нравятся мне эти задачки, несложные, но хитрые :) Вот еще одна.&lt;br /&gt;&lt;blockquote&gt;Дано целое натуральное число. Без использования циклов и рекурсии поменять значение самого крайнего правого бита, равного 0, на 1.&lt;br /&gt;Например, 0101 -&gt; 0111; 1010 -&gt;1011&lt;/blockquote&gt;&lt;br /&gt;Решение:&lt;span style="color: rgb(102, 51, 102); background-color: rgb(102, 51, 102);"&gt;value | (value+1)&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5342535388237643243-4957860552360266826?l=sly-and-fluffy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sly-and-fluffy.blogspot.com/feeds/4957860552360266826/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://sly-and-fluffy.blogspot.com/2010/09/blog-post_22.html#comment-form' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/4957860552360266826'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/4957860552360266826'/><link rel='alternate' type='text/html' href='http://sly-and-fluffy.blogspot.com/2010/09/blog-post_22.html' title='Еще одна интересная задачка'/><author><name>Tatiana Shemyakina</name><uri>https://profiles.google.com/115825956619949451947</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-4MfXIVcZdJA/AAAAAAAAAAI/AAAAAAAAAbA/Iv1Gt6j8YgI/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5342535388237643243.post-2079888697476508559</id><published>2010-09-14T13:05:00.005+03:00</published><updated>2010-09-22T00:24:01.383+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='задачки'/><category scheme='http://www.blogger.com/atom/ns#' term='Разное'/><title type='text'>Очень сложная задачка</title><content type='html'>Не так давно знакомый программист, проходивший собеседование в девелоперской конторе, поделился задачкой, которую получил на собеседовании:&lt;br /&gt;&lt;blockquote&gt;Есть массив из N элементов, в котором находятся значения от 1 до N+1. Одно значение пропущено. Нужно его определить за линейное время. Массив не сортирован.&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;Вот такая хитрая задачка с ооочень тривиальным решением :)&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;Решение: &lt;span style="color: rgb(102, 51, 102); background-color: rgb(102, 51, 102);"&gt;искомое значение = sum(i=1; i=N+1) - sum(array[N])&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5342535388237643243-2079888697476508559?l=sly-and-fluffy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sly-and-fluffy.blogspot.com/feeds/2079888697476508559/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://sly-and-fluffy.blogspot.com/2010/09/blog-post.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/2079888697476508559'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/2079888697476508559'/><link rel='alternate' type='text/html' href='http://sly-and-fluffy.blogspot.com/2010/09/blog-post.html' title='Очень сложная задачка'/><author><name>Tatiana Shemyakina</name><uri>https://profiles.google.com/115825956619949451947</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-4MfXIVcZdJA/AAAAAAAAAAI/AAAAAAAAAbA/Iv1Gt6j8YgI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5342535388237643243.post-8990656335013769041</id><published>2010-09-13T11:08:00.002+03:00</published><updated>2010-09-13T11:57:23.069+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='256'/><title type='text'>С 256-ым днем в году!</title><content type='html'>&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_e8cdtZaFnDI/TI3cB4dJiHI/AAAAAAAAATc/6Qrmxeuh-8w/s1600/151e7a0bfbf4.jpg"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 272px; height: 400px;" src="http://4.bp.blogspot.com/_e8cdtZaFnDI/TI3cB4dJiHI/AAAAAAAAATc/6Qrmxeuh-8w/s400/151e7a0bfbf4.jpg" alt="" id="BLOGGER_PHOTO_ID_5516307043491350642" border="0" /&gt;&lt;/a&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;С нашим днём, уважаемые коллеги!!!&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;Красивого, чистого кода, и пусть обходят стороной вас баги!&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5342535388237643243-8990656335013769041?l=sly-and-fluffy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sly-and-fluffy.blogspot.com/feeds/8990656335013769041/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://sly-and-fluffy.blogspot.com/2010/09/256.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/8990656335013769041'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/8990656335013769041'/><link rel='alternate' type='text/html' href='http://sly-and-fluffy.blogspot.com/2010/09/256.html' title='С 256-ым днем в году!'/><author><name>Tatiana Shemyakina</name><uri>https://profiles.google.com/115825956619949451947</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-4MfXIVcZdJA/AAAAAAAAAAI/AAAAAAAAAbA/Iv1Gt6j8YgI/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_e8cdtZaFnDI/TI3cB4dJiHI/AAAAAAAAATc/6Qrmxeuh-8w/s72-c/151e7a0bfbf4.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5342535388237643243.post-6688495599159560991</id><published>2010-09-10T15:55:00.013+03:00</published><updated>2011-03-25T23:19:24.883+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='IoC'/><category scheme='http://www.blogger.com/atom/ns#' term='DI'/><category scheme='http://www.blogger.com/atom/ns#' term='разработка ПО'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>IoC, DI, WTF?</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Давайте разберемся с этими загадочными абревиатурами и разницей между ними. &lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;br /&gt;IoC (Inversion of Control) - &lt;/span&gt;инверсия управления, один из принципов &lt;a href="http://igor.quatrocode.com/2008/09/solid-top-5.html"&gt;S.O.L.I.D.&lt;/a&gt;, известна так же как Принцип обращения зависимостей (Dependency Inversion Principle, DIP). IoC - очень полезная техника, которая уменьшает связанность и придает гибкость разрабатываемому ПО. Принцип инверсии управления звучит так [&lt;a href="http://ru.wikipedia.org/wiki/%D0%9E%D0%B1%D1%80%D0%B0%D1%89%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BA%D0%BE%D0%BD%D1%82%D1%80%D0%BE%D0%BB%D1%8F#.D0.A2.D0.B5.D1.80.D0.BC.D0.B8.D0.BD.D1.8B_.D0.B8_.D0.BE.D0.BF.D1.80.D0.B5.D0.B4.D0.B5.D0.BB.D0.B5.D0.BD.D0.B8.D1.8F"&gt;wikipedia&lt;/a&gt;]:&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span class="fullpost"&gt;Модули верхних уровней не должны зависеть от  модулей нижних уровней. Оба типа модулей должны зависеть от абстракций.  Абстракции не должны зависеть от деталей. Детали должны зависеть от  абстракций.&lt;/span&gt;&lt;/blockquote&gt;В своей статье &lt;a href="http://martinfowler.com/articles/injection.html"&gt;Inversion of Control Containers and the Dependency Injection  pattern&lt;/a&gt; Мартин Фаулер вводит понятие&lt;span style="font-weight: bold;"&gt; Dependency Injection (&lt;/span&gt;&lt;b&gt;&lt;a class="mw-redirect" href="http://ru.wikipedia.org/wiki/Dependency_Injection" style="font-weight: bold;" title="Dependency Injection"&gt;Dependency Injection&lt;/a&gt;) - &lt;/b&gt;внедрение зависимости - как разновидность IoC. Всего он выделяет три типа DI в зависимости от того, через что осуществляется DI:&lt;br /&gt;1) Interface injection&lt;br /&gt;2) Setter injection (&lt;a href="http://sly-and-fluffy.blogspot.com/2011/03/setter-injection-with-unity-20.html"&gt;пример&lt;/a&gt;)&lt;br /&gt;3) Constructor injection (&lt;a href="http://sly-and-fluffy.blogspot.com/2011/03/constuctor-injection-with-unity-20.html"&gt;пример&lt;/a&gt;)&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;Рассмотрим простой случай инверсии управления.&lt;span style="font-weight: bold;"&gt; &lt;/span&gt;Представим, что мы для своих нужд пишем блокнот. Нам много не нужно - просмотреть документ, сохранить сделанные изменения.&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;class TxtDocument&lt;br /&gt;{&lt;br /&gt;private string Path;&lt;br /&gt;public TxtDocument(string path){...}&lt;br /&gt;public void Open() {...}&lt;br /&gt;public Stream GetContent() {...}&lt;br /&gt;public void Save(Stream stream) {...}&lt;br /&gt;public void Close(){...}&lt;br /&gt;}&lt;br /&gt;class DocumentManager&lt;br /&gt;{&lt;br /&gt;private TxtDocument document;&lt;br /&gt;public DocumentManager(string path)&lt;br /&gt;{&lt;br /&gt;document = new TxtDocument(path);&lt;br /&gt;}&lt;br /&gt;public Steam GetDocument()&lt;br /&gt;{&lt;br /&gt;document.Open();&lt;br /&gt;Stream stream = document.GetContent();&lt;br /&gt;document.Close();&lt;br /&gt;}&lt;br /&gt;public void SaveDocument(Stream stream)&lt;br /&gt;{&lt;br /&gt;document.Open();&lt;br /&gt;document.Save(steam);&lt;br /&gt;document.Close();&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;....&lt;br /&gt;DocumentManager dm = new DocumentManager(@"C:\test.txt");&lt;br /&gt;Stream stream = dm.GetContent();&lt;br /&gt;...&lt;br /&gt;dm.Save(stream);&lt;br /&gt;....&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;UML-диаграмма&lt;span style="font-weight: bold;"&gt;:&lt;br /&gt;&lt;/span&gt;&lt;a href="http://3.bp.blogspot.com/_e8cdtZaFnDI/TIpITppgIbI/AAAAAAAAATM/P-0XP0WyIKg/s1600/IoC_example1.png"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5515300196103233970" src="http://3.bp.blogspot.com/_e8cdtZaFnDI/TIpITppgIbI/AAAAAAAAATM/P-0XP0WyIKg/s400/IoC_example1.png" style="cursor: pointer; display: block; height: 227px; margin: 0px auto 10px; text-align: center; width: 400px;" /&gt;&lt;/a&gt;Что получилось: жесткая зависимость класса DocumentManager от класса TxtDocument. А теперь представьте, что нам понадобилось работать еще и с rtf, doc, pdf, etc. - документами. Что делать? Срочно, срочно применять IoC (DI: Interface injection)! Для этого введем интерфейс IDocument, который будут реализовывать все классы документов.&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;interface IDocument&lt;br /&gt;{&lt;br /&gt;void Open() {...}&lt;br /&gt;Stream GetContent() {...}&lt;br /&gt;void Save(Stream stream) {...}&lt;br /&gt;void Close(){...}&lt;br /&gt;}&lt;br /&gt;class TxtDocument : IDocument { .... }&lt;br /&gt;class RtfDocument : IDocument { ... }&lt;br /&gt;class DocDocument : IDocument { ... }&lt;br /&gt;class PdfDocument : IDocument { ... }&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Класс DocumentManager изменится следующим образом:&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;class DocumentManager&lt;br /&gt;{&lt;br /&gt;private IDocument document;&lt;br /&gt;public DocumentManager(IDocument _document)&lt;br /&gt;{&lt;br /&gt;document = _document;&lt;br /&gt;}&lt;br /&gt;public Steam GetDocument()&lt;br /&gt;{&lt;br /&gt;document.Open();&lt;br /&gt;Stream stream = document.GetContent();&lt;br /&gt;document.Close();&lt;br /&gt;}&lt;br /&gt;public void SaveDocument(Stream stream)&lt;br /&gt;{&lt;br /&gt;document.Open();&lt;br /&gt;document.Save(steam);&lt;br /&gt;document.Close();&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;....&lt;br /&gt;DocumentManager dm = new DocumentManager(new RtfDocument(@"C:\test.rtf"));&lt;br /&gt;Stream stream = dm.GetContent();&lt;br /&gt;...&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;UML-диаграмма результата:&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_e8cdtZaFnDI/TIpM9NeuRlI/AAAAAAAAATU/iD-5TiYURAc/s1600/IoC_example2.png"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5515305308142847570" src="http://3.bp.blogspot.com/_e8cdtZaFnDI/TIpM9NeuRlI/AAAAAAAAATU/iD-5TiYURAc/s400/IoC_example2.png" style="cursor: pointer; display: block; height: 144px; margin: 0px auto 10px; text-align: center; width: 400px;" /&gt;&lt;/a&gt;В результате применения инверсии управления мы получили гибкое решение, которое с легкостью позволяет нам добавлять классы для работы с новыми форматами файлов.&lt;br /&gt;&lt;br /&gt;Для автоматизации инверсии управления существуют IoC-контейнеры. Наиболее популярные для .Net :&lt;br /&gt;&lt;a class="external text" href="http://unity.codeplex.com/" rel="nofollow"&gt;Unity Application Block 2.0&lt;/a&gt;&lt;br /&gt;&lt;a class="external text" href="http://www.springframework.net/" rel="nofollow"&gt;Spring.NET&lt;/a&gt;&lt;br /&gt;&lt;a class="external text" href="http://structuremap.sourceforge.net/" rel="nofollow"&gt;Structuremap&lt;/a&gt;&lt;br /&gt;&lt;a class="external text" href="http://www.castleproject.org/" rel="nofollow"&gt;CastleProject&lt;/a&gt;&lt;br /&gt;&lt;a class="external text" href="http://s2container.net.seasar.org/en/index.html" rel="nofollow"&gt;Seasar&lt;/a&gt;&lt;br /&gt;&lt;a class="external text" href="http://code.google.com/p/nicnet/wiki/Winter" rel="nofollow"&gt;Winter.NET&lt;/a&gt;&lt;br /&gt;Применение IoC-контейнера на примере рассмотрим в следующей заметке.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5342535388237643243-6688495599159560991?l=sly-and-fluffy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sly-and-fluffy.blogspot.com/feeds/6688495599159560991/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://sly-and-fluffy.blogspot.com/2010/09/ioc-di-wtf.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/6688495599159560991'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/6688495599159560991'/><link rel='alternate' type='text/html' href='http://sly-and-fluffy.blogspot.com/2010/09/ioc-di-wtf.html' title='IoC, DI, WTF?'/><author><name>Tatiana Shemyakina</name><uri>https://profiles.google.com/115825956619949451947</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-4MfXIVcZdJA/AAAAAAAAAAI/AAAAAAAAAbA/Iv1Gt6j8YgI/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_e8cdtZaFnDI/TIpITppgIbI/AAAAAAAAATM/P-0XP0WyIKg/s72-c/IoC_example1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5342535388237643243.post-8062749006682092310</id><published>2010-09-03T09:12:00.005+03:00</published><updated>2010-09-10T19:17:56.935+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='uml'/><category scheme='http://www.blogger.com/atom/ns#' term='Tools'/><title type='text'>UML редактор</title><content type='html'>Наткнулась на SourceForge на милый UML-редактор &lt;a href="https://sourceforge.net/projects/nclass/"&gt;NClass&lt;/a&gt; с элементами интерфейса, такими родными и привычными для меня как пользователя Visual Studio.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_e8cdtZaFnDI/TIf0_Ut007I/AAAAAAAAATE/6tEBomXptdM/s1600/screenshot.jpg"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 400px; height: 301px;" src="http://3.bp.blogspot.com/_e8cdtZaFnDI/TIf0_Ut007I/AAAAAAAAATE/6tEBomXptdM/s400/screenshot.jpg" alt="" id="BLOGGER_PHOTO_ID_5514645637468312498" border="0" /&gt;&lt;/a&gt;Простой и интуитивно понятный интерфейс. Поддерживает два типа диаграмм - java, c#, кодогенерацию, экспорт диаграммы в PDF, сохранение в разных графических форматах (png, jpg, etc...). Что еще сказать? Программа бесплатна, написана C#. Из минусов - нет Ctrl+Z, Ctrl+C, Ctrl+V :( Надеюсь, в следующих релизах появится поддержка этих поистине горячих сочетаний клавиш :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5342535388237643243-8062749006682092310?l=sly-and-fluffy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sly-and-fluffy.blogspot.com/feeds/8062749006682092310/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://sly-and-fluffy.blogspot.com/2010/09/uml.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/8062749006682092310'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/8062749006682092310'/><link rel='alternate' type='text/html' href='http://sly-and-fluffy.blogspot.com/2010/09/uml.html' title='UML редактор'/><author><name>Tatiana Shemyakina</name><uri>https://profiles.google.com/115825956619949451947</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-4MfXIVcZdJA/AAAAAAAAAAI/AAAAAAAAAbA/Iv1Gt6j8YgI/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_e8cdtZaFnDI/TIf0_Ut007I/AAAAAAAAATE/6tEBomXptdM/s72-c/screenshot.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5342535388237643243.post-2085122676564664553</id><published>2010-08-30T22:11:00.011+03:00</published><updated>2010-09-28T13:19:21.768+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tdd'/><category scheme='http://www.blogger.com/atom/ns#' term='testing'/><title type='text'>TDD: начало</title><content type='html'>&lt;span style="font-weight: bold;"&gt;Что такое TDD?&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Это способ управления страхом в процессе программирования.&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;Да, мне гораздо спокойней, когда работоспособность моего кода подтверждена и подтверждается постоянно тестами. В любой момент времени я могу запустить тесты и проверить, все ли работает. Особенно актуально это, когда изменения вносятся в код, написанный пару-тройку месяцев назад, а то и ранее. А если этот код еще и чужой, то шансы поломать что-то возрастают многократно. Имея хороший набор тестов можно безбоязненно и безболезненно вносить изменения в код.  Говоря "хороший набор тестов" я намеренно не указываю число в процентах, потому что считаю test coverage весьма относительной метрикой. Стопроцентное покрытие - исключительно утопия. И та еще тема для холивара :) Тестов должно быть  столько, сколько требуется для уверенности в вашем коде и спокойного сна, если представить, что каждый ваш проект - система обеспечения АЭС ;)&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;К чему стремится TDD?&lt;br /&gt;&lt;span style="font-style: italic;"&gt;К чистому коду, который работает.&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;Ключевое слово здесь - чистый. Код, который работает, может написать каждый. И зачастую такой код - выходец из семейства "говнокодовых". Думаю, такой код в начале тернистого пути совершенствования навыков программирования писали все&lt;span style="font-weight: bold;"&gt;. &lt;/span&gt;Но есть несколько вещей, которые заставляют двигаться от кода, который работает, в сторону "чистого кода, который работает" - начинаются сложности при поддержке кода, внесении изменений, расширении системы... &lt;span&gt;признаки того, что все катится в сторону антипаттерна &lt;/span&gt;&lt;a href="http://c2.com/cgi/wiki?BigBallOfMud"&gt;Big ball of mud&lt;/a&gt; :(&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Каковы правила TDD?&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Красный - зеленый - рефакторинг&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_e8cdtZaFnDI/THwPnFbtueI/AAAAAAAAASc/Vaow5JpkP04/s1600/x_e1f411c5.jpg"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 400px; height: 82px;" src="http://4.bp.blogspot.com/_e8cdtZaFnDI/THwPnFbtueI/AAAAAAAAASc/Vaow5JpkP04/s400/x_e1f411c5.jpg" alt="" id="BLOGGER_PHOTO_ID_5511297208142379490" border="0" /&gt;&lt;/a&gt;Эти правила просты, как дважды два:&lt;br /&gt;1) Красный - пишем тест. Не факт, что он заработает сразу (или даже скомпилируется). Напротив, это тревожный знак. Ведь тесты мы пишем всегда перед написанием кода. «&lt;span style="font-style: italic;"&gt;Тест, написанный после кода, ничего не стоит и является только обузой.&lt;/span&gt;»&lt;br /&gt;2) Зеленый - заставляем тест работать, создавая при этом минимум кода. О чистоте и порядке на этом этапе задумываться еще рано. Тест должен работать. И работать быстро. Вот что главное на данном этапе. Минимум усилий. Ничего лишнего. Тут мы создаем &lt;span style="font-style: italic;"&gt;код, который работает&lt;/span&gt;.&lt;br /&gt;3) Рефакторинг - наводим порядок. Убираем дублирование и остальные запашки. После каждого действия запускаем тесты, проверить, ничего ли не поломалось. Время создавать &lt;span style="font-style: italic;"&gt;чистый код, который работает&lt;/span&gt;.&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;И кто это все придумал?&lt;br /&gt;&lt;/span&gt;&lt;span&gt;Тестирование имеет довольно длинную историю, уходя вглубь веков. Первые упоминания о тестировании можно найти в 1975 &lt;/span&gt;(в "Мифическом человеко-месяце" Брукса).&lt;span&gt; А сама методология &lt;/span&gt;Test-Driven Development и ее &lt;span&gt;основные принципы&lt;/span&gt; были сформулированы Кент Беком в книге "Extrime Programming Explained", увидевшей свет в 1999 году. С тех пор и понеслось :)&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Что нужно, чтобы начать?&lt;br /&gt;&lt;/span&gt;&lt;span&gt;Нужно немного - желание, храбрость, терпение и &lt;a href="http://ru.wikipedia.org/wiki/%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C%D0%BD%D0%BE%D0%B5_%D1%82%D0%B5%D1%81%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5#.D0.98.D0.BD.D1.81.D1.82.D1.80.D1.83.D0.BC.D0.B5.D0.BD.D1.82.D0.B0.D1.80.D0.B8.D0.B9"&gt;фреймворк для тестирования&lt;/a&gt; под платформу, на которой вы программируете. Или можете сами его написать, как это делает Кент Бек. Заодно и попрактикуетесь:)&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;А еще?&lt;br /&gt;&lt;/span&gt;&lt;span&gt;А еще можно (нужно) искать тут:&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;a href="http://sly-and-fluffy.blogspot.com/2009/12/blog-post_21.html"&gt;Кент Бек. &lt;/a&gt;&lt;a href="http://sly-and-fluffy.blogspot.com/2009/12/blog-post_21.html"&gt;"Экстремальное программирование: разработка через тестирование&lt;/a&gt;"&lt;br /&gt;&lt;a href="http://artofunittesting.com/"&gt;&lt;/a&gt;&lt;a href="http://osherove.com/videos/2009/8/25/understanding-test-driven-development.html"&gt;Roy Osherove Understanding TDD&lt;/a&gt; (видео, en)&lt;br /&gt;Джерард Мессарош «Шаблоны тестирования xUNIT»&lt;br /&gt;&lt;a href="http://sly-and-fluffy.blogspot.com/2009/12/blog-post_21.html"&gt;Джошуа Кериевски. "Рефакторинг с использованием шаблонов" &lt;/a&gt;&lt;br /&gt;М. Фаулер "Рефакторинг. Улучшение существующего кода."&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5342535388237643243-2085122676564664553?l=sly-and-fluffy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sly-and-fluffy.blogspot.com/feeds/2085122676564664553/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://sly-and-fluffy.blogspot.com/2010/08/tdd.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/2085122676564664553'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/2085122676564664553'/><link rel='alternate' type='text/html' href='http://sly-and-fluffy.blogspot.com/2010/08/tdd.html' title='TDD: начало'/><author><name>Tatiana Shemyakina</name><uri>https://profiles.google.com/115825956619949451947</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-4MfXIVcZdJA/AAAAAAAAAAI/AAAAAAAAAbA/Iv1Gt6j8YgI/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_e8cdtZaFnDI/THwPnFbtueI/AAAAAAAAASc/Vaow5JpkP04/s72-c/x_e1f411c5.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5342535388237643243.post-3105617308023904779</id><published>2010-08-26T11:47:00.021+03:00</published><updated>2010-09-28T13:19:39.692+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='xunit'/><category scheme='http://www.blogger.com/atom/ns#' term='tdd'/><category scheme='http://www.blogger.com/atom/ns#' term='testing'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='ms sql ce'/><title type='text'>SqlCE 3.5 to 4.0 Converter</title><content type='html'>&lt;a href="http://sly-and-fluffy.blogspot.com/2010/08/sql-ce-4-ctp1.html"&gt;Недавно (в июле этого года) вышла новая версия MS Sql CE&lt;/a&gt;, в которой был изменен алгоритм шифрования (стал использоваться SHA-2). Это означает, что для работы sql ce 4 с бд, созданной сервером версии 3.5, ее нужно предварительно переконвертировать. Для это в API предусмотрен специальный метод, поэтому особого труда конвертирование не вызовет.&lt;br /&gt;Давайте напишем конвертер для файлов баз данных в формате slq ce 3.5 в формат slq ce 4.0.&lt;br /&gt;Писать будем на C# в TDD-стиле, использовать VS 2008, тестировать в xUnit (последнюю версию можно скачать с &lt;a href="http://xunit.codeplex.com/"&gt;codeplex&lt;/a&gt;). Когда вы используете TDD, не нарушая основных принципов ( а их всего три - RGR (красный-зеленый-синий): пишем тест, пишем код, рефакторим) и порядка их следования, то получаете автоматически приятные бонусы в коде.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Warning! Этот пост нужно рассматривать как пример по разработке в стиле TDD для начинающих.&lt;/span&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;Итак, начнем. Создаем новый Windows Forms Application - проект в VS (у меня он называется "SqlCE3.5_to_4.0"), сразу же добавляем в солюшн еще один проект Class Library, называем его Tests. И, в лучших традициях TDD, начинаем писать наш первый тест.&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;public class SqlCEVersionConverterTests&lt;br /&gt;{&lt;br /&gt;[Fact]&lt;br /&gt;public void ConvertTest()&lt;br /&gt;{&lt;br /&gt;string file2convert = @"C:\sqlCE35.sdf";&lt;br /&gt;var sqlCEConverter = new SqlCEVersionConverter(file2convert);&lt;br /&gt;Assert.True(sqlCEConverter.Convert());&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Так я представляю себе работу нашего конвертера. Тест, конечно же, не срабатывает - ведь класс SqlCEVersionConverter не реализован. Этим и займемся. Добавим в главный проект новый класс, SqlCEVersionConverter. Пока нам нужно сделать минимум телодвижений, чтобы заставить тест сработать - делаем фейковую реализацию:&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;public class SqlCEVersionConverter&lt;br /&gt;{       &lt;br /&gt;public SqlCEVersionConverter(string file2convert)&lt;br /&gt;{&lt;br /&gt;}&lt;br /&gt;public bool Convert()&lt;br /&gt;{&lt;br /&gt;var result = true;&lt;br /&gt;return result;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Запускаем тест... Ура! Тест сработал. Теперь посмотрим, что нам нужно для того, чтобы метод Convert() заработал по-настоящему. Нам нужно подключиться к выбранной базе данных и заапгрейдить ее.&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;public bool Convert()&lt;br /&gt;{&lt;br /&gt;var result = false;&lt;br /&gt;using (SqlCeEngine sqlCeEngine = new SqlCeEngine(connectionString))&lt;br /&gt;{&lt;br /&gt;try&lt;br /&gt;{&lt;br /&gt;    sqlCeEngine.Upgrade();&lt;br /&gt;    result = true;  &lt;br /&gt;}&lt;br /&gt;catch (Exception e)&lt;br /&gt;{   &lt;br /&gt;    //обработка исключения&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;return result;&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Код не компилируется (F6)  - не хватает строки соединения (connectionString). Добавляем новое поле в класс. Теперь код компилируется, но тест не срабатывает - мы используем пустую connectionString, из-за чего и не можем подключиться к БД, чтобы переконвертировать ее. Значит, нам нужен метод, который бы создавал строку подключения. Настало время писать следующий тест.&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;[Fact]&lt;br /&gt;public void BuildConnectionStringTest()&lt;br /&gt;{&lt;br /&gt;string sqlCEdbFile = @"C:\sqlCE35.sdf";&lt;br /&gt;var converter = new SqlCEVersionConverter(file2convert);&lt;br /&gt;string connectionString = converter.BuildConnectionString(sqlCEdbFile);&lt;br /&gt;Assert.Equal(@"Data Source=C:\sqlCE35.sdf;Mode=Exclusive", connectionString);&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Код не компилируется, нужно реализовать метод BuildConnectionString():&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;public string BuildConnectionString(string sqlCEdbPath)&lt;br /&gt;{&lt;br /&gt;SqlCeConnectionStringBuilder builder = new SqlCeConnectionStringBuilder();&lt;br /&gt;builder["Data Source"] = sqlCEdbPath;&lt;br /&gt;builder["Mode"] = "Exclusive";&lt;br /&gt;return builder.ConnectionString;&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;В реализации этого метода мы сразу опробовали новый API slq ce 4 - класс &lt;code class="prettyprint"&gt;SqlCeConnectionStringBuilder.&lt;/code&gt; Ничего так, удобненько :)&lt;br /&gt;Теперь изменим конструктор SqlCEVersionConverter:&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;public SqlCEVersionConverter(string file2convert)&lt;br /&gt;{&lt;br /&gt;connectionString = BuildConnectionString(file2convert);&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Запускаем тест - тест проходит. Look nice. Но что-то не то. Дааа, ведь база данных может быть запаролена! Это значит, что нам нужен для конвертирования бд знать еще и пароль! Т.е. нам нужен еще конструктор, принимающий два аргумента (путь к файлу бд и пароль) и  метод BuildConnectionString, тоже на два аргумента. Пишем соответствующие тесты (позволю себе пропустить их) и добавляем реализацию в класс SqlCEVersionConverter. Запускаем - тесты срабатывают! Но все равно мне не нравятся эти два метода BuildConnectionString, засоряют они своим присутствием ауру конвертера :) Во-первых, эти методы должны быть явно приватными. Но тогда их не потестишь. Во-вторых, конвертер должен конвертировать, а тут ему еще вписали в обязанности connection strings делать. Не порядок. Это явно противоречит &lt;a href="http://en.wikipedia.org/wiki/Single_responsibility_principle"&gt;Single Responsible Principle&lt;/a&gt;. Я сделаю небольшой рефакторинг - вынесу эти два метода в отдельный класс SqlCEConnectionStringBuilder. Но для этого сначала напишу соответствующие тесты. Ниже тест SqlCEConnectionStringBuilder.BuildConnectionString() на два аргумента:&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;[Fact]&lt;br /&gt;public void BuildConnectionStringTest()&lt;br /&gt;{&lt;br /&gt;string sqlCEdbFile = @"C:\sqlCE35.sdf";&lt;br /&gt;string password = "somepassword";&lt;br /&gt;var builder = new SqlCEConnectionStringBuilder();&lt;br /&gt;string connectionString = builder.BuildConnectionString(sqlCEdbFile, password);&lt;br /&gt;Assert.Equal(@"Data Source=C:\sqlCE35.sdf;Mode=Exclusive;Password=somepassword", connectionString);&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Просто копируем тела методов из SqlCEVersionConverter в SqlCEConnectionStringBuilder, запускаем тесты - срабатывают. Теперь изменяем конструкторы SqlCEVersionConverter, таким образом, чтобы использовался класс SqlCEConnectionStringBuilder:&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;public SqlCEVersionConverter(string file2convert, string password)&lt;br /&gt;{&lt;br /&gt;SqlCEConnectionStringBuilder builder = new SqlCEConnectionStringBuilder();&lt;br /&gt;connectionString = builder.BuildConnectionString(file2convert, password);&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;И после этого удаляем из SqlCEVersionConverter методы BuildConnectionString(). Компилируем - все в порядке. Запускаем еще раз для уверенности тесты - все зеленое :)&lt;br /&gt;Теперь осталось сделать форму и нацепить обработку событий. У меня форма получилась такой:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_e8cdtZaFnDI/THZM-Lz_P9I/AAAAAAAAASM/1tFrATgUezw/s1600/converter.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 400px; height: 246px;" src="http://4.bp.blogspot.com/_e8cdtZaFnDI/THZM-Lz_P9I/AAAAAAAAASM/1tFrATgUezw/s400/converter.png" alt="" id="BLOGGER_PHOTO_ID_5509675825340825554" border="0" /&gt;&lt;/a&gt;На форме есть чекбокс - Make backup file before convert. Из-за того, что в sql ce 4 используется SHA-2, sql ce 3.5 или более ранние версии не смогут работать с файлами данных sql ce 4. Поэтому было бы хорошо делать бэкап. А для этого нам нужен SimpleBackuper. Но сначала - тесты! :)&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;public class SimpleBackuperTests&lt;br /&gt;{&lt;br /&gt;[Fact]&lt;br /&gt;public void BackupBeforConvertTest()&lt;br /&gt;{&lt;br /&gt;string file2backup = @"C:\sqlCE35.sdf";&lt;br /&gt;var backuper = new SimpleBackuper();&lt;br /&gt;backuper.MakeBackup(file2backup);&lt;br /&gt;string backupFilename = @"C:\sqlCE35_backup.sdf";&lt;br /&gt;Assert.True(File.Exists(backupFilename));&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Сильно заморачиваться над методом создания бэкапа я не буду - использую простое переименование и копирование.&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;public class SimpleBackuper&lt;br /&gt;{&lt;br /&gt;public void MakeBackup(string file2backup)&lt;br /&gt;{&lt;br /&gt;var backupFileName = file2backup.Insert(file2backup.LastIndexOf('.'), "_backup");&lt;br /&gt;File.Copy(file2backup, backupFileName, true);&lt;br /&gt;return;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Вот теперь осталось совсем немного - написать обработку клика по кнопке Convert. Думаю, это описывать не надо :)&lt;br /&gt;Заметьте, до этого момента мы еще ни разу не запустили программку (F5) - только компилировали (F6)! Время запустить и законвертировать наконец-таки какую-нибудь sql ce 3.5 бд в 4.0! И вот он, сюрприз! База из 3040 Кб - файла превратилась в 676 Кб-файл! Вот это отличная новость четвертого компакта!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Итак, подведем итоги.&lt;/span&gt; Мы разработали приложение в стиле TDD. Получили чистый код, который работает :) Как бонус, у нас получилось отличное отделение логики решаемой задачи от графического пользовательского интерфейса. И мы можем совершенно без страха изменить что-либо или добавить новый функционал в программу.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5342535388237643243-3105617308023904779?l=sly-and-fluffy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sly-and-fluffy.blogspot.com/feeds/3105617308023904779/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://sly-and-fluffy.blogspot.com/2010/08/sqlce-35-to-40-converter.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/3105617308023904779'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/3105617308023904779'/><link rel='alternate' type='text/html' href='http://sly-and-fluffy.blogspot.com/2010/08/sqlce-35-to-40-converter.html' title='SqlCE 3.5 to 4.0 Converter'/><author><name>Tatiana Shemyakina</name><uri>https://profiles.google.com/115825956619949451947</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-4MfXIVcZdJA/AAAAAAAAAAI/AAAAAAAAAbA/Iv1Gt6j8YgI/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_e8cdtZaFnDI/THZM-Lz_P9I/AAAAAAAAASM/1tFrATgUezw/s72-c/converter.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5342535388237643243.post-7871825388117216059</id><published>2010-08-26T08:11:00.007+03:00</published><updated>2010-08-26T12:50:16.562+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ms sql ce'/><title type='text'>MS Sql CE 4 CTP1</title><content type='html'>В июле этого года вышел &lt;strong&gt;SQL Server CE 4&lt;/strong&gt; CTP1, что, конечно же, является хорошей новостью! Скачать sql ce 4 можно с &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=0d2357ea-324f-46fd-88fc-7364c80e4fdb&amp;amp;displaylang=en"&gt;сайта Microsoft&lt;/a&gt;, дистрибутив радует размером - всего 2.5 мб для х64 и 2.0 мб для х32.&lt;br /&gt;Что же нового в четвертом компакте? Много было сделано для использования sql ce в ASP.NET приложениях - теперь компакт выдерживает нагрузку сайтов-стартеров с не большим количеством посещений. Внедрили поддержку SHA 2 - шифрования. Это означает, что для перехода с sql ce 3.5 на 4.0 база данных должна быть предварительно проапгрейдена предусмотренным в API методом &lt;a href="http://msdn.microsoft.com/en-us/library/system.data.sqlserverce.sqlceengine.upgrade.aspx"&gt;SqlCeEngine.Upgrade()&lt;/a&gt;. Так же это означает, что slq ce 3.5 не может работать с файлами данных, созданными четвертым компактом.&lt;br /&gt;Компакт теперь умеет беспроблемно работать с ADO.NET Entity Framework 4.0, что тоже радует :)&lt;br /&gt;Важно отметить, что в четвертом компакте изменился Transact-SQL-синтаксис: добавлены ключевые слова OFFSET &amp;amp; FETCH:&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;SELECT * FROM Employees ORDER BY [Hire Date] OFFSET 10 ROWS;&lt;br /&gt;SELECT * FROM Orders ORDER BY [Shipped Date] OFFSET 2 ROWS FETCH NEXT 1 ROW ONLY;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Так же изменился API:&lt;br /&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ff802050.aspx"&gt;System.Data.SqlServerCe.SqlCeConnection.GetSchema()&lt;/a&gt; - возвращает информацию о базе данных.&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;SqlCeConnection conn = new SqlCeConnection("DataSource=Northwind.sdf");&lt;br /&gt;       try&lt;br /&gt;       {&lt;br /&gt;           conn.Open();&lt;br /&gt;           DataTable dt = conn.GetSchema();&lt;br /&gt;           dt = conn.GetSchema("Tables");&lt;br /&gt;           dt = conn.GetSchema("Columns");&lt;br /&gt;           dt = conn.GetSchema("Indexes");&lt;br /&gt;           dt = conn.GetSchema("IndexColumns");&lt;br /&gt;           dt = conn.GetSchema("ForeignKeys");&lt;br /&gt;       }&lt;br /&gt;       catch (Exception e)&lt;br /&gt;       {&lt;br /&gt;           //Fail&lt;br /&gt;       }&lt;/code&gt;&lt;br /&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/system.data.sqlserverce.sqlceconnectionstringbuilder.aspx"&gt;System.Data.SqlServerCe.SqlCeConnectionStringBuilder&lt;/a&gt; - позволяет легко строит connection strings для компакта.&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;SqlCeConnectionStringBuilder builder =  new SqlCeConnectionStringBuilder();&lt;br /&gt;builder["Data Source"] = sqlCEdbPath;&lt;br /&gt;builder["Mode"] = dbMode;&lt;br /&gt;builder["Password"] = password;&lt;br /&gt;Console.Write( builder.ConnectionString );&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Более подробно об этих и других нововведениях можно почитать в блоге &lt;a href="http://robtiffany.com/sql-server-compact/here-comes-sql-server-compact-4-0"&gt;Rob Tiffany &lt;/a&gt;&lt;br /&gt;А &lt;a href="http://sly-and-fluffy.blogspot.com/2010/08/sqlce-35-to-40-converter.html"&gt;тут&lt;/a&gt; можно почитать о тулзе для конвертирования файлов sql ce 3.5 в slq ce 4.0&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5342535388237643243-7871825388117216059?l=sly-and-fluffy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sly-and-fluffy.blogspot.com/feeds/7871825388117216059/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://sly-and-fluffy.blogspot.com/2010/08/sql-ce-4-ctp1.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/7871825388117216059'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/7871825388117216059'/><link rel='alternate' type='text/html' href='http://sly-and-fluffy.blogspot.com/2010/08/sql-ce-4-ctp1.html' title='MS Sql CE 4 CTP1'/><author><name>Tatiana Shemyakina</name><uri>https://profiles.google.com/115825956619949451947</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-4MfXIVcZdJA/AAAAAAAAAAI/AAAAAAAAAbA/Iv1Gt6j8YgI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5342535388237643243.post-6671655771301135003</id><published>2010-08-20T10:00:00.001+03:00</published><updated>2012-01-30T11:13:53.749+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='юмор'/><category scheme='http://www.blogger.com/atom/ns#' term='разработка ПО'/><title type='text'>В чем измеряется качество кода?</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;a href="http://4.bp.blogspot.com/_e8cdtZaFnDI/TG4ooh9R3TI/AAAAAAAAASE/gkSZKsJiXzk/s1600/6a0120a85dcdae970b012877707a45970c.png"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5507384071095967026" src="http://4.bp.blogspot.com/_e8cdtZaFnDI/TG4ooh9R3TI/AAAAAAAAASE/gkSZKsJiXzk/s400/6a0120a85dcdae970b012877707a45970c.png" style="display: block; height: 362px; margin: 0px auto 10px; text-align: center; width: 400px;" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5342535388237643243-6671655771301135003?l=sly-and-fluffy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sly-and-fluffy.blogspot.com/feeds/6671655771301135003/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://sly-and-fluffy.blogspot.com/2010/08/blog-post_20.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/6671655771301135003'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/6671655771301135003'/><link rel='alternate' type='text/html' href='http://sly-and-fluffy.blogspot.com/2010/08/blog-post_20.html' title='В чем измеряется качество кода?'/><author><name>Tatiana Shemyakina</name><uri>https://profiles.google.com/115825956619949451947</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-4MfXIVcZdJA/AAAAAAAAAAI/AAAAAAAAAbA/Iv1Gt6j8YgI/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_e8cdtZaFnDI/TG4ooh9R3TI/AAAAAAAAASE/gkSZKsJiXzk/s72-c/6a0120a85dcdae970b012877707a45970c.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5342535388237643243.post-4625491855409367125</id><published>2010-08-17T10:54:00.007+03:00</published><updated>2010-09-28T08:42:07.773+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='подкасты для разработчика'/><title type='text'>Подкасты для разработчика</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_e8cdtZaFnDI/TGpS5rRSd9I/AAAAAAAAAR4/MBSWxigjFT4/s1600/podcastlogo.jpg"&gt;&lt;img style="float: left; margin: 0pt 10px 10px 0pt; cursor: pointer; width: 200px; height: 220px;" src="http://1.bp.blogspot.com/_e8cdtZaFnDI/TGpS5rRSd9I/AAAAAAAAAR4/MBSWxigjFT4/s400/podcastlogo.jpg" alt="" id="BLOGGER_PHOTO_ID_5506304645235111890" border="0" /&gt;&lt;/a&gt;Подкасты - это отличный способ получения информации при минимальных затратах времени. Подкасты можно слушать по дороге на работу, в университет, во время утренней пробежки...&lt;br /&gt;Какие подкасты будет интересно слушать разработчику? За всех на этот вопрос не отвечу, но расскажу, какие подкасты я слушаю с удовольствием.&lt;br /&gt;&lt;br /&gt;http://rpod.ru - кладезь подкастов. На любой вкус и цвет. Тут в следует выделить, во-первых, отличные подкасты Петербургской Группы Alt.Net &lt;a href="http://spbaltnet.rpod.ru/"&gt;http://spbaltnet.rpod.ru/&lt;/a&gt; В каждом выпуске подкаста море полезной и интересной информации.&lt;br /&gt;О подкасте:&lt;br /&gt;&lt;blockquote&gt;Петербургская группа Alt.Net создана с целью проведения в  Санкт-Петербурге семинаров и технических встреч, связанных с разработкой  в среде .NET. Наша цель – помочь друг другу узнать больше о том, как  работать в среде .Net, как эффективно использовать различные технологии,  методологии и практики в нашей работе.&lt;/blockquote&gt;&lt;br /&gt;Дальше - &lt;a href="http://domaindrivendesign.rpod.ru/"&gt;Domain Driven Design Study Group.&lt;/a&gt; Тут можно послушать обсуждения книги Эрика Эванса "Domain-Driven Design: Tackling Complexity in the Heart of Software". Всем, кто хочет познакомиться с DDD, стоит обратить внимание на этот подкаст.&lt;br /&gt;&lt;br /&gt;Следующий подкаст - &lt;a href="http://agile.rpod.ru/"&gt;Качественный код и методология Agile&lt;/a&gt;. Название подкаста говорит само за себя. Выпуски небольшие по длительности, один выпуск - одна конкретная тема.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://taop.rpod.ru/"&gt;The Art Of Programming&lt;/a&gt; - ориентирован на Java, Flash/Flex, но тоже интересно послушать.&lt;br /&gt;&lt;a href="http://podcode.ru/category/podcast/"&gt;&lt;br /&gt;&lt;/a&gt;Следующий кладезь подкастов для IT-шника &lt;a href="http://www.dotnetrocks.com/"&gt;http://www.dotnetrocks.com&lt;/a&gt; - The internet radio talk show for .Net developers. В студию приглашаются дотнет разработчики и рассматривается какая-то конкретная тема. Подкаст на английском языке.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.hanselminutes.com/"&gt;http://www.hanselminutes.com&lt;/a&gt; - англоязычный еженедельный подкаст для ASP.NET или Windows разработчиков. В студию приглашаются известные разработчики и дают интервью. Например, интервью с Роем Ошро &lt;a href="http://www.hanselminutes.com/default.aspx?showID=187"&gt;The Art of Unit Testing with Roy Osherove&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://elegantcode.com/elegantcode-cast/"&gt;Elegant Code Cast&lt;/a&gt; и &lt;a href="http://www.se-radio.net/" title="Link to original website"&gt;Software Engineering Radio&lt;/a&gt; - еще две англоязычные подкаст-ленты, которые я с удовольствием слушаю.&lt;br /&gt;&lt;br /&gt;UPD: Spbaltnet переехали. Теперь их нужно искать на podfm.ru &lt;a href="http://spbaltnet.podfm.ru"&gt;http://spbaltnet.podfm.ru&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5342535388237643243-4625491855409367125?l=sly-and-fluffy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sly-and-fluffy.blogspot.com/feeds/4625491855409367125/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://sly-and-fluffy.blogspot.com/2010/08/blog-post.html#comment-form' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/4625491855409367125'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/4625491855409367125'/><link rel='alternate' type='text/html' href='http://sly-and-fluffy.blogspot.com/2010/08/blog-post.html' title='Подкасты для разработчика'/><author><name>Tatiana Shemyakina</name><uri>https://profiles.google.com/115825956619949451947</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-4MfXIVcZdJA/AAAAAAAAAAI/AAAAAAAAAbA/Iv1Gt6j8YgI/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_e8cdtZaFnDI/TGpS5rRSd9I/AAAAAAAAAR4/MBSWxigjFT4/s72-c/podcastlogo.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5342535388237643243.post-7721484166237617152</id><published>2010-07-12T23:34:00.004+03:00</published><updated>2010-07-26T17:07:58.410+03:00</updated><title type='text'>Лето...</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_e8cdtZaFnDI/TE2M_0uMjyI/AAAAAAAAARw/p1pjG_6ze7Q/s1600/58407857_otpusk.jpg"&gt;&lt;img style="float: left; margin: 0pt 10px 10px 0pt; cursor: pointer; width: 400px; height: 285px;" src="http://3.bp.blogspot.com/_e8cdtZaFnDI/TE2M_0uMjyI/AAAAAAAAARw/p1pjG_6ze7Q/s400/58407857_otpusk.jpg" alt="" id="BLOGGER_PHOTO_ID_5498205748201295650" border="0" /&gt;&lt;/a&gt;Лето.... Время отпусков, жары и комаров :) Время лежать на золотом песке под солнышком и ни о чем не думать... Ленивое время, вобщем...&lt;br /&gt;На улице жара, делать ничего не хочется, мысли бессвязно и очень вяло ползают в голове... Работа не идет, вспоминается поговорка "&lt;strong style="font-weight: normal;"&gt;&lt;span style="font-style: italic;"&gt;Если хочешь поработать – ляг, поспи и все пройдет&lt;/span&gt;". Даже кофе не помогает!&lt;br /&gt;Надо как-то себя мотивировать, а ни один способ мотивации не срабатывает...&lt;br /&gt;Нет, один срабатывает, но эффективность все равно не та: через силу начинаю делать и по чуть-чуть увлекаюсь, и пошел процесс.... Последнее, что пришлось делать через принуждение - переписывать код за коллегой... Сначала задание было "чуток дописать", но, увидев "чудеса чудесные, прелести прелестные" пришлось переписать добротный кусок кода, а занятие это не из приятнейших... Само по себе редактирование, правка чужого кода - та еще задача. А если код написан из рук вон плохо, с огромным количеством "code smells" ;( ... Ничего, бывает, пережили...&lt;br /&gt;Главное, что до пятницы осталось совсем немного - еще пятьдесят три минуты рабочего времени понедельника и три дня!&lt;br /&gt;&lt;/strong&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5342535388237643243-7721484166237617152?l=sly-and-fluffy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sly-and-fluffy.blogspot.com/feeds/7721484166237617152/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://sly-and-fluffy.blogspot.com/2010/07/blog-post.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/7721484166237617152'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/7721484166237617152'/><link rel='alternate' type='text/html' href='http://sly-and-fluffy.blogspot.com/2010/07/blog-post.html' title='Лето...'/><author><name>Tatiana Shemyakina</name><uri>https://profiles.google.com/115825956619949451947</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-4MfXIVcZdJA/AAAAAAAAAAI/AAAAAAAAAbA/Iv1Gt6j8YgI/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_e8cdtZaFnDI/TE2M_0uMjyI/AAAAAAAAARw/p1pjG_6ze7Q/s72-c/58407857_otpusk.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5342535388237643243.post-9161375535766632522</id><published>2010-06-26T12:50:00.068+03:00</published><updated>2011-05-26T12:05:13.395+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='рефакторинг'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>Пример рефакторинга кода на C#</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Что такое рефакторинг? М. Фаулер дает следующее определение рефакторинга ("Рефакторинг: улучшение существующего кода"):&lt;br /&gt;&lt;blockquote&gt;Рефакторинг (англ. refactoring) — процесс изменения внутренней структуры программы, не затрагивающий её внешнего поведения и имеющий целью облегчить понимание её работы. В основе рефакторинга лежит последовательность небольших эквивалентных (то есть сохраняющих поведение) преобразований.&lt;/blockquote&gt;Давайте рассмотрим на примере.&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;Задача:&lt;br /&gt;В файл ODBC.INI добавить настройки принтера для устанавливаемой программы. Если настройки для данной программы уже имеются, то заменить их.&lt;br /&gt;Имеется решение:&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;void InstallDriver(string drive)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; string PathToODBCINI = Environment.GetEnvironmentVariable("windir",&amp;nbsp; EnvironmentVariableTarget.Machine) + @"\ODBC.INI";&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (!File.Exists(PathToODBCINI))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; try&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; File.Create(PathToODBCINI).Close();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; catch (Exception e)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MessageBox.Show(e.Message);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; StreamReader sr = new StreamReader(PathToODBCINI,&amp;nbsp;&amp;nbsp;&amp;nbsp; System.Text.ASCIIEncoding.Default);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; string content = sr.ReadToEnd();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; sr.Close();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; int index = content.IndexOf("[ODBC Data Sources]");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (index &amp;gt;= 0)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int lastIndex = content.IndexOf("QEWSD=34751", index) + 11;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; try&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; content = content.Remove(index, lastIndex - index);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; catch&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MessageBox.Show(ERROR_WRONG_PREVIOUS_INSTALLATION);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; };&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; string path_to_driver = Helpers.AppExecFolder + "files\\driver.txt";&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (File.Exists(path_to_driver))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sr = new StreamReader(path_to_driver);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; string driver_text = sr.ReadToEnd();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; driver_text = driver_text.Replace("{1}", drive);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sr.Close();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; try&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; StreamWriter sw = new StreamWriter(File.OpenWrite(PathToODBCINI), System.Text.ASCIIEncoding.Default);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; string config = String.Format("{0}{1}", driver_text, content);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sw.Write(config);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sw.Close();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MessageBox.Show("Installation completed");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; catch&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MessageBox.Show(e1.Message);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MessageBox.Show(String.Format("Cannot find file {0}", path_to_driver));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Один метод делает всё... Хороший пример того, как не надо писать код. Сколько разных &lt;a href="http://en.wikipedia.org/wiki/Code_smell"&gt;запахов&lt;/a&gt; тут смешалось воедино...&lt;br /&gt;Давайте рассмотрим, что делает этот код, в виде последовательности действий:&lt;br /&gt;0. Находит (или создает, если файл не существует) ODBC.INI&lt;br /&gt;1. Получает содержимое ODBC.INI&lt;br /&gt;2. Проверяет наличие настроек для программы и удаляет их&lt;br /&gt;3. Формирует новые настройки&lt;br /&gt;4. Записывает новые настройки в ODBC.INI&lt;br /&gt;Давайте для начала разобъём этот метод на 5 отдельных методов в соответствии с выделенными действиями. Что получается:&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;string GetODBCINIPath()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; string _PathToODBCINI = Environment.GetEnvironmentVariable("windir", EnvironmentVariableTarget.Machine) + @"\ODBC.INI";&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (!File.Exists(_PathToODBCINI))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; File.Create(_PathToODBCINI).Close();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return _PathToODBCINI;&lt;br /&gt;}&lt;br /&gt;string GetODBCINIContent(string PathToODBCINI)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; using (StreamReader sr = new StreamReader(PathToODBCINI, System.Text.ASCIIEncoding.Default))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; string content = sr.ReadToEnd();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return content;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}&lt;br /&gt;string GetClearDriverSettings(string commonSettings)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; string clearSettings = commonSettings;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; int index = commonSettings.IndexOf("[ODBC Data Sources]");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (index &amp;gt;= 0)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int lastIndex = commonSettings.IndexOf("QEWSD=34751", index) + 11;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; clearSettings = commonSettings.Remove(index, lastIndex - index);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; };&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return clearSettings;&lt;br /&gt;}&lt;br /&gt;string MakeNewSettings(string drive, string oldSettings)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; string driver_text = String.Empty;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; string path_to_driver = Path.Combine(Helpers.AppExecFolder, "files\\driver.txt");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (File.Exists(path_to_driver))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; using(StreamReader sr = new StreamReader(path_to_driver))&lt;/code&gt;&lt;br /&gt;&lt;code class="prettyprint"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/code&gt;&lt;br /&gt;&lt;code class="prettyprint"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; string driver_text = sr.ReadToEnd();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; driver_text = driver_text.Replace("{1}", drive);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; string newSettings = String.Concat(driver_text, oldSettings);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return newSettings;&lt;br /&gt;}&lt;br /&gt;bool SetNewDriverSettings(string new_settings, string PathToODBCINI)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; bool result = true;&lt;/code&gt;&lt;br /&gt;&lt;code class="prettyprint"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; using (StreamWriter sw = new StreamWriter(File.OpenWrite(PathToODBCINI), System.Text.ASCIIEncoding.Default))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; try&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sw.Write(new_settings);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; catch&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; result = false;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return result;&lt;br /&gt;}&lt;br /&gt;void InstallDriver(string drive)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; string PathToODBCINI = GetODBCINIPath();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; string commonSettings = GetODBCINIContent(PathToODBCINI);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; string clearSettings = GetClearDriverSettings(commonSettings);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; string newSettings = MakeNewSettings(drive, clearSettings);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (SetNewDriverSettings(newSettings, PathToODBCINI))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MessageBox.Show("Installation completed");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; else&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MessageBox.Show("Error");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Теперь это выглядит немного лучше, но всё еще плохо. В глаза бросается PathToODBCINI, который используется в нескольких методах. Если присмотреться к этим методам, то мы увидим, что всех их объединяет работа с ODBC.INI, то есть логичнее будет выделить эти методы в отдельный класс. Заодно перенесем туда и назойливый PathToODBCINI. Получим:&lt;br /&gt;&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;class OdbcIniProvider&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private string PathToODBCINI;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public OdbcIniProvider()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PathToODBCINI = GetODBCINIPath();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private string GetODBCINIPath()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; string _PathToODBCINI = Environment.GetEnvironmentVariable("windir", EnvironmentVariableTarget.Machine) + @"\ODBC.INI";&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (!File.Exists(_PathToODBCINI))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; File.Create(_PathToODBCINI).Close();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return _PathToODBCINI;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public string GetODBCINIContent()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; using (StreamReader sr = new StreamReader(PathToODBCINI, System.Text.ASCIIEncoding.Default))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/code&gt;&lt;code class="prettyprint"&gt;return&lt;/code&gt;&lt;code class="prettyprint"&gt; sr.ReadToEnd();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public bool SetNewDriverSettings(string new_settings)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; bool result = true;&lt;/code&gt;&lt;br /&gt;&lt;code class="prettyprint"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; using (StreamWriter sw = new StreamWriter(File.OpenWrite(PathToODBCINI), System.Text.ASCIIEncoding.Default))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; try&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sw.Write(new_settings);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; catch&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; result = false;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return result;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}&lt;br /&gt;...&lt;br /&gt;void InstallDriver(string drive)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp; OdbcIniProvider odbcIniProvider = new OdbcIniProvider();&lt;br /&gt;&amp;nbsp;&amp;nbsp; string commonSettings = odbcIniProvider.GetODBCINIContent();&lt;br /&gt;&amp;nbsp;&amp;nbsp; string clearSettings = GetClearDriverSettings(commonSettings);&lt;br /&gt;&amp;nbsp;&amp;nbsp; string newSettings = MakeNewSettings(drive, clearSettings);&lt;br /&gt;&amp;nbsp;&amp;nbsp; if (odbcIniProvider.SetNewDriverSettings(newSettings))&lt;br /&gt;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MessageBox.Show("Installation completed");&lt;br /&gt;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp; else&lt;br /&gt;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MessageBox.Show("Error");&lt;br /&gt;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Теперь присмотримся к оставшимся двум методам. Их тоже не мешало бы вынести в отдельный класс, который будет заниматься созданием и установкой новых настроек. Получим:&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;class SettingsManager&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public SettingsManager(){}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public string GetClearDriverSettings(string commonSettings)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; string clearSettings = commonSettings;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int index = commonSettings.IndexOf("[ODBC Data Sources]");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (index &amp;gt;= 0)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int lastIndex = commonSettings.IndexOf("QEWSD=34751", index) + 11;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; clearSettings = commonSettings.Remove(index, lastIndex - index);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; };&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return clearSettings;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public string MakeNewSettings(string drive, string oldSettings)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; string driver_text = String.Empty;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; string path_to_driver = Path.Combine(Helpers.AppExecFolder, "files\\driver.txt");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (File.Exists(path_to_driver))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; using(StreamReader sr = new StreamReader(path_to_driver))&lt;/code&gt;&lt;br /&gt;&lt;code class="prettyprint"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/code&gt;&lt;br /&gt;&lt;code class="prettyprint"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; string driver_text = sr.ReadToEnd();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; driver_text = driver_text.Replace("{1}", drive);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; string newSettings = String.Concat(driver_text, oldSettings);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return newSettings;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Коренным образом ситуация не улучшилась. Мне совершенно не нравится, как взаимодействуют OdbcIniProvider и SettingsManager. Кроме того, SettingsManager имеет слишком много открытых методов, о которых вызывающему коду совершенно не обязательно знать. По сути, вызывающему коду достаточно одного метода SetNewSettings(string drive), т.е. :&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;class SettingsManager&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp; ...&lt;br /&gt;&amp;nbsp;&amp;nbsp; public bool SetNewSettings(string drive)&lt;br /&gt;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; OdbcIniProvider odbcIniProvider = new OdbcIniProvider();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; string commonSettings = odbcIniProvider.GetODBCINIContent();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; string clearSettings = GetClearDriverSettings(commonSettings);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; string newSettings = MakeNewSettings(drive, clearSettings);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return odbcIniProvider.SetNewDriverSettings(newSettings);&lt;br /&gt;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}&lt;br /&gt;...&lt;br /&gt;void InstallDriver(string drive)&lt;br /&gt;{  &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SettingsManager settingsManager = new SettingsManager();&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (settingsManager.SetNewSettings(drive))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MessageBox.Show("Installation completed");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; else&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MessageBox.Show("Error");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Уже лучше, но такой подход тоже имеет свои недостатки. Например, что, если придется менять настройки не в файле, а в реестре? Придется переписывать SettingsManager, добавляя в него новый метод либо еще что-то в таком же духе... Давайте избавимся от такого рода зависимости сразу же. Для этого выделим интерфейс ISettingsProvider для классов, которые будут отвечать за конкретные способы получения и установки настроек:&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;interface ISettingsProvider&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; string GetSettings();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; bool SetSettings(string new_settings);&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;И сразу же перепишем наш OdbcIniProvider под этот интерфейс:&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;class OdbcIniProvider : ISettingsProvider&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public string GetSettings() {...}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public bool SetSettings(string new_settings) {...}&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Теперь хотелось бы иметь возможность сконфигурировать SettingsManager на использование конкретного провайдера извне. Подправим немного класс SettingsManager, добавив в него метод для установки провайдера настроек:&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;class SettingsManager&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private ISettingsProvider settingsProvider;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void SetSettingsProvider(ISettingsProvider _settingsProvider)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; settingsProvider = _settingsProvider;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;...&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;В итоге, получилось следующее:&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;class SettingsManager&lt;br /&gt;{...&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public bool SetNewSettings(string drive)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {     &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; string commonSettings = settingsProvider.GetSettings();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; string clearSettings = GetClearDriverSettings(commonSettings);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; string newSettings = MakeNewSettings(drive, clearSettings);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return settingsProvider.SetSettings(newSettings);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}&lt;br /&gt;...&lt;br /&gt;void InstallDriver(string drive)&lt;br /&gt;{     &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SettingsManager settingsManager = new SettingsManager();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; settingsManager.SetSettingsProvider(new OdbcIniProvider());&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (settingsManager.SetNewSettings(drive))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MessageBox.Show("Installation completed");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; else&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MessageBox.Show("Error");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Теперь выглядит лучше, но... а что, если форматирование настроек будет различаться? Просится, просится класс SettingsFormatter, реализующий интерфейс ISettingsFormatter... Пусть это будет домашним заданием ;)&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5342535388237643243-9161375535766632522?l=sly-and-fluffy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sly-and-fluffy.blogspot.com/feeds/9161375535766632522/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://sly-and-fluffy.blogspot.com/2010/06/c.html#comment-form' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/9161375535766632522'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/9161375535766632522'/><link rel='alternate' type='text/html' href='http://sly-and-fluffy.blogspot.com/2010/06/c.html' title='Пример рефакторинга кода на C#'/><author><name>Tatiana Shemyakina</name><uri>https://profiles.google.com/115825956619949451947</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-4MfXIVcZdJA/AAAAAAAAAAI/AAAAAAAAAbA/Iv1Gt6j8YgI/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5342535388237643243.post-5108585116151084371</id><published>2010-06-16T12:27:00.033+03:00</published><updated>2010-08-27T08:50:21.400+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='разработка ПО'/><category scheme='http://www.blogger.com/atom/ns#' term='переводы'/><title type='text'>10 поговорок, которые  должен знать каждый программист</title><content type='html'>Перевод поста "10 Programming Proverbs Every Developer Should  Know" Кевина Панга.  Оригинал &lt;a href="http://www.kevinwilliampang.com/2008/10/07/10-programming-proverbs-every-developer-should-know/"&gt;тут&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Поговорки выражают общеизвестные истины или жизненные уроки в короткой и запоминающейся форме. Я считаю, что это отличный способ вести дела - и в личной жизни, и на работе. Поэтому я выделил 10 поговорок, которые каждый программист должен иметь в своем арсенале.&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;1. Нет дыма без огня&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_e8cdtZaFnDI/TBiZ4rn7uJI/AAAAAAAAAQo/2geiB4276jY/s1600/Smoke.jpg"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 400px; height: 266px;" src="http://4.bp.blogspot.com/_e8cdtZaFnDI/TBiZ4rn7uJI/AAAAAAAAAQo/2geiB4276jY/s400/Smoke.jpg" alt="" id="BLOGGER_PHOTO_ID_5483301745385519250" border="0" /&gt;&lt;/a&gt;&lt;span style="font-style: italic;"&gt;Расслабьтесь, это, скорее всего, очередные учения у пожарников :)&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Плохо спроектированный код, как правило, имеет некоторые общие признаки:&lt;br /&gt;1) Гигантские классы и/или методы&lt;br /&gt;2) Большие блоки закомментированного кода&lt;br /&gt;3) Дублирование логики&lt;br /&gt;4) Глубоко вложенные if/else блоки&lt;br /&gt;Разработчики часто называют это как &lt;a href="http://en.wikipedia.org/wiki/Code_smell"&gt;"код с душком" (code smells)&lt;/a&gt;, но я считаю, что термин "коптящий код " или "дымящийся код " больше выражает уровень опасности, которой обладает данный код. Если вы не исправите проблему, лежащую в основе, позже она вернется, чтобы сжечь вас.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;2. Унция профилактики стоит фунта лечения&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_e8cdtZaFnDI/TB8MCKAmHAI/AAAAAAAAAQw/VxNqr8iwsow/s1600/Nurse.jpg"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 292px; height: 400px;" src="http://4.bp.blogspot.com/_e8cdtZaFnDI/TB8MCKAmHAI/AAAAAAAAAQw/VxNqr8iwsow/s400/Nurse.jpg" alt="" id="BLOGGER_PHOTO_ID_5485116102346677250" border="0" /&gt;&lt;/a&gt;&lt;span style="font-style: italic;"&gt;Хорошо, уговорили :)&lt;/span&gt; &lt;/div&gt;&lt;br /&gt;Автомобильная компания Toyota в 1980-х прославилась эффективностью благодаря революционному подходу к борьбе с браком. Каждый работник получил возможность остановить производство, если заметит проблему в своем секторе. Идея заключалась в том, что лучше остановить производство и исправить проблему как можно раньше, чем продолжать производство бракованных деталей, замена / починка / &lt;span class="translation"&gt;аннулирование которых позже обойдется гораздо дороже.&lt;br /&gt;Программисты часто делают неверное предположение, что продуктивность = быстрое производство кода. Многие программисты принимаются кодировать без предварительного обдумывания дизайна. К сожалению, &lt;/span&gt;подход&lt;span class="translation"&gt; &lt;/span&gt;&lt;a href="http://en.wikipedia.org/wiki/Leeroy_Jenkins"&gt;Leeroy Jenkins&lt;/a&gt; к разработке программного обеспечения приводит к неряшливому и хрупкому коду, который требует постоянного контроля и патчей - даже, если требуется заменить всего одну строчку. Таким образом, производительность должна измеряться не только временем, которое затраченным на написание кода, но и временем, затраченным на его отладку. Быстрый выигрыш может обернуться дорогостоящими потерями, если не быть осторожным.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;3. Не кладите все яйца в одну корзину&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://en.wikipedia.org/wiki/Bus_factor"&gt;Bus factor&lt;/a&gt; для команд разработчиков определяется как "общее количество ключевых программистов, недееспособность которых (например, если попадут под автобус) повергнет проект в такой хаос, что его дальнейшее развитие станет невозможным."&lt;br /&gt;Иначе говоря, что произойдет, если вы потеряете главного разработчика команды? Будут ли дела идти как обычно дальше или всё остановится?&lt;br /&gt;К сожалению, большинство команд разработчиков ожидает второй вариант. Такие команды превращают своих программистов в доменных экспертов, которые занимаются только теми вопросами, которые попадают в область их компетенции. На первый взгляд, это довольно разумный подход. Если такое работает в автомобилестроении, почему бы и не для команд разработчиков? В конце концов, неразумно ожидать, что каждый член команды будет разбираться во всех нюансах, имеющихся в приложении, да?&lt;br /&gt;Проблема в том, что разработчика нельзя просто взять и заменить. Этот метод хорошо работает до тех пор, пока все члены команды вместе, но сразу же перестает работать, как только доменный эксперт выбывает из команды из-за перехода в другое место, болезни или если его вдруг собьет автобус. Крайне необходимо, чтобы команда имела резерв. Ревизии кода, парное программирование, общее владение - благодаря этим практикам каждый член команды хотя бы поверхностно будет знаком с другими частями разрабатываемой системы, а не только с той частью, разработкой которой он занимается.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;4. Что посеешь, то и пожнешь&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_e8cdtZaFnDI/TB9MxHs-fwI/AAAAAAAAAQ4/byTUKXwlkIE/s1600/SowReap.jpg"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 313px; height: 376px;" src="http://4.bp.blogspot.com/_e8cdtZaFnDI/TB9MxHs-fwI/AAAAAAAAAQ4/byTUKXwlkIE/s400/SowReap.jpg" alt="" id="BLOGGER_PHOTO_ID_5485187277925547778" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://en.wikipedia.org/wiki/Pragmatic_Programmer"&gt;"Программист-прагматик"&lt;/a&gt; о &lt;a href="http://en.wikipedia.org/wiki/Fixing_Broken_Windows"&gt;теории разбитых окон&lt;/a&gt;:&lt;br /&gt;&lt;blockquote&gt;Не оставляйте "разбитые окна" (неудачные конструкции, неверные решения или некачественный текст программы) без внимания. Как только вы их обнаружите, чините сразу. Если нет времени на надлежащий ремонт, забейте окно досками. Наверняка вы сможете закомментировать ошибочный фрагмент или вывести на экран сообщение "В стадии разработки", или использовать фиктивные данные. Необходимо предпринять хотя бы малейшее действие, чтобы предотвратить дальнейшее разрушение, и показать, что вы контролируете ситуацию.&lt;br /&gt;Мы видели, как безошибочные, функциональные системы быстро портились, как только окна начали разбиваться. Существуют и другие факторы, которые вносят свой вклад в порчу программ, и мы коснемся некоторых из них далее, но небрежность ускоряет порчу быстрее, чем любой другой фактор.&lt;/blockquote&gt;В двух словах: хороший код порождает хороший код так же , как и плохой код порождает плохой код. Никто не хочет разбираться в плохом коде, и никто не хочет уродовать красивый код. Пишите правильно, и у вашего кода будет гораздо больше шансов выдержать экзамен временем.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;5. Поспешишь - людей насмешишь&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Менеджеры, клиенты и программисты становятся более нервными с каждым днем. Все должно быть сделано, и сделано должно быть сейчас. Из-за этого все труднее бороться с соблазном использовать хаки и быстрые решения.&lt;br /&gt;Нет времени для тщательного юнит-тестирования новой фичи? &lt;span style="font-style: italic;"&gt;Ладно, это работает для одного написанного теста. Мы всегда сможем вернуться к этому позже.&lt;/span&gt;&lt;br /&gt;Загадочная ошибка при обращении к свойству Y объекта? &lt;span style="font-style: italic;"&gt;Обернем этот кусок кода в try/catch. Мы должны ловить рыбу побольше!&lt;/span&gt;&lt;br /&gt;Знакомо? Все мы иногда делаем так. В некоторых случаях это простительно. В конце концов, у нас есть сроки и менеджеры с клиентами, которых надо удовлетворить. Но если начать злоупотреблять этим, то очень скоро вы погрязнете в ненадежном коде, полном хотфиксов, дублирующейся логики, непротестированных решений и оберточной обработки ошибок. Вы должны найти золотую середину межды "сделано" и "правильно сделано".&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;6. Семь раз отмерь, один раз отрежь&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_e8cdtZaFnDI/TB9UF6QSsrI/AAAAAAAAARA/7S4rpPg8s1g/s1600/Agile.gif"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 400px; height: 139px;" src="http://3.bp.blogspot.com/_e8cdtZaFnDI/TB9UF6QSsrI/AAAAAAAAARA/7S4rpPg8s1g/s400/Agile.gif" alt="" id="BLOGGER_PHOTO_ID_5485195331674223282" border="0" /&gt;&lt;/a&gt;Термин "&lt;a href="http://en.wikipedia.org/wiki/Agile_development"&gt;Гибкая разработка&lt;/a&gt;" слишком часто используется и злоупотребляется программистами как оправдания для пропуска фазы планирования /проектирования разработки программного обеспечения. Мы творцы, и поэтому мы получаем удовольствие, видя реальный прогресс в конечном продукте. Удивительно, что &lt;a href="http://en.wikipedia.org/wiki/UML_Diagram#Diagrams"&gt;UML-диаграммы&lt;/a&gt; и &lt;a href="http://en.wikipedia.org/wiki/Use_case"&gt;case-средства&lt;/a&gt; не могу удовлетворить это желание. Поэтому мы, разработчики, зачастую начинаем кодировать без малейшего понятия, что мы делаем и куда мы движемся. Это как пойти обедать, когда еще не решил, куда хочешь пойти. Ты голоден и хочешь как можно скорее найти ресторан и заказать столик. Вместо этого, ты садишься в свою машину и думаешь, что по дороге что-нибудь решишь. В итоге, получается дольше, потому что ты ездишь зигзагами и остановишься в ресторане, в котором будут долго готовить. В конце концов, ты, вероятно, получишь свою еду :) , но, скорее всего, мясо будет не таким, как ты хотел, и все это займет больше времени, чем, если бы ты предварительно позвонил и заказал столик  в ресторане, в который бы хотел пойти.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;7. Когда твой инструмент - молоток, то все похоже на гвозди&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_e8cdtZaFnDI/TB9aMqZWhJI/AAAAAAAAARI/xOBGqa-vJLY/s1600/SquarePegRoundHole.jpg"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 272px; height: 322px;" src="http://2.bp.blogspot.com/_e8cdtZaFnDI/TB9aMqZWhJI/AAAAAAAAARI/xOBGqa-vJLY/s400/SquarePegRoundHole.jpg" alt="" id="BLOGGER_PHOTO_ID_5485202044746106002" border="0" /&gt;&lt;/a&gt;&lt;span style="font-style: italic;"&gt;А ведь я говорил, что для этого проекта нужен Active Record!&lt;/span&gt; &lt;/div&gt;&lt;br /&gt;Программисты имеют склонность быть ограниченными в выборе инструментов. Если однажды что-то сработало для одного проекта, то мы будем настаивать в использовании этого же во всех последующих проектах. Изучить что-либо новое может быть трудно и, порой, безрезультатно. Мы думаем "Это будет проще, если я все сделаю, как в прошлый раз." Немного таких мыслей, и мы просто будем использовать то, что есть, даже если это не совсем подходит в данном случае.&lt;br /&gt;Легко использовать то, чем умеешь пользоваться, но в долгосрочной перспективе лучше выбирать более подходящие инструменты. Иначе вы будете забивать квадратные колышки в круглые отверстия до конца вашей карьеры.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;8. Молчание - знак согласия&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_e8cdtZaFnDI/TB9g3Ar_OjI/AAAAAAAAARQ/Yd1SeJT7TPo/s1600/Schultz.jpg"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 180px; height: 232px;" src="http://1.bp.blogspot.com/_e8cdtZaFnDI/TB9g3Ar_OjI/AAAAAAAAARQ/Yd1SeJT7TPo/s400/Schultz.jpg" alt="" id="BLOGGER_PHOTO_ID_5485209369354123826" border="0" /&gt;&lt;/a&gt;&lt;span style="font-style: italic;"&gt;I see nothing. Nuh-thing.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Это связано и с теорией разбитых окон, и инертностью программирования, только в большем масштабе. Сообщество программистов именно сообщество. Профессия отражается на каждом. Чем больше плохого кода "на свободе", тем больше он преобретает статус кво. Если вы не пытаетесь хороший, чистый, отвещающий требованиям &lt;a href="http://codebetter.com/blogs/david_laribee/archive/2008/09/09/why-solid-gimme-an-s.aspx"&gt;SOLID&lt;/a&gt; код, вам придется работать с ним день за днем сначала.&lt;br /&gt;Кроме того, если вы увидели плохо спроектированный код, вы должны попытаться исправить это вместе с автором кода. Хочу отметить, в такой ситуации нужно использовать чувство такта. В общем, программисты признают, что не знают всего о разработке программного обеспечения, и оценят ваш жест. Мы все получаем пользу, когда помогаем друг другу. Закрывая глаза на проблемы, мы только усугубляем их.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;9. Лучше синица в руке, чем журавль в небе&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Есть время, когда нужно обсуждать архитектуру системы и возможные рефакторинги, а есть время, когда все это нужно реализовывать. Важно взвесить все за и против пересмотра чего-либо уже работающего только ради того, чтобы сделать это немного чище. Это, конечно, замечательная цель, но всегда будет иметься код, который вы хотите отрефакторить. Мир программирования слишком изменчив, чтобы держать код постоянно неустаревшим. Но в какой-то момент вы должны предоставить результат заказчикам. Вспоминается простой факт: невозможно делать две вещи одновременно. Чем больше времени вы проводите за рефакторингом старого кода, тем меньше времени остается на создание нового. Нахождение золотой середины очень важно для введения в эксплуатацию вашей системы в срок.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;10. С властью приходит и ответственность&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_e8cdtZaFnDI/TB9tdHGh57I/AAAAAAAAARg/3Vz3eHFC7Dk/s1600/Spiderman.jpg"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 276px; height: 400px;" src="http://3.bp.blogspot.com/_e8cdtZaFnDI/TB9tdHGh57I/AAAAAAAAARg/3Vz3eHFC7Dk/s400/Spiderman.jpg" alt="" id="BLOGGER_PHOTO_ID_5485223218050623410" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Программное обеспечение, бесспорно, стало неотъемлемой и важной частью нашей жизни. Поэтому практика разработки хорошего программного обеспечения важна как никогда. Одно дело, когда имеется ошибка в игре Пинг-пог, и совсем другое, если ошибка в системе навигации космических кораблей или в системе управления воздушными полетами.  &lt;a href="http://slashdot.org/"&gt;Slashdot&lt;/a&gt; недавно опубликовал &lt;a href="http://tech.slashdot.org/article.pl?sid=08/09/10/203233&amp;amp;from=rss"&gt;статью&lt;/a&gt;, в которой рассказывается, как из-за незначительных сбоев в &lt;a href="http://www.google.com/news"&gt;Google News&lt;/a&gt; акционеры потеряли $1.14 биллиона. Случаи, наподобие этого, показывают, какой властью мы наделены. Немного страшно представить, что код, который вы пишете сегодня, хотите вы того или нет, однажды может быть повторно использован в критически важной системе. Пишите соответственно.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5342535388237643243-5108585116151084371?l=sly-and-fluffy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sly-and-fluffy.blogspot.com/feeds/5108585116151084371/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://sly-and-fluffy.blogspot.com/2010/06/10_16.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/5108585116151084371'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/5108585116151084371'/><link rel='alternate' type='text/html' href='http://sly-and-fluffy.blogspot.com/2010/06/10_16.html' title='10 поговорок, которые  должен знать каждый программист'/><author><name>Tatiana Shemyakina</name><uri>https://profiles.google.com/115825956619949451947</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-4MfXIVcZdJA/AAAAAAAAAAI/AAAAAAAAAbA/Iv1Gt6j8YgI/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_e8cdtZaFnDI/TBiZ4rn7uJI/AAAAAAAAAQo/2geiB4276jY/s72-c/Smoke.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5342535388237643243.post-6883119846437494050</id><published>2010-06-15T18:38:00.016+03:00</published><updated>2010-08-27T08:50:39.906+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='разработка ПО'/><category scheme='http://www.blogger.com/atom/ns#' term='переводы'/><title type='text'>Топ 10 вещей, которые бесят программистов</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_e8cdtZaFnDI/TBehymhInKI/AAAAAAAAAQg/W-Izp8A3jpA/s1600/xena.jpg"&gt;&lt;img style="float: left; margin: 0pt 10px 10px 0pt; cursor: pointer; width: 316px; height: 400px;" src="http://4.bp.blogspot.com/_e8cdtZaFnDI/TBehymhInKI/AAAAAAAAAQg/W-Izp8A3jpA/s400/xena.jpg" alt="" id="BLOGGER_PHOTO_ID_5483028962051923106" border="0" /&gt;&lt;/a&gt;Перевод поста "Top 10 Things That Annoy Programmers" Кевина Панга. Оригинал &lt;a href="http://www.kevinwilliampang.com/2008/08/28/top-10-things-that-annoy-programmers/"&gt;тут&lt;/a&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;10. Комментарии, которые объясняют "как", а не "почему"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;На вводных в программирование курсах студентов учат писать комментарии сразу и часто. Идея заключается в том, что лучше иметь много комментариев, чем мало. К сожалению, многие программисты принимают это как личный вызов и стремятся откомментировать каждую строчку кода. Именно поэтому вы можете часто встречать что-то типа следующего куска кода, взятого &lt;a href="http://www.codinghorror.com/blog/archives/001150.html"&gt;отсюда&lt;/a&gt;:&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;r = n / 2; // Set r to n divided by 2&lt;br /&gt;// Loop while r - (n/r) is greater than t&lt;br /&gt;while ( abs( r - (n/r) ) &amp;gt; t ) {&lt;br /&gt;r = 0.5 * ( r + (n/r) ); // Set r to half of r + (n/r)&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Вы поняли, что делает этот код? Я - нет. Проблема в том, что все комментарии объясняют что код делает, а не зачем он это делает.&lt;br /&gt;Давайте рассмотрим этот же код, откомментированный по другой методологии:&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;// square root of n with Newton-Raphson approximation&lt;br /&gt;r = n / 2;&lt;br /&gt;&lt;br /&gt;while ( abs( r - (n/r) ) &amp;gt; t ) {&lt;br /&gt;r = 0.5 * ( r + (n/r) );&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Теперь намного лучше! Мы до сих пор не понимаем, что тут происходит, но у нас хотя бы есть точка отсчета.&lt;br /&gt;Предназначение комментариев - помочь человеку, читающему код, понять код, а не синтаксис.  Вполне можно предположить, что человек, читающий код, имеет базовое представление о том, как работают циклю, и комментарии типа “// iterate over a list of customers” ни к чему. С чем читатель точно не знаком, так это почему ваш код работает и почему вы выбрали именно это решение, а не другое.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;9. Когда программиста отвлекают&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Очень немногие программисты могу сесть и начать сразу писать код. В большинстве своем, мы больше похожи на поезда, а не на феррари. Нам нужно время, чтобы разогнаться, но разогнавшись, мы можем сделать большой объем работы. К сожалению, очень трудно достигнуть "зоны программирования", когда твой поезд мыслей постоянно останавливается клиентами, менеджерами или другими программистами.&lt;br /&gt;Дело в том, что во время работы над заданием программист должен держать слишком много информации в голове, чтобы просто переключиться на другую задачу, выполнить ее, а потом вернуться к прежней и не сбиться с толку. Прерывания убивают наш поезд мыслей, а, разогнать его опять - это требующий времени, трудоемкий, подверженный огорчениям и , что хуже всего, ошибкам процесс.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;8. Ползучий фичуризм (Scope creep)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Из Википедии:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Scope creep (also called focus creep, requirement creep, feature creep,  and sometimes kitchen sink syndrome) in project management refers to  uncontrolled changes in a project’s scope. This phenomenon can occur  when the scope of a project is not properly defined, documented, or  controlled. It is generally considered a negative occurrence that is to  be avoided.&lt;/blockquote&gt;Ползучий фичуризм превращает относительно простые вещи в ужасно сложные и требующие много времени. Всего лишь несколько невинных нажатий кнопок на клавиатуре для ребят, составляющих требования, и фичи поползли:&lt;br /&gt;1. Версия 1. Показывать карту локации&lt;br /&gt;2. Версия 2. Показывать &lt;span style="font-weight: bold;"&gt;3D&lt;/span&gt; карту локации&lt;br /&gt;3. Версия 3. Показывать &lt;span style="font-weight: bold;"&gt;3D&lt;/span&gt; карту локации и чтоб пользователь просматривать карту с &lt;span style="font-weight: bold;"&gt;эффектом полета через карту&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Арр! То, что было простым 30-минутным заданием, превратилось в ужасную сложную систему, разработка которой займет сотни человеко-часов! Самое плохое, что большинство ползучего фичуризма добавляется во время разработки, что влечет за собой переписание кода, рефакторинг и иногда выбрасывание кода, который был написан перед появлением новой фичи.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;7. Менеджеры ничего не смыслят в программировании&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Менеджмент - нелегкое дело. Люди изматывают - все мы такие хрупкие, непостоянные и каждый из нас должен быть на первом месте. Поддерживать в большой группе людей дух удовлетворения и сплоченности - тяжелая задача. Но это вовсе не означает, что менеджеры имеют привелегию не разбираться в том, что их подчиненные делают. Когда менеджер не понимает базовых концепций нашей (программистов) работы, появляются scope creep'ы, нереалистичные сроки и взаимное разочарование. &lt;span id="result_box" class="medium_text"&gt;&lt;span style="" title=""&gt;Это  довольно распространенная жалоба среди программистов и источник беспокойства.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;6. Документирование собственных приложений&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Заранее хочу сказать, что я знаю о существовании большого количества приложений для генерации документации, но по собственному опыту могу сказать, что они хороши только для документирования API. Если вы разрабатываете приложение, которое пользователи будут использовать ежедневно, то вам придется создать документацию, понятную для неспециалиста (т.е. как работает приложение, устранение проблем и тд).&lt;br /&gt;Нетрудно заметить, что это наводит страх на программистов. Взгляните на open-source проекты. В чем все они дружно просят помочь? В составлении документации.&lt;br /&gt;Думаю, что с уверенностью могу сказать, что говорю за всех программистов во всем мире, когда произношу фразу "&lt;a href="http://en.wikipedia.org/wiki/Trash_of_the_Titans"&gt;Это может сделать кто-нибудь другой?&lt;/a&gt;"&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;5. Приложения без документации&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Я никогда не говорил, что мы не лицемеры :) Программисты постоянно просят включить в проект библиотеки сторонних разработчиков. Для того, чтобы это сделать, &lt;span style="font-weight: bold;"&gt;нужна документация&lt;/span&gt;.  К сожалению, как отмечалось в пункте 6, программисты не любят писать документацию. Да, ирония не обошла нас стороной.&lt;br /&gt;Нет ничего более ужасного, чем пытаться воспользоваться сторонней библиотекой, не имея никаких предположений о том, что делает половина функций из API. Какая разница между &lt;/span&gt;&lt;/span&gt;poorlyNamedFunctionA() и poorlyButSimilarlyNamedFunctionB()? Нужно ли выполнять проверку на NULL перед доступом к полю PropertyX? Думаю, что все это придется выяснить методом проб и ошибок. Эх :(&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;4. Hardware&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Любой программист, которого хоть однажды вызывали разобраться в непонятном сбое на сервере баз данных или выяснить, почему RAID-драйвер работает неправильно, знает, что такое аппаратные проблемы. Существует всеобщее заблуждение, что раз программист работает за компьютером, то он знает, как его чинить. &lt;span id="result_box" class="long_text"&gt;&lt;span style="" title=""&gt;Конечно,  это может быть справедливо для некоторых программистов, но я думаю,  подавляющее большинство из нас не волнует,   что происходит после того, как код оттранслирован в сборку. &lt;/span&gt;&lt;span style="background-color: rgb(255, 255, 255);" title=""&gt;Мы просто хотим, чтобы вещи работали так, как это задумано, чтобы мочь сосредоточиться на более  высокоуровневых задачах.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;3. Неопределенность&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;"Этот веб-сайт не работает". "Фича Х работает неправильно". Это ужасно, когда приходится иметь дело с такими запросами. Меня всегда удивляло раздражение пользователей, когда их просят воспроизвести проблему для программистов. Судя по всему, они не понимают, что описание "оно поломалось, почините это!" дает недостаточно информации для возможности исправить баг.&lt;br /&gt;Программное обеспечение (в большей своей части) предсказуемо. Мы любим его таким. Помогите нам выяснить, где находится ошибка, вместо того, чтобы просто говорить "почините это".&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;2. Другие программисты&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;Программисты не всегда находят общий языка с другими программистами. Шокирует, но это правда. Тут можно составить отдельный топ-10 причин, поэтому я перечислю некоторые общие черты программистов, которые раздражают своих товарищей, а более детально расскажу об этом в отдельном посте:&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;span id="result_box" class="long_text"&gt;&lt;span style="background-color: rgb(255, 255, 255);" title=""&gt;Чрезмерная раздражительность &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span id="result_box" class="long_text"&gt;&lt;span style="background-color: rgb(255, 255, 255);" title=""&gt;Неспособность понять, что есть время для обсуждения архитектуры системы, а есть время для ее реализации&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span id="result_box" class="long_text"&gt;&lt;span style="background-color: rgb(255, 255, 255);" title=""&gt;Неспособность эффективного общения и запутанная терминология&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span id="result_box" class="long_text"&gt;&lt;span style="background-color: rgb(255, 255, 255);" title=""&gt;Преувеличение собственного значения&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span id="result_box" class="long_text"&gt;&lt;span style="background-color: rgb(255, 255, 255);" title=""&gt;Безразличие к коду и проекту&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span id="result_box" class="long_text"&gt;&lt;span style="background-color: rgb(255, 255, 255);" title=""&gt;И последнее, но самое важное, номер один в списке вещей, раздражающих программистов...&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;1. Наш собственный код 6 месяцев спустя&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Смотрели ли вы с ужасом на ваш старый код? Как глупы вы были! И как вообще вы, знающий столько всего, могли написать ЭТО?! Сжечь его, пока никто не видел! :)&lt;br /&gt;Но вы не один.&lt;br /&gt;Мир программирования постоянно меняется. То, что мы считаем лучшими практиками сегодня, завтра уже может устареть. Невозможно написать идеальный код, потому что стандарты оценки кода меняются каждый день. Трудно принять тот факт, что ваша работа, такая прекрасная сегодня, может быть высмеяна завтра. Раздражает ощущение, что мы мало чего достигли, несмотря на изучение новых тулз, моделей, фреймворков  и лучших практик. Меня это раздражает больше всего. Слабое место того, чем мы занимаемся, в необходимости внесения изменений, поэтому я не могу избавиться от ощущения, что я один из &lt;a href="http://en.wikipedia.org/wiki/Sand_mandala"&gt;монахов, рисующих песком. &lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Ну, вот и все. Топ 10 вещей, которые бесят программистов. Если вы чувствуете, что я упустил что-либо, напишите об этом в комментариях!&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5342535388237643243-6883119846437494050?l=sly-and-fluffy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sly-and-fluffy.blogspot.com/feeds/6883119846437494050/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://sly-and-fluffy.blogspot.com/2010/06/10.html#comment-form' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/6883119846437494050'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/6883119846437494050'/><link rel='alternate' type='text/html' href='http://sly-and-fluffy.blogspot.com/2010/06/10.html' title='Топ 10 вещей, которые бесят программистов'/><author><name>Tatiana Shemyakina</name><uri>https://profiles.google.com/115825956619949451947</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-4MfXIVcZdJA/AAAAAAAAAAI/AAAAAAAAAbA/Iv1Gt6j8YgI/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_e8cdtZaFnDI/TBehymhInKI/AAAAAAAAAQg/W-Izp8A3jpA/s72-c/xena.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5342535388237643243.post-8905096854875604939</id><published>2010-05-31T09:04:00.003+03:00</published><updated>2010-05-31T10:04:34.052+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Библиотека'/><title type='text'>Библиотека</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_e8cdtZaFnDI/TANefB2TXSI/AAAAAAAAAQQ/e-l37l5AFQw/s1600/978-5-8459-1296-1.jpg"&gt;&lt;img style="float: left; margin: 0pt 10px 10px 0pt; cursor: pointer; width: 150px; height: 220px;" src="http://1.bp.blogspot.com/_e8cdtZaFnDI/TANefB2TXSI/AAAAAAAAAQQ/e-l37l5AFQw/s400/978-5-8459-1296-1.jpg" alt="" id="BLOGGER_PHOTO_ID_5477325458977807650" border="0" /&gt;&lt;/a&gt;Д. Нильссон. &lt;span style="font-weight: bold;"&gt;Применение DDD и шаблонов проектирования&lt;/span&gt; (&lt;a style="font-weight: bold;" href="http://letitbit.net/download/0345.0e11a485073fa9f2c44fdf52a3a96189/Primenenie_DDD_i_shablonov_proektirovaniya.djvu.html"&gt;скачать&lt;/a&gt;)&lt;br /&gt;Книга о разработке корпоративных программных приложений в среде .NET с  применением шаблонов проектирования. В ней описаны: как строится четкая и  удобная, с точки зрения сохраняемости, модель предметной области  (Domain Model), рассматриваются вопросы проектирования, ориентированного на предметную  область (&lt;strong&gt;DDD&lt;/strong&gt;, или &lt;strong&gt;Domain-Driven Design&lt;/strong&gt;),  разработки посредством тестирования (&lt;strong&gt;TDD&lt;/strong&gt;, или &lt;strong&gt;Test-Driven  Development&lt;/strong&gt;), объектно-реляционное преобразование, т.е. методы, которые относятся к ключевым технологиям  разработки программного обеспечения. По мере развития и усложнения  технологии все большее значение приобретают вопросы правильного  применения методов проектирования, которые налаживают взаимосвязь между пользователями и разработчиками, предметной областью и программным  обеспечением, логикой и хранением информации, проектировщиками баз  данных и программистами.&lt;br /&gt; Большинство примеров кода, в книге, представлено на языке C#, но  материал окажется полезным и пользователей платформы Java.&lt;br /&gt; Книга адресована опытным разработчикам архитектуры и прикладного  программного обеспечения уровня предприятий, в том числе и в среде .NET.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_e8cdtZaFnDI/TANfT3x3ywI/AAAAAAAAAQY/1y_hlf8KKh0/s1600/5-8459-0558-3.jpg"&gt;&lt;img style="float: left; margin: 0pt 10px 10px 0pt; cursor: pointer; width: 150px; height: 220px;" src="http://4.bp.blogspot.com/_e8cdtZaFnDI/TANfT3x3ywI/AAAAAAAAAQY/1y_hlf8KKh0/s400/5-8459-0558-3.jpg" alt="" id="BLOGGER_PHOTO_ID_5477326366807935746" border="0" /&gt;&lt;/a&gt;Р. Мартин, Д. Ньюкирк. &lt;span style="font-weight: bold;"&gt;Быстрая (гибкая) разработка программ: принципы, шаблоны, практика&lt;/span&gt; (&lt;a style="font-weight: bold;" href="http://letitbit.net/download/8479.84686fb76b092ca1ca76f7761c016696/agile_software_development.djvu.html"&gt;скачать&lt;/a&gt;)&lt;br /&gt;Книга рассказывает о различных методиках быстрого (и даже экстремального)  программирования. Изложение начинается с обзора основных понятий  экстремального программирования и завершается готовыми программами, применяемыми на практике. В каждой  главе приведены примеры кода на языках программирования Java и C++. Книга будет полезной руководителям групп программистов, нацеленных на  быструю разработку коммерческих программных проектов, характеризующихся  высоким уровнем качества и минимальной себестоимостью.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5342535388237643243-8905096854875604939?l=sly-and-fluffy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sly-and-fluffy.blogspot.com/feeds/8905096854875604939/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://sly-and-fluffy.blogspot.com/2010/05/blog-post_31.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/8905096854875604939'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/8905096854875604939'/><link rel='alternate' type='text/html' href='http://sly-and-fluffy.blogspot.com/2010/05/blog-post_31.html' title='Библиотека'/><author><name>Tatiana Shemyakina</name><uri>https://profiles.google.com/115825956619949451947</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-4MfXIVcZdJA/AAAAAAAAAAI/AAAAAAAAAbA/Iv1Gt6j8YgI/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_e8cdtZaFnDI/TANefB2TXSI/AAAAAAAAAQQ/e-l37l5AFQw/s72-c/978-5-8459-1296-1.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5342535388237643243.post-4325906083363856427</id><published>2010-05-30T22:58:00.012+03:00</published><updated>2010-05-31T21:22:10.621+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='разработка ПО'/><title type='text'>Комментарии в коде</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_e8cdtZaFnDI/TALizEIcdbI/AAAAAAAAAQI/Ax43wH1MVo4/s1600/comments_image.jpg"&gt;&lt;img style="float: left; margin: 0pt 10px 10px 0pt; cursor: pointer; width: 250px; height: 250px;" src="http://1.bp.blogspot.com/_e8cdtZaFnDI/TALizEIcdbI/AAAAAAAAAQI/Ax43wH1MVo4/s400/comments_image.jpg" alt="" id="BLOGGER_PHOTO_ID_5477189463746311602" border="0" /&gt;&lt;/a&gt;Все мы не раз слышали, что код нужно комментировать, чтобы в нём потом можно было разобраться. Неопытные программисты часто возражают : "Это мой код, и я знаю, что он делает, и не забуду даже через полгода, что значит переменная k в выражении empS += k*arr[i] + bon[i]!" И при этом совершенно не учитывается, что кроме них, этот код могут править другие программисты - те бедолаги, которым придется сопровождать этот код. Но, опять же, комментарии, написанные, лишь бы написать, чтоб не цеплялись, - это еще хуже, чем отсутствие комментариев.&lt;br /&gt;&lt;blockquote&gt;При плохом выполнении комментирование является пустой тратой времени и иногда причиняет вред.&lt;br /&gt;С.Макконнелл&lt;/blockquote&gt;&lt;br /&gt;Например, в следующем коде комментарии совершенно бесполезны, потому что совершенно ничего не говорят:&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;int k = getKoeff(m); /*инициализируем переменную k значением, возвращаемым методом getKoeff */&lt;br /&gt;double empS = 0.0; //инициализируем переменную empS нулем&lt;br /&gt;for(int i=0; i&amp;lt;getWNub(m); i++)&lt;br /&gt;{&lt;br /&gt;empS +=k*arr[i] + bon[i]; //вычисляем сумму в цикле&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Раз уж зашел разговор о полезности комментариев, то давайте определим цели - для чего вообще нужны комментарии в коде? Комментарии должны давать представление о том, что делает данный код, должны помогать читать его, так? На мой взгляд, самый лучший комментарий к коду - сам код.&lt;br /&gt;&lt;blockquote&gt;Хороший код сам является самой лучшей документацией. Если код настолько  плох, что требует объемных комментариев, попытайтесь сначала улучшить  его.&lt;br /&gt;С.Макконнелл&lt;/blockquote&gt;Я не призываю отказаться от комментариев в коде, я призываю к написанию ясного кода, который легко понять и модифицировать даже по прошествии длительного периода времени.&lt;br /&gt;Что в моем понимании "ясный код"? Это, конечно же, самодокументирующийся код. Например, предыдущий кусок кода можно переписать так:&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;int koefficient = getSalaryKoefficient(monthNumber);&lt;br /&gt;double employeeSalary = 0.0;&lt;br /&gt;int workingDaysInCurrentMonth = getWorkingDaysNumber(monthNumber);&lt;br /&gt;for(int dayNubmer=0; dayNumber&amp;lt;workingDaysInCurrentMonth; dayNubmer++)&lt;br /&gt;{&lt;br /&gt;employeeSalary +=koefficient*workingHours[dayNubmer] + dayBonus[dayNubmer];&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Что изменилось в коде? Всего лишь имена переменных и методов, но этот код, в отличие от первого его варианта, понятен без комментариев. Имена переменных и методов говорят сами за себя, им не нужны никакие комментарии. Такими же должны делать имена классов, интерфейсов, констант, перечислений, элементов перечислений и т.д. О том, насколько важно правильно выбирать имена и как это делать, можно почитать в книге "Совершенный код" С. Макконнелла.&lt;br /&gt;&lt;blockquote&gt;Почувствовав потребность написать комментарий, попробуйте сначала  изменить структуру кода так, чтобы любые комментарии стали излишними...&lt;br /&gt;М.Фаулер&lt;/blockquote&gt;Как менять структуру кода и когда это нужно делать, можно почитать в книге Мартина Фаулера "Рефакторинг. Улучшение существующего кода". Но, конечно же, есть несколько случаев, когда следовать вышеприведенной цитате не нужно. Во-первых, когда код делает не очевидные вещи, например (пример взят из книги "Совершенный код" С.Макконелла):&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;for(element = 0; element&amp;lt;elementCount; element++)&lt;br /&gt;{&lt;br /&gt;/*Для деления на 2 используется операция сдвига вправо. Это сокращает время выполнения цикла на 75% */&lt;br /&gt;elementList[element] = elementList[element] &amp;gt;&amp;gt;1;&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Вряд ли программист, который будет сопровождать этот код (даже сам автор по прошествии времени), сможет с первого раза догадаться, зачем тут нужен побитовый сдвиг вправо на единицу без комментария.&lt;br /&gt;Во-вторых, стоит комментировать неявные значения, например:&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;//Цвет фона по умолчанию - белый&lt;br /&gt;itemBgColor = Color.FromAGB(255,255,255);&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Этот код лучше будет даже переписать следующим образом:&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;const Color DEFAULT_BG_COLOR = Color.FromAGB(255,255,255);&lt;br /&gt;...&lt;br /&gt;itemBgColor = DEFAULT_BG_COLOR;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Кроме того, следует комментировать использование недокументированных возможностей или исправление обнаруженных ошибок - ведь в следующих версиях системы этих возможностей может и не быть, а ошибки могут быть исправлены :)&lt;br /&gt;Полезным может оказаться документирование ограничений, если они не заданы константами с говорящими именами, а используются в коде как есть - в виде чисел. Но с таким настоятельно советую бороться :)&lt;br /&gt;В своей практике кроме всего выше перечисленного я предпочитаю давать краткое описание методу перед началом его кодирования, при этом использую очень замечательную возможность документирования кода в Visual Studio. Это выглядит так:&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;/// &amp;lt;summary&amp;gt;&lt;br /&gt;/// Возвращает следующий по номеру ваучер по отношению к номеру текущего ваучера&lt;br /&gt;/// &amp;lt;/summary&amp;gt;&lt;br /&gt;/// &amp;lt;returns&amp;gt;VoucherItem&amp;lt;/returns&amp;gt;&lt;br /&gt;public VoucherItem GetNextVoucherItem()&lt;br /&gt;{ &lt;br /&gt;return VoucherRepository.GetNextVoucher(this.VoucherNumber);&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Клиентский код, использующий методы моего класса, получает возможность использовать IntelliSense, что очень удобно.&lt;br /&gt;И напоследок приведу такую цитату:&lt;br /&gt;&lt;blockquote&gt;Пишите код, исходя из того, что все программисты, которые будут  сопровождать вашу программу, - склонные к насилию психопаты, знающие,  где вы живёте.&lt;br /&gt;С.Макконнелл&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5342535388237643243-4325906083363856427?l=sly-and-fluffy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sly-and-fluffy.blogspot.com/feeds/4325906083363856427/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://sly-and-fluffy.blogspot.com/2010/05/blog-post_30.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/4325906083363856427'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/4325906083363856427'/><link rel='alternate' type='text/html' href='http://sly-and-fluffy.blogspot.com/2010/05/blog-post_30.html' title='Комментарии в коде'/><author><name>Tatiana Shemyakina</name><uri>https://profiles.google.com/115825956619949451947</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-4MfXIVcZdJA/AAAAAAAAAAI/AAAAAAAAAbA/Iv1Gt6j8YgI/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_e8cdtZaFnDI/TALizEIcdbI/AAAAAAAAAQI/Ax43wH1MVo4/s72-c/comments_image.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5342535388237643243.post-8216048794253495884</id><published>2010-05-29T10:10:00.003+03:00</published><updated>2010-05-29T10:26:06.852+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tools'/><category scheme='http://www.blogger.com/atom/ns#' term='RegExpr'/><title type='text'>Регулярные выражения</title><content type='html'>Для облегчения работы с регулярными выражениями я использую бесплатную утилиту от Rad Software - Regular Expression Designer.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_e8cdtZaFnDI/TAC-68Me7WI/AAAAAAAAAQA/eRCZYC5DzP8/s1600/RegexDesignerMainScreen.gif"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 400px; height: 262px;" src="http://4.bp.blogspot.com/_e8cdtZaFnDI/TAC-68Me7WI/AAAAAAAAAQA/eRCZYC5DzP8/s400/RegexDesignerMainScreen.gif" alt="" id="BLOGGER_PHOTO_ID_5476587066682699106" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Среди фич можно выделить следующие:&lt;br /&gt;&lt;br /&gt;Удобное отображение результата выполнения выражения - строится многоуровневое дерево  для    Matches, Groups и Captures. При клике на ветку дерева в исходном тексте выделяется фрагмент, соответствующий результату.&lt;br /&gt;&lt;br /&gt;Очень удобно сделано окно "Language Element" - справочник по регулярным выражения всегда под рукой. Но для не владеющих английским (о_О) он может оказаться не очень полезным.&lt;br /&gt;&lt;br /&gt;Найти более подробное описание программы и скачать ее можно на сайте разработчика - &lt;a href="http://www.radsoftware.com.au/regexdesigner/"&gt;http://www.radsoftware.com.au/regexdesigner/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5342535388237643243-8216048794253495884?l=sly-and-fluffy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sly-and-fluffy.blogspot.com/feeds/8216048794253495884/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://sly-and-fluffy.blogspot.com/2010/05/blog-post_29.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/8216048794253495884'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/8216048794253495884'/><link rel='alternate' type='text/html' href='http://sly-and-fluffy.blogspot.com/2010/05/blog-post_29.html' title='Регулярные выражения'/><author><name>Tatiana Shemyakina</name><uri>https://profiles.google.com/115825956619949451947</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-4MfXIVcZdJA/AAAAAAAAAAI/AAAAAAAAAbA/Iv1Gt6j8YgI/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_e8cdtZaFnDI/TAC-68Me7WI/AAAAAAAAAQA/eRCZYC5DzP8/s72-c/RegexDesignerMainScreen.gif' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5342535388237643243.post-2590019843211523558</id><published>2010-05-10T11:15:00.003+03:00</published><updated>2010-05-10T11:19:38.811+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='virus'/><category scheme='http://www.blogger.com/atom/ns#' term='Tools'/><category scheme='http://www.blogger.com/atom/ns#' term='mpress'/><title type='text'>Mpress VS Avira</title><content type='html'>Недавно к своему сожалению обнаружила, что некоторые антивирусы, в особенности Avira, распознают exe-файлы, запакованные с помощью пакера Mpress, &lt;a href="http://sly-and-fluffy.blogspot.com/2009/07/pe32pe32netmac-darwin.html"&gt;о котором упоминалось ранее в этом блоге&lt;/a&gt;, как вирус.&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_e8cdtZaFnDI/S-fBOEVALcI/AAAAAAAAAPQ/g_FUwRMDWU4/s1600/avira.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 400px; height: 367px;" src="http://2.bp.blogspot.com/_e8cdtZaFnDI/S-fBOEVALcI/AAAAAAAAAPQ/g_FUwRMDWU4/s400/avira.png" alt="" id="BLOGGER_PHOTO_ID_5469552719888920002" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5342535388237643243-2590019843211523558?l=sly-and-fluffy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sly-and-fluffy.blogspot.com/feeds/2590019843211523558/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://sly-and-fluffy.blogspot.com/2010/05/mpress-vs-avira.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/2590019843211523558'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/2590019843211523558'/><link rel='alternate' type='text/html' href='http://sly-and-fluffy.blogspot.com/2010/05/mpress-vs-avira.html' title='Mpress VS Avira'/><author><name>Tatiana Shemyakina</name><uri>https://profiles.google.com/115825956619949451947</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-4MfXIVcZdJA/AAAAAAAAAAI/AAAAAAAAAbA/Iv1Gt6j8YgI/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_e8cdtZaFnDI/S-fBOEVALcI/AAAAAAAAAPQ/g_FUwRMDWU4/s72-c/avira.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5342535388237643243.post-4317596307706363492</id><published>2010-05-02T10:58:00.004+03:00</published><updated>2010-05-06T12:36:08.373+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='разработка ПО'/><title type='text'>О колбасе :)</title><content type='html'>Понравился анекдот о колбасе и яйцах :)&lt;br /&gt;&lt;div&gt;&lt;blockquote&gt;Жена посылает мужа-программиста в магазин:&lt;br /&gt;- Дорогой, купи, пожалуйста, палку колбасы, и если будут яйца, то купи десяток.&lt;br /&gt;Через полчаса программист возвращается с десятью палками колбасы.&lt;br /&gt;Жена:&lt;br /&gt;- Что это?! Зачем ты купил столько колбасы?&lt;br /&gt;Программист:&lt;br /&gt;- Ну так яйца-то были...&lt;/blockquote&gt;&lt;/div&gt;Этот незатейливый, на первый взгляд, анекдот хорошо иллюстрирует проблему правильной постановки задачи при разработке ПО. &lt;div&gt;Ошибки в требованиях к разработке ПО никогда ничего хорошего не приносили. Если ошибка обнаружена на ранней стадии разработки, то все может обойтись малой кровью, но если зловредную ошибку удается обнаружить только на стадии завершения проекта или сдачи его в эксплуатацию... малой кровью тут не обойтись... Чем ближе дело к завершению разработки, тем жесче остов приложения, тем сложнее даются изменения. По аналогии со строительством, после того, как вы залили фундамент дома, и начали возводить стены, а тут вдруг говорят, что кто-то не доглядел план и надо бы северную сторону дома сделать не округлой, а треугольной... Стоимость таких ошибочек огромна, результаты - удручающи :( В примере с колбасой все проще - колбасу можно съесть :), а вот в жизни получаются шестиколесные велосипеды...&lt;/div&gt;&lt;div&gt;Из-за чего получаются такие ошибки? Как они закрадываются в спецификации? Есть несколько ответов на эти вопросы: от банального не доглядели до несогласованности требований. Всем известно, что требования в процессе разработки меняются, и после каждого изменения или дополнения нужно проверять, не получилось ли так, что часть новых требований не согласуется со старыми. Так же есть такие факторы, как взаимонепонимание и "требования по умолчанию". Разработчики, которые не являются специалистами в предметной области разрабатываемого продукта, могут не знать некоторых деталей, а для заказчика (или эксперта, учавствующего в разработке спецификации) данные детали являются делом обыденным, само собой разумеющимся. "Требования по умолчанию" - это опасные требования. Их даже может и не быть в спецификации, потому что это "само собой разумеющиеся" вещи, о них просто забывают. А для разработчиков эти вещи далеко не очевидны, так же как и для обычного человека не очевидно то, что для разработчика ясно как 0 и 1. &lt;/div&gt;&lt;div&gt;Как бороться с ошибками в спецификации? Существует множество способов проверки корректности спецификации. Главное, задействовать эти способы вовремя, после выработки требований и перед началом проектирования или после очередного внесения изменений в спецификации. &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5342535388237643243-4317596307706363492?l=sly-and-fluffy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sly-and-fluffy.blogspot.com/feeds/4317596307706363492/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://sly-and-fluffy.blogspot.com/2010/05/blog-post.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/4317596307706363492'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/4317596307706363492'/><link rel='alternate' type='text/html' href='http://sly-and-fluffy.blogspot.com/2010/05/blog-post.html' title='О колбасе :)'/><author><name>Tatiana Shemyakina</name><uri>https://profiles.google.com/115825956619949451947</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-4MfXIVcZdJA/AAAAAAAAAAI/AAAAAAAAAbA/Iv1Gt6j8YgI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5342535388237643243.post-2269973562716165985</id><published>2010-04-16T09:57:00.003+03:00</published><updated>2010-04-16T10:02:16.982+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linq'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>Вебкаст "Технический обзор LINQ"</title><content type='html'>Отличный вебкаст Романа Здебского "Технический обзор LINQ".&lt;br /&gt;Доклад с конференции «Платформа – 2009». В докладе раскрывается принципиально новый подход к построению запросов и трансформации данных (объекты, реляционные структуры, XML) в .NET-языках программирования. Основной темой обсуждения служит использование преимуществ работы с проекциями данных в стиле реляционных движков в полностью типизированном окружении с контролем ошибок на этапе компиляции кода. &lt;br /&gt;&lt;br /&gt;&lt;IFRAME style="WIDTH: 470px; HEIGHT: 390px" quot; src="http://www.techdays.ru/LectureViewer.aspx?LectureId=4361af9f-9a2b-469f-b00b-c7a4d48d3973" frameBorder=0 scrolling=no mce_src="http://www.techdays.ru/LectureViewer.aspx?LectureId=4361af9f-9a2b-469f-b00b-c7a4d48d3973"&gt;&lt;/IFRAME&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5342535388237643243-2269973562716165985?l=sly-and-fluffy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sly-and-fluffy.blogspot.com/feeds/2269973562716165985/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://sly-and-fluffy.blogspot.com/2010/04/linq.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/2269973562716165985'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5342535388237643243/posts/default/2269973562716165985'/><link rel='alternate' type='text/html' href='http://sly-and-fluffy.blogspot.com/2010/04/linq.html' title='Вебкаст &quot;Технический обзор LINQ&quot;'/><author><name>Tatiana Shemyakina</name><uri>https://profiles.google.com/115825956619949451947</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-4MfXIVcZdJA/AAAAAAAAAAI/AAAAAAAAAbA/Iv1Gt6j8YgI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5342535388237643243.post-120000720170368247</id><published>2010-04-08T18:52:00.005+03:00</published><updated>2010-08-12T15:22:51.573+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linq'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>Ускоряем Linq2Sql: Compiled Query &amp; ObjectTrackingEnabled</title><content type='html'>Когда код компилируется - это хорошо. Когда код работает так , как было задумано, - это еще лучше. Ну, а когда код, к тому же, работает быстро - это вобще здорово. Есть масса способов увеличения скорости работы кода, в этом посте я хочу рассказать о возможности увеличения скорости выполнения запросов Linq2Sql.&lt;br /&gt;Если в приложении есть повторяющиеся запросы или запросы, похожие по структуре, но отличающиеся параметром, можно  существенно увеличить производительность, если выделить общий запрос, скомпилировать его  один раз в лямбда-выражение и затем выполнять уже скомпилированный запрос раз с различными параметрами.&lt;br /&gt;Для этих целей .NET 3.5 и выше есть класс &lt;a href="http://msdn.microsoft.com/ru-ru/library/system.data.linq.compiledquery.aspx"&gt;CompiledQuery.&lt;/a&gt; Работа с этим классом не представляет ничего сложного. Для примера возьму кусок кода из своего проекта. Смысл в том, что нужно выбирать из БД список форм, соответствующих проекту, заданному через ID. Для этого у меня создан такой скомпилированный запрос:&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;private static Func&amp;lt;&lt;/code&gt;&lt;code class="prettyprint"&gt;MyDataContext&lt;/code&gt;&lt;code class="prettyprint"&gt;, int, IEnumerable&amp;lt;Forms&amp;gt;&amp;gt;fGetFormsByProjectID =&lt;br /&gt;       CompiledQuery.Compile&amp;lt;&lt;/code&gt;&lt;code class="prettyprint"&gt;MyDataContext&lt;/code&gt;&lt;code class="prettyprint"&gt;,  int, IEnumerable&amp;lt;&lt;/code&gt;&lt;code class="prettyprint"&gt;Forms&lt;/code&gt;&lt;code class="prettyprint"&gt;&amp;gt;&amp;gt;&lt;br /&gt;       ((&lt;/code&gt;&lt;code class="prettyprint"&gt;MyDataContext&lt;/code&gt;&lt;code class="prettyprint"&gt; context, int projectID) =&gt; context.Forms.&lt;br /&gt;        Where&amp;lt;Forms&amp;gt;(form =&amp;gt; form.ProjectID == projectID));&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;А в вызывается он следующим образом:&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;IEnumerable&amp;lt;forms&amp;gt; forms = fGetFormsByProjectID(new &lt;/code&gt;&lt;code class="prettyprint"&gt;MyDataContext&lt;/code&gt;&lt;code class="prettyprint"&gt;(ConnectionPool.Connection), projectID);&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Кроме использования скомпилированных запросов для увеличения скорости выполнения запросов к БД можно использовать получение данных в режиме "Только чтение".  Для этого перед выполнением запроса установите свойство &lt;a href="http://msdn.microsoft.com/ru-ru/library/bb399418%28VS.90%29.aspx"&gt;ObjectTrackingEnabled&lt;/a&gt;  вашего DataContext-экземпляра  в false:&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;using(MyDataContext context = new MyDataContext(ConnectionPool.Connection))&lt;br /&gt;{&lt;br /&gt;context.ObjectTrackingEnabled = false;&lt;br /&gt;var query = from form in context.Forms where form.StatusID == Status.Completed select form;&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;При использовании данного метода следует помнить, что вызов метода SubmitChanges() в режиме получения данных только для чтения вызовет исключение.&lt;br /&gt;На тему производительности Linq2Sql Rico Mariotty провел серию тестов, результаты которых опубликовал в пяти статьях:&lt;br /&gt;&lt;a href="http://blogs.msdn.com/b/ricom/archive/2007/06/22/dlinq-linq-to-sql-performance-part-1.aspx"&gt;DLinq (Linq to SQL) Performance (Part 1)&lt;/a&gt;&lt;br /&gt;&lt;a href="http://blogs.msdn.com/ricom/archive/2007/06/25/dlinq-linq-to-sql-performance-part-2.aspx"&gt;D
