<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Серый форум &mdash; VBS: Структура кода с большим количеством if,for,else]]></title>
		<link>https://forum.script-coding.com/viewtopic.php?id=9430</link>
		<atom:link href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=9430&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «VBS: Структура кода с большим количеством if,for,else».]]></description>
		<lastBuildDate>Mon, 21 Jul 2014 09:30:52 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: VBS: Структура кода с большим количеством if,for,else]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=84944#p84944</link>
			<description><![CDATA[<p><strong>YMP</strong><br />Я имел в виду возможность не проверять &quot;лишние&quot; условия, легко могу ошибится, но, кажется, Basic проверяет второе условие после And даже если первое ложно, в отличие от JS. Впрочем, ни на чём не настаиваю ввиду незнания Васика.<br />Применительно к данной теме намекал на конструкцию вида</p><div class="codebox"><pre><code>if(chk1()&amp;&amp;chk2()...)mainProc(arg1,arg2,...)</code></pre></div><p><strong>Rom5</strong><br />Вероятно, речь именно об этом, но лучше пусть выскажутся знатоки Basic&#039;а. А то я тут уже отметился <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" /></p>]]></description>
			<author><![CDATA[null@example.com (Serge Yolkin)]]></author>
			<pubDate>Mon, 21 Jul 2014 09:30:52 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=84944#p84944</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBS: Структура кода с большим количеством if,for,else]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=84943#p84943</link>
			<description><![CDATA[<div class="quotebox"><cite>Rom5 пишет:</cite><blockquote><div class="quotebox"><cite>YMP пишет:</cite><blockquote><p>Эти-то есть вроде. Нету &amp; и |.</p></blockquote></div><p>Хммм. Имеется в виду побитовые И/ИЛИ ?</p></blockquote></div><p>Да, они. Видимо, в VBS логические от побитовых отличаются как-то по контексту. Или ХЗ.</p>]]></description>
			<author><![CDATA[null@example.com (YMP)]]></author>
			<pubDate>Mon, 21 Jul 2014 09:29:08 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=84943#p84943</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBS: Структура кода с большим количеством if,for,else]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=84942#p84942</link>
			<description><![CDATA[<p>Об этом. И о разнице между простым и понятным обработчиком, скажем:<br /></p><div class="codebox"><pre><code>var oFSO=WScript.CreateObject(&#039;Scripting.FileSystemObject&#039;);
try {
    with (oFSO.OpenTextFile(&#039;c:\\boot.ini&#039;)) {
        var sContent=ReadAll();
        Close();
    }
} catch (e) {
    var sContent=&#039;&#039;;
} finally {
    WScript.Echo(&#039;[&#039;+sContent+&#039;]&#039;);
}
</code></pre></div><p>и громадьём кода в:<br /></p><div class="codebox"><pre><code>Option Explicit

Dim objFSO
Dim objTS
Dim strContent

Set objFSO = WScript.CreateObject(&quot;Scripting.FileSystemObject&quot;)

On Error Resume Next
Set objTS = objFSO.OpenTextFile(&quot;c:\boot.ini&quot;)

If Err.Number = 0 Then
    On Error Goto 0
    strContent = objts.ReadAll()
    objTS.Close
Else
    Err.Clear
    On Error Goto 0
    strContent = &quot;&quot;
End If

WScript.Echo &quot;[&quot; &amp; strContent &amp; &quot;]&quot;

WScript.Quit 0
</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (alexii)]]></author>
			<pubDate>Mon, 21 Jul 2014 09:24:38 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=84942#p84942</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBS: Структура кода с большим количеством if,for,else]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=84941#p84941</link>
			<description><![CDATA[<div class="quotebox"><cite>Serge Yolkin пишет:</cite><blockquote><p>....<br />то для первого параметра я бы сразу проверил доступность файла/ов в обёртке try, а в catch вернул бы то, что покажет остальному коду некорректность первого параметра...</p></blockquote></div><p>Ну, пускай именно не полное подобие функционала обёртки try, но пробовать открыть файл на запись в VBS с временным отключением прерываний по ошибкам выполнения и проверкой наличия кода ошибки ведь можно ж. </p><p><a href="http://msdn.microsoft.com/en-us/library/53f3k80h(v=vs.84).aspx">msdn - On Error Statement</a><br />Или речь не об этом?</p>]]></description>
			<author><![CDATA[null@example.com (Rom5)]]></author>
			<pubDate>Mon, 21 Jul 2014 08:23:18 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=84941#p84941</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBS: Структура кода с большим количеством if,for,else]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=84940#p84940</link>
			<description><![CDATA[<div class="quotebox"><cite>YMP пишет:</cite><blockquote><p>Эти-то есть вроде. Нету &amp; и |.</p></blockquote></div><p><em>оффтопа немножко</em></p><p>Хммм. Имеется в виду побитовые И/ИЛИ ?</p><br /><p>Как я понимаю, в приведённом ниже фрагменте (vbs in hta) полученнное мною значение &quot;intUAC&quot; проверяется как раз наподобие js-ного &quot;&amp;&quot; - см. конструкции &quot;If (intUAC AND 2) OR (.....&quot;</p><div class="codebox"><pre><code>
&#039;--- отключенность учетки&#039;
intUAC=objRSet.Fields(&quot;userAccountControl&quot;)

&#039;--- отображение отключенности у/з&#039;
If intUAC AND 2 Then
    tLT_infoUsrAcc.innerHTML = tLT_infoUsrAcc.innerHTML &amp; &quot;This Account -- DISABLED !!!&quot;
End If

&#039;Вывод даты отключения, если учетка уже отключена либо эта дата - в прошлом или сегодняшняя, но не равна 01.01.1970 / 01.01.1601&#039;
&#039; // при проверке с текущей датой не учитываем разницу в 3 дня -- для отображения отключения в ближайшем будущем&#039;
If (intUAC AND 2) OR ( ( CDate(Left(sDtAccExpire,10)) &lt;= CDate(date() + 3) ) _
    AND ( CDate(Left(sDtAccExpire,10))&lt;&gt;CDate(&quot;01/01/1970&quot;) ) _
    AND ( CDate(Left(sDtAccExpire,10))&lt;&gt;CDate(&quot;01/01/1601&quot;) ) ) Then
    tLT_infoUsrAcc.innerHTML = tLT_infoUsrAcc.innerHTML &amp; Left(sDtAccExpire,10)
End IF
    
</code></pre></div><p><a href="http://msdn.microsoft.com/ru-ru/library/wz3k228a.aspx">Логические и побитовые операторы в Visual Basic</a></p>]]></description>
			<author><![CDATA[null@example.com (Rom5)]]></author>
			<pubDate>Mon, 21 Jul 2014 08:13:26 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=84940#p84940</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBS: Структура кода с большим количеством if,for,else]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=84920#p84920</link>
			<description><![CDATA[<p>Эти-то есть вроде. Нету &amp; и |.</p>]]></description>
			<author><![CDATA[null@example.com (YMP)]]></author>
			<pubDate>Sun, 20 Jul 2014 10:45:01 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=84920#p84920</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBS: Структура кода с большим количеством if,for,else]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=84919#p84919</link>
			<description><![CDATA[<p>Упс... Как же там люди живут?</p><p>Ещё и &amp;&amp; с || нет... Не понимаю...</p>]]></description>
			<author><![CDATA[null@example.com (Serge Yolkin)]]></author>
			<pubDate>Sun, 20 Jul 2014 10:30:18 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=84919#p84919</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBS: Структура кода с большим количеством if,for,else]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=84917#p84917</link>
			<description><![CDATA[<p><strong>Serge Yolkin</strong>, увы, в VBScript отсутствует удобное средство в виде «try…catch…finally».</p>]]></description>
			<author><![CDATA[null@example.com (alexii)]]></author>
			<pubDate>Sun, 20 Jul 2014 03:24:26 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=84917#p84917</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBS: Структура кода с большим количеством if,for,else]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=84912#p84912</link>
			<description><![CDATA[<p>Если задача чисто академическая (или спортивная) - сделать именно так, то я разбил бы прверку на ряд функций с вызовом одной из другой: функция, проверяющая первый параметр вызывает функцию, провряющую существование папки, имя которой передано ей в качестве параметра, а эта функция может вызываться и из других функций. Ну, и т.д. Комментарий для функции + комментарий для её вызова, чтобы не мотать код туда-сюда.<br />Если же вопрос &quot;как бы сделал я&quot;, то для первого параметра я бы сразу проверил доступность файла/ов в обёртке try, а в catch вернул бы то, что покажет остальному коду некорректность первого параметра... Ну и далее. Надо определить, какая информация из проверок действительно необходима для дальнейшей обработки, а какая избыточна. Если &quot;файлики забирать&quot; нельзя, какая разница - почему? Нельзя и баста.</p>]]></description>
			<author><![CDATA[null@example.com (Serge Yolkin)]]></author>
			<pubDate>Sat, 19 Jul 2014 18:56:09 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=84912#p84912</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBS: Структура кода с большим количеством if,for,else]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=84908#p84908</link>
			<description><![CDATA[<p><strong>Перечитывал тему и хотел все ж таки уяснить для себя как&nbsp; правильно писать код с большим количеством if,for,else? </strong></p><br /><p>Кто-то пытается при написании использовать кучу комментариев, кто-то делает маленькие блоки, кто-то изобретает свой метод может имеется свой гост по написанию программ если много условий. Мы пишем код, в случае бага, мы просто тратим N-ое количество времени и для нахождения бага и все опять работает, а ведь есть процессы при которых крайне нежелательно остановка какого либо скрипта из-за того, что произошел какой-то сбой или неправильно был указан параметр. Или если даже произошел сбой что б сохранилась информация какая-либо из-за чего произошел сбой. </p><p>Свои задачи я решил, используя свой собственный опыт проб и ошибок, и потерю кучу времени.</p><p>Здесь я привожу пример и привожу доводы почему у меня возник данный вопрос:</p><p>Использовал всевозможные задачи по обработке на файловом уровне. Ну например стоит задача выполнить какую-то операцию по обработке какого-то процесса.</p><p>В параметром файле есть 10 параметров, которые нельзя структурировать по какому-либо принципу:<br />1) параметр - каталог откуда файлики забираются<br />2) параметр - куда файлики поступают<br />3) параметр - программа при помощи которой производится проверка.<br />4) параметр - директория размещения протокола проверки<br />5) параметр - директория хранения протокола обработки для пользователя<br />6) параметр - директория хранения общего протокола по обработке по всем пользователям<br />7) параметр - директория возврата файлов в случае некорректной проверки программой<br />8) параметр - установка времени ожидания перед началом обработки<br />9) параметр - именование файлов<br />10) параметр -&nbsp; создания директории со временем</p><p>Таким образом получается если будем строить обработку при помощи принципа многократного вложения if for else друг в друга как я уже писал в посте 3, IF откроется на 1й строке и закроется только на 1500 строке, а внутри него будет около 10 уровней вложенных условий который еще будут вложены друг в друга и зрительно будет очень сложно прослеживать эти вложенности что б не допустить ошибку в алгоритме.</p><p>Я использовал последовательный принцип проверки по условиям с маленькими блоками проверки введением 1й переменной, которая принимает единицу или нолик в зависимости корректно ли завершился блок или нет. ну например нужно считать все 10 параметров и проверить их перед использованием маленькими блоками:</p><div class="codebox"><pre><code>

        If NextCheck = 0 Then
            If Not objFSO.FolderExists(SortBufferMassiv(3,0)) Then
                call CreateFolderTree (SortBufferMassiv(3,0))
                if RetCode &lt;&gt; 0 Then
                    WScript.Echo &quot;Путь указанный в конфигурационном файле для лога нет доступа к сетевому ресурсу &quot;  
                    NextCheck = 1
                End If
            End If
        End If
</code></pre></div><p>1) Нужно считать первый параметр.<br />2) Проверить&nbsp; корректно ли указан параметр. Например есть ли доступ к ресурсу. <br />3) Проверить есть ли возможность чтение удаление.<br />4) Проверить есть ли там файл <br />5) Проверить не занял ли данный файл</p><p>Ну и только потом производить обработку которая идет далее по алгоритму, иначе мы можем получить ошибку выполнения и остановку скрипта и не будет информации, что произошло на данном этапе обработки.</p><p>Вот и получается 1 параметр мы проверили&nbsp; 5-ю условиями, а у нас 10 параметров и получается будет очень много условий для проверки всех параметров перед использованием.</p>]]></description>
			<author><![CDATA[null@example.com (wildwolf007)]]></author>
			<pubDate>Sat, 19 Jul 2014 13:53:38 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=84908#p84908</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBS: Структура кода с большим количеством if,for,else]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=81336#p81336</link>
			<description><![CDATA[<p>Лучше так:<br /></p><div class="codebox"><pre><code>If условие Then &#039;Пояснение
      Код выполнения
Else &#039;Пояснение
      Код выполнения
End If
</code></pre></div><div class="quotebox"><blockquote><p>если IF становится больше … и нужно … использовать маленькие блоки проверки каждого условия</p></blockquote></div><p>Дело не в маленьких или больших блоках.</p>]]></description>
			<author><![CDATA[null@example.com (alexii)]]></author>
			<pubDate>Mon, 31 Mar 2014 07:52:27 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=81336#p81336</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBS: Структура кода с большим количеством if,for,else]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=81335#p81335</link>
			<description><![CDATA[<p>Интересный подход, но не знаю как у Вас, а у меня когда когда попробовал воспользоваться Вашим методом код стал казаться сильно &quot;перегруженым&quot; и стал тяжелее для восприятия.<br />Воспользовался другим способом:</p><p>При написании использую NotePade++ данная программа позволяет производить сворачивание кода и при сворачивании можно добавлять описания по каждому условию используя разные отступы</p><br /><div class="codebox"><pre><code>


If условие Then
&#039;Пояснение
      Код выполнения
Else
&#039;Пояснение
      Код выполнения
End If
&#039;Пояснение

</code></pre></div><br /><p>т.к. использовали отступ для &quot;Код выполнения&quot;, а для &quot;Пояснения&quot; не использовали отступ, то при сворачивании&nbsp; условия IF и Else сразу все понятно. Тоже самое и для For.<br />После сворачивания:<br /></p><div class="codebox"><pre><code>
If условие Then
&#039;Пояснение
Else
&#039;Пояснение
End If
&#039;Пояснение
</code></pre></div><p>Но для себя я понял если IF становится больше 5 то данный код уже становится тяжело восприимчив и нужно использовать рекомендации <strong>Xameleon</strong> 1 и 4&nbsp; + использовать маленькие блоки проверки каждого условия как я указывал &quot;If NextCheck = 0 Then&quot; пример в посте 16. </p><p>Такой код очень прост для понимания и не нужно особо глубоко в него вникать и дописывать что-то дополнительное очень просто. Хотя в данном случае возможно страдает производительность из-за дополнительного условия, но не факт не проверял.</p><p>Никакого другого метода для большого количества условий и циклов пока больше никто не предложил.</p>]]></description>
			<author><![CDATA[null@example.com (wildwolf007)]]></author>
			<pubDate>Mon, 31 Mar 2014 07:19:41 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=81335#p81335</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBS: Структура кода с большим количеством if,for,else]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=81331#p81331</link>
			<description><![CDATA[<div class="quotebox"><cite>wildwolf007 пишет:</cite><blockquote><div class="quotebox"><cite>Rom5 пишет:</cite><blockquote><p>В завершающих операторах (End*, Next и т.п.) бывает дублирую условие из оператора сравнения - для наглядности.</p></blockquote></div><p>Вы проставляете условие в виде комментария я правильно Вас понял?</p></blockquote></div><p>Да. Например:<br /></p><div class="codebox"><pre><code>
If fso.FileExists( &quot;test.txt&quot; )
    &#039; [...]&#039;
    Do While not fspi.AtEndOfStream
        &#039; [...]&#039;
        For i=1 To 10
            &#039; [...]&#039;
            &#039; [...]&#039;
        NEXT i
    Loop &#039;not fspi.AtEndOfStream
    If a&gt;b Then
        &#039; [...]&#039;
    Else &#039;a&gt;b&#039;
        &#039; [...]&#039;
        If b&gt;c Then
            &#039; [...]&#039;
        End IF &#039;b&gt;c&#039;
    End IF &#039;a&gt;b&#039;
End IF &#039;fso.FileExists( &quot;test.txt&quot; )</code></pre></div><p>т.е. и по самих завершающих операторах становится более менее понятно, что это был за цикл или условие. Конечно, это имеет смысл, если много вложенных условий/циклов с многострочным исполняющимся кодом.</p><br /><p>Если функции действительно <strong>нужно возвращать несколько разноплановых значений</strong>, то, думаю, будет удобно использовать объект Словаря - <a href="http://www.script-coding.com/WSH/Dictionary.html">Объект Dictionary</a>.</p><p>Принявшему такой объект-результат коду будет удобно проверить и наличие установленніх ключей-результата и получение самих значений наглядно - по имени ключа.</p>]]></description>
			<author><![CDATA[null@example.com (Rom5)]]></author>
			<pubDate>Mon, 31 Mar 2014 06:50:56 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=81331#p81331</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBS: Структура кода с большим количеством if,for,else]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=81324#p81324</link>
			<description><![CDATA[<p>Присвоение через <strong>Set</strong> относится к объектам. Для массивов достаточно <strong>MyFN4 = r</strong></p>]]></description>
			<author><![CDATA[null@example.com (Xameleon)]]></author>
			<pubDate>Sun, 30 Mar 2014 16:54:26 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=81324#p81324</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBS: Структура кода с большим количеством if,for,else]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=81322#p81322</link>
			<description><![CDATA[<p>А если обычный массив ? Чет у меня не получается.</p><div class="codebox"><pre><code>


For each t in MyFN4()
    WScript.Echo t
Next

WScript.Quit


Function MyFN4()
    dim r(1)
    r(0) = 1
    r(1) = 2
    Set MyFN4 = r()
End Function

</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (wildwolf007)]]></author>
			<pubDate>Sun, 30 Mar 2014 13:43:30 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=81322#p81322</guid>
		</item>
	</channel>
</rss>
