1 (изменено: stir, 2011-12-29 07:07:14)

Тема: JScript: Есть ли аналог оператора СТОП?

Пришел к выводу, что при написании кода вначале надо проверить одно условие и если все ок, то продолжить исполнение кода, а если нет - перейти к функции СТОП и закончить работу кода, но после всего этого исполнение оставшегося кода продолжится.
Нужно прервать исполнение, однако в  JScript нет такого, это можно сделать, если поставить проверку условия if-else. Если выход из программы-кода единственный, то нет проблемм, а если в оставшемся коде снова проводится проверка и снова надо закончить программу с функией СТОП (где есть вывод ошибки или чего еще в общих словах).

Оператора GOTO не предусмотрено..  Иначе это было бы просто - переход в конец кода с выводом информации и конец исполнения программы.
Есть ли выход, чтобы постоянно не мудрить с проверками на одно и тоже условие?

Слабый пример вышеизложенного примерно так:

1. Ведем подсчет файлов и занимаемого места в папке Т1, Т2 и т.д. ПРичем заведомо известно, что Т1 меньше Т2 меньше Т3 и т.д.
2. Копируем Т1 в сетевую папку Т0 с условием, что Размер Т1 меньше свободного места Т0, если больше - конец программе с выдачей информации
3. Копируем Т2... + (зависит от Т1)
4. Копируем Т3... + (зависит от Т2)
и т.д.

В итоге можно сразу отмести ненужные действия, как только свободное место Т0 не стало удовлетворять условию. Скажем на п3 (Т2).
Особенность еще в том, что на текущую дату я написал код, состоящий из блоков - когда 1 блок входит как функция во 2, а 2 блок входит в 3-ий.. Есть одельно вынесенные функции, которые везде могут использоваться. В самом начале я не думал, что придется вводить условие проверки так часто, что потребуется аналог оператора Goto, в принципе как конец программы.

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

Любители построили Ковчег, а профессионалы - Титаник.

2

Re: JScript: Есть ли аналог оператора СТОП?

Думаю, что от большого кол-ва проверок не избавитесь, а для упрощения написания разрешающего условия в начале блоков можно ввести некую глобальную пременную, как бы "семафор". Т.е. в начале кода объявили ее глобальной, например, со значением "1", по ходу проверок свободного места и прочего при неудовлетворительных результатах проверок давать семафору значение 0, а на входе блоков проверять лишь его значение.
Я как-то в качестве "семафора" использовал строковую глобальную переменную, в которую добавлял в разных функциях описательный текст пользователю по ошибочной ситуации, в "решающих" моментах делал проверку ее длины: если эта переменная пустая - работаем дальше, если в ней что-то есть - кричу об ошибке и привожу ее текст.

WBR. Roman

3

Re: JScript: Есть ли аналог оператора СТОП?

сабж про wsh или про javascript как таковой ?

Я конечно далек от мысли... (с)

4

Re: JScript: Есть ли аналог оператора СТОП?

stir пишет:

Есть ли выход, чтобы постоянно не мудрить

Вырвал из контекста. Тем не менее...

stir пишет:

Вообщем мой код сейчас сильно замусорен всякими условиями и проверками

пересмотреть логику скрипта, его алгоритм, что-то еще.

Лучше сразу отметать ненужное. Например:

if ( проблема ) {
	WScript.Echo('что-то пошло не так');
	WScript.Quit();
}
( 2 * b ) || ! ( 2 * b )

5 (изменено: stir, 2011-12-29 12:12:58)

Re: JScript: Есть ли аналог оператора СТОП?

Rumata.
WScript.Quit(); - в яваскрипте сработает, скрипт закончит работу выведя инфу (ваша строка выше этой)? просто ниразу так не делал.. Сейчас попробую..

Любители построили Ковчег, а профессионалы - Титаник.

6 (изменено: JSmаn, 2011-12-31 09:01:58)

Re: JScript: Есть ли аналог оператора СТОП?

stir, абсолютно не понимаю о чем идет речь. О каком операторе Stop идет речь (из какого языка программирования)? Оператор GOTO в JS отсутствует, однако он заменен оператором continie label и  break label. Если идет речь о выходе из функции, то в JS отвечает оператор return. Если интересует выход из программы из среды WSH, то следует использовать WScript.Quit(). Если используете чистый JS из ScriptControl, то есть решение, рассмотренное в соседней теме. Также непонятно, используете ли Вы обработчик try-catch. Хотя бы код привели, чтобы мы поняли.

7

Re: JScript: Есть ли аналог оператора СТОП?

Оператор GOTO в JS отсутствует, однако он заменен оператором continie label и  break label

Я тоже "страдаю" об отсутствии goto, чем он помешал не понятно, не хочешь не пользуйся (это с моей колокольни).
Все мои попытки использовать continie label и  break label вне циклов привели к ошибкам. Я где то ошибаюсь? Эти конструкции можно использовать вне цикла? КАК?



С праздником, уважаемые! Супругу не забудьте поцеловать.

8

Re: JScript: Есть ли аналог оператора СТОП?

JSman, извините меня за нескромность мою, но я малость лентяй.

При написании кода на лету (или по ходу дела - кому как) приходится ставить условия и чем больше требуется многовариантности при сокращении кода, то возникают случаи, когда просто тупо надо закончить выполнение проги и не важно где возникла именно (!) ошибка, которую я предусмотрел - в цикле, при поиске в базах и т.д.

Ну к примеру при использовании активеХ, мы обращаемся в сетевому диску и ищем там уникальную папку, а если ее нет - останавливаем исполнение проги, а т.к. она сетевая, то выполнив проверку единожды мы не гарантируем разрыв связи в локалке, а значит мы с некоторой периодичностью должны простукивать" доступность этой папки. Это пример работы с одной папкой, а если прога предусматривает их несколько и проверки еще внутренние есть.. я стал уставать от вложенных подпрог-функций и кучи проверок, в итоге задумался почему бы просто не остановить прогу если в очередной раз появится КРИТИЧЕСКАЯ ошибка, которую пользователь НЕ в состоянии ПРЕОДОЛЕТЬ..
Итог: в общем это выглядит коряво - установить по ходу исполнения проги вложенных 40 как минимум проверок ИФ-ЕЛСЕ...вот собственно.

.. в школе я программировал когда-то на бейсике.. там все понятно с разветвлениями, если можно то создаешь подпрограмму и в любое время имеешь возможность к ней обращаться (с этим в яваскрипте нет проблемм - это функции), но вот переходы с ЛЮБОГО места проги просто невозможны (можно прервать цикл, получив к примеру код ошибки, но вытянув его из него надо провести сравнение --- иф-елсе или иное.. и это постоянно, а взаимосвязанные блоки мешают прерывать без последствий общий ход исполнения кода..)

уф.. похоже на набор слов.. но смысл вышеизложенного мне то понятен.. - я за упрощение кода и/или его адатпацию к элементной электронной логике (я радиолюбитель и логика микросхем мне известна..), а яваскрипт иногда это просто не позволяет.

Насчет задачи.. сейчас я подумал о создании бекапа на яваскрипте. Есть удаленный сервер 2008, моя машина с хп/7.  Т.К. использую ЦМС по автогенерированию страничек сайта по созданному шаблону, где неплохо реализуется код на яваскрипте, то себя особо не утруждая взялся за дело.
Планирую запуск осуществлять на самом сервере для уменьшения кода, хотя ранее хотел все делать на своей машине, но из-за умопомрочительных проверок подумываю отказаться от этого. Суть вот в чем: независимо от меня батник еженочно пыхтит и создает базу имен файлов в определенной папке, которую использует ранее созданная мной прога. Но ведь надо и бекап делать иногда! Поэтому моя вторая прога будет создавать куски по 4,3 гига из копий этих файлов. Операторы с завидной периодичностью создают новые файлы, поэтому прога создает свою базу уже записанных файлов и вторую базу - объемов этих файлов. Т.к. файла от 3 мега до 50, то уникальностью будут 2 параметра - имя и размер, мне этого будет достаточно. Прога будет стартовать с нуля, использует не только текстовые базы, но и массивы из них для ускорения работы, при  создании дисков прога учитывает заполненность предыдущего диска, автосоздает по шаблону новые имена папок, массивов, ведет лог записанных файлов и ошибок  и т.д... вообщем все в двух словах не сказать.
Думаю этого достаточно для осмысления большого множества проверок и условий. База/ы/ ежедневно пополня/ю/ется...

Любители построили Ковчег, а профессионалы - Титаник.

9 (изменено: stir, 2012-01-11 12:07:16)

Re: JScript: Есть ли аналог оператора СТОП?

Можно наверное было бы использовать совсем другие методы исполнения этой задачи и/или языки программирования, но ХТМЛ с возможностью вставки скриптов и простого запуска на ЛЮБОМ ПК мне нравится особенно. /батник не берем в учет совсем из-за малой возможности в управлении поведении программы человеком, да и красоты вывода инфы там не сделать/

Любители построили Ковчег, а профессионалы - Титаник.

10

Re: JScript: Есть ли аналог оператора СТОП?

For a web graphic designer, it is further beneficial to learn at least the basics of some programming languages like HTML, CSS and Jscript.

11

Re: JScript: Есть ли аналог оператора СТОП?

stir, а чем Вас не устраивает оформление логических блоков кода конструкцией try-catch?

12 (изменено: Rumata, 2012-03-08 21:03:19)

Re: JScript: Есть ли аналог оператора СТОП?

stir пишет:

похоже на набор слов..

перечитал Ваш пост #8. Не думаю так, далеко не набор слов. Но Вам надо пересмотреть свое отношение к программированию и стараться как можно меньше применять бейсиковские манеры в других языках. Продумывайте тщательнее алгоритм - начинайте с общих описаний задач, конкретизируйте шаги на каждом этапе детализации, Повторяющиеся действия оформляйте в функции.

stir пишет:

1. Ведем подсчет файлов и занимаемого места в папке Т1, Т2 и т.д. ПРичем заведомо известно, что Т1 меньше Т2 меньше Т3 и т.д.
2. Копируем Т1 в сетевую папку Т0 с условием, что Размер Т1 меньше свободного места Т0, если больше - конец программе с выдачей информации
3. Копируем Т2... + (зависит от Т1)
4. Копируем Т3... + (зависит от Т2)
и т.д.

.
приближение 1

копирование сетевых папок (сдвиг?)

.
приближение 2

получить список сетевых папок
скопировать каждую папку в предыдущую

.
приближение 3

получить список папок
для каждой папки скопировать если доступно место в предыдущей

.
приближение 4

получить список папок
получить размер первой папки
получить размер второй папки
если места в первой папке недостаточно - завершить программу
скопировать содержимое второй папки в первую
перейти к следующей папке

.
приближение 5 (псевдокод+JScript)

var folders = [t0, t2, ..., tn];

// получить первую папку и ее размер
var f0 = folders[0];
var s0 = f0.size;

for (var i = 1; i < folders.length; i++) {
    // получить вторую папку и ее размер
    var f1 = folders[i];
    var s1 = f1.size;

    // завершить если места недостаточно
    if ( s1 > s0 ) {
        WScript.Echo('недостаточно места для копирования ' + f1 + ' в ' + f0);
        WScript.Quit(1);
    }

    // скопировать папку f1 в f0
    f1.copyTo(f0);

    // запомнить параметры текущей папки для последующего копирования
    f0 = f1;
    s0 = s1;
}

.
Естественно, что на этом шаге, программа далека от завершения: необходимы - детализация чтения папки, получение ее размера и основное действие копирования средствами выбранного языка, необходима обработка логических ошибок (например, сбой обращения к ресурсу), но уже ясно видно как будет выглядеть основной скелет программы.
.
приближение 6 (псевдокод+JScript)

// вывести сообщение об ошибке и выйтти
function raiseError(msg)
{
    WScript.Echo(msg);
    WScript.Quit(1);
};

var folders = [t0, t2, ..., tn];

var f0;
var s0;

var e;

// получить первую папку и ее размер
try {
    f0 = folders[0];
    s0 = f0.size;
} catch (e) {
    raiseError('ошибка чтения папки ' + f0);
}

for (var i = 1; i < folders.length; i++) {
    var f1;
    var s0;

    try {
        // получить вторую папку и ее размер
        f1 = folders[i];
        s1 = f1.size;

        // завершить если места недостаточно
        if ( s1 > s0 ) {
            throw new Error('недостаточно места в ' + f0);
        }

        // скопировать папку f1 в f0
        f1.copyTo(f0);

    } catch (e) {
        // обработку всех ошибок сделаем централизованно
        raiseError('ошибка при копировании ' + f1 + ' в ' + f0 + '\n' + e.message);
    }

    // запомнить параметры текущей папки для последующего копирования
    f0 = f1;
    s0 = s1;
}

.
Обратите внимание, что в шестом приближении программа, все еще оставаясь написанной на смеси псевдокода и JScript, уже практически готова, осталось конкретизировать шаги обращения к папкам (получение размера, определение доступности, копирование).

( 2 * b ) || ! ( 2 * b )

13

Re: JScript: Есть ли аналог оператора СТОП?

Rumata, огромное спасибо! Я и ненадеялся на продолжение этой темы, тем более приятно видеть готовый хребет" кода. Я пока что ничего не предпринимал, оставил все на той стадии в виду отложенности задачи на месяц- другой из-за ее не срочности.
/Программу я планирую запускать теперь уже на сервере ночью, когда его загрузка =0, а цель программы - подготавливать информацию из файлов=картинок для последующей записи этих данных кратной двд/сд/ -носителю с отслеживанием изменений, созданием баз и пр.. в автоматическом режиме и выводом инфы в лог-файл для контроля. Как то так.. готового варианта для ознакомления пока не создал./

Любители построили Ковчег, а профессионалы - Титаник.