Вход | Регистрация
    1  2  3  4   
Информационные технологии :: Математика и алгоритмы

Используете Goto (переход по метке)?

Ø [Волшебник, 09.12.20 - 10:48]
Используете Goto (переход по метке)?
Я
   Zapal
 
04.12.20 - 10:32
4. нет! Код должен быть идеален!46% (26)
3. почти никогда, но пару раз было30% (17)
1. да! Свободно и без ограничений18% (10)
2. да, но только когда никто не видит7% (4)
Всего мнений: 57

немного предыстории, возможно кто-то не в курсе. Считается что использование этой конструкции показывает низкое качество кода. В некоторых языках его просто запретили

написал вот я его недавно и задумался - я один такой плохой или нас много? Насколько это явление вообще распространено в одинэсной среде? В типовых вроде не припомню, возможно им там тоже запретили

и да, давайте сразу договоримся - Прервать, Продолжить и Возврат это другое, здесь нет смысла делать опросы, их используют все. Речь конкретно о команде Перейти
   Доктор Манхэттен
 
101 - 04.12.20 - 22:19
(41) >>  "Прервать, Продолжить и Возврат" которые суть тоже самое и которые вы по-любому пользуете

Я не использую
   mishaPH
 
Модератор
102 - 04.12.20 - 22:20
всегда считал использующих оный в 1с ЛГБТ ативистами

4. нет! Код должен быть идеален!
   Доктор Манхэттен
 
103 - 04.12.20 - 22:20
Когда используешь "плохие" операторы, то нужно сперва задуматься, а все-ли правильно ты продумал в программе. Потому что они сигнализируют что что-то не так и нужно переделать по нормальному.
   dmpl
 
104 - 04.12.20 - 22:26
(57) Выход из глубокого цикла можно осуществить также поменяв значение переменных так, чтобы условия продолжения всех циклов не выполнялись ;) Впрочем, часто это грязные трюки, которые еще хуже GOTO.

(64) А есть еще самомодифицирующийся код. Трюки с GOTO по сравнению с этим вообще детский лепет, поэтому доступно это только гуру.
   Доктор Манхэттен
 
105 - 04.12.20 - 22:29
(104) Если из цикла требуется выход, значит цикл применили не по назначению.
   dmpl
 
106 - 04.12.20 - 22:31
(71) В 1С вообще кастрированный GOTO. Классический GOTO позволял перейти вообще в любое место, вне зависимости от того, какая это процедура или функция.
   Сияющий Асинхраль
 
107 - 05.12.20 - 00:49
Когда только-только начинал програмить, писал как потом оказалось практически полностью по типу ассемблера, то бишь практически все было только на метках - циклы, переходы, и т.д. Но поскольку уже тогда знал, что использование меток является дурным тоном, то как-то попытался переработать уже написанный код на код без меток, на удивление получилось достаточно быстро. С тех пор всегда писал без меток, и не то чтобы я против них имею какое-то предубеждение, нет, просто за более чем 15 лет метки ни разу так и не понадобились. Хотя в чужом коде изредка встречаются...
   Ненавижу 1С
 
108 - 05.12.20 - 16:33
(106) надо больше хардкора!
   CepeLLlka
 
109 - 05.12.20 - 16:36
Ни разу не использовал..
   Провинциальный 1сник
 
110 - 05.12.20 - 16:54
Последний раз в школе, когда программировал на вильнюс-бейсике.
Никогда не возникало такой задачи, когда приходилось бы использовать гото.

3. почти никогда, но пару раз было
   Провинциальный 1сник
 
111 - 05.12.20 - 16:56
(94) "антипаттерт Макросервис, а в соседнем ртделе обсуждают дропинг саппорта Кубером Докера"
Кто все эти люди?
   obs191
 
112 - 05.12.20 - 16:58
Сегодня согрешил. А так - очень редко.

3. почти никогда, но пару раз было
   Klesk
 
113 - 05.12.20 - 18:57
никогда, у меня и без этого говнокода хватает

4. нет! Код должен быть идеален!
   pavig
 
114 - 05.12.20 - 19:01
(0) Ни разу не использовал и даже не понимаю для чего оно нужно. Как-то всегда обходился без этого вот. Да и вроде не видал никогда чтобы кто-то что-то подобное делал.

4. нет! Код должен быть идеален!
   pavig
 
115 - 05.12.20 - 19:04
(94)
+100500 прямо в точку!
   NcSteel
 
116 - 05.12.20 - 21:36
Постоянно использую Возврат, Прервать или Продолжить.

1. да! Свободно и без ограничений
   novichok79
 
117 - 05.12.20 - 22:09
когда писал первое что-то в 1С использовал.
продолжить, прервать и возврат полностью покрывают потребности.

3. почти никогда, но пару раз было
   patapum
 
118 - 05.12.20 - 23:47
И метки ни одной в коде за свою жизнь не видел...

4. нет! Код должен быть идеален!
   Доктор Манхэттен
 
119 - 06.12.20 - 04:09
(116) Ну и зря. Это говнокод, или антипаттерн по современному.
   Конструктор1С
 
120 - 06.12.20 - 05:05
(119) нужно уметь писать код без Возврат, Прервать и Продолжить. Многие не умеют. Пытаются, но получаются уродства с огромной вложенностью условных операторов if. А это усложняет восприятие кода не хуже goto
   ДенисЧ
 
121 - 06.12.20 - 05:13
(120) Напиши _функцию_ без возврат ))
   Конструктор1С
 
122 - 06.12.20 - 05:37
(121) функцию без возврата не напишешь, а вот процедуру легко. Но и в функциях часто творится уродство с возвратами. Например, их может быть много, и половина из них запрятана в недрах логических ветвлений
   Гобсек
 
123 - 06.12.20 - 07:11
Последний раз использовал лет 20 назад

4. нет! Код должен быть идеален!
   Провинциальный 1сник
 
124 - 06.12.20 - 07:42
(120) (121) Если Прервать или Продолжить улучшает читаемость и понятность кода - то пофиг на "антипаттерны".
   Провинциальный 1сник
 
125 - 06.12.20 - 07:43
(124) А рассуждать о функциональном программировании в контексте 1с просто смешно. Это чисто процедурный язык. А функция - это процедура с возвращаемым значением.
   xXeNoNx
 
126 - 06.12.20 - 10:35
Вот вы все и попались, адепты готу.
   ДенисЧ
 
127 - 06.12.20 - 10:36
(126) Не, тут в основном дартаньяны отмечаются...
   dmpl
 
128 - 06.12.20 - 11:32
(119) Говнокод - это когда на процессоре в сотни раз быстрее программа выполняется медленнее чем в 90-х годах прошлого века.
   jbond
 
129 - 06.12.20 - 11:52
(127)  эта ветка - очедное доказательство того, что 1Сники - это не программисты.
   Провинциальный 1сник
 
130 - 06.12.20 - 18:59
(129) Программирование в работе 1сника необходимая часть, но работа 1сника это не только программирование. Разумеется, что 1сник может не быть в курсе всех новинок в технологии программирования с непонятными иностранными названиями. Просто они за пределами его предметной области. Это как инженер-строитель может быть не в курсе всех новинок в области гидропривода - хотя и пользуется этими технологиями.
 
 Рекламное место пустует
   sitex
 
131 - 06.12.20 - 19:04
(0) Использую и не стесняюсь.

1. да! Свободно и без ограничений
   Mikeware
 
132 - 06.12.20 - 20:13
(121) в каком-то из языков (или из диалектов) возвращаемым значением функции являлась автоматически создаваемая переменная с именем, совпадающим с именем функции. И в каком-то - переменная с именем вроде "результат".
Так что не надо недооценивать возможные извращения и извращенцев.
   jbond
 
133 - 06.12.20 - 20:15
(130) если подс..летние специалисты с довольно большими зарплатами и высоким самомнением и ощущением свое избранности и уникальности ведут обсуждение уровня современных учеников 7..8 класса...
   Mikeware
 
134 - 06.12.20 - 20:16
а по теме - не пользуюсь, ибо нужды не возникает, и давно.
в принципе, даже на ассемблерах можно писать "без гоуту", в том смысле, что обходиться без прыжков из/в  структуры управления.
   Гений 1С
 
135 - 06.12.20 - 20:35
Обычно для выхода к концу процедуры/функции, если просто возврат сделать нельзя.
Больше случаев не припомню.

1. да! Свободно и без ограничений
   Провинциальный 1сник
 
136 - 06.12.20 - 20:38
(132)"возвращаемым значением функции являлась автоматически создаваемая переменная с именем, совпадающим с именем функции"
Так в Паскале же. Изначально так было. Я это ещё застал, на СМ-4.
Потом в борланде добавили возможность использовать result.
   Гений 1С
 
137 - 06.12.20 - 20:42
(128) в 90х годах эта программа просто не скомпилировалась бы, там объемы ОЗУ были маленькие. У тебя бы номенклатура средней базы 1С туда бы не влезла, не говоря уже про доки и регистры. не ной.
   Провинциальный 1сник
 
138 - 06.12.20 - 21:05
(137) В 90-х писали так, что в принципе было пофиг на объем памяти. Программа на фокспро работала даже на 640 килобайтах. С любым объемом данных (с учетом ограничения на dbf).
   Еврейчик
 
139 - 06.12.20 - 21:21
ни разу не приходилось. даже в Институте. Запрещено законом.


Если хотите goto то пишите на ассемблере.
   Еврейчик
 
140 - 06.12.20 - 21:22
(95)ну бейски без goto же не бейсик... только в ней можно использовать goto законным образом. Без зашквара. Хотя использование бейсика это тот еще зашквар.
   Гений 1С
 
141 - 06.12.20 - 21:33
(140) Вопрос об законности использовании Goto возникает только у тех, кто в универе прогуливал структурное программирование. Там наглядно объяснено когда можно, когда нельзя. Курим Дейкстру
   Ненавижу 1С
 
142 - 06.12.20 - 22:02
(141) раскрой тему, раз уж начал
   Гений 1С
 
143 - 06.12.20 - 22:50
(142) прости, это долго, а значит платно
   jbond
 
144 - 06.12.20 - 23:00
(142) лоол. Тема гуглится за минуту:

По теореме Бёма — Якопини Goto не нужен там, где есть поодержка конструкций цикла Пока, следования и условия.
   Гений 1С
 
145 - 06.12.20 - 23:15
(144) то бишь нигде не нужен. ;-)
   Cthulhu
 
146 - 06.12.20 - 23:16
херасе (145) для тебя "долго а значит платно"
   Гений 1С
 
147 - 06.12.20 - 23:17
(146) у нас с Ненавижном свои приколы. ;-)
ну на самом деле GOTO становится злом только в коде в виде лапши, т.е. с непонятными переходами.
Если это переход в конец процедуры, то норм.
   Cthulhu
 
148 - 06.12.20 - 23:20
(147): знаю только один случай, в котором прямой переход по метке может быть нужен (по совокупности факторов!). это когда непростую рекурсию с меньшими ресурсозатратами надо эмулировать (а сама рекрсия нужна немалое число раз - что значит многократное размножение копий контекстов)
   Ненавижу 1С
 
149 - 06.12.20 - 23:34
(147) а нах в конец процедуры переходить если есть возврат
Какая-то непоследовательность
   Злопчинский
 
150 - 07.12.20 - 00:16
(149) ну, например, по (перед) возврату надо сделать некую киолд еще... да, можно сделать отдельную процедуру/функцию и вызывает ее в двух местах...
   Cthulhu
 
151 - 07.12.20 - 00:23
(149): возврат из одной точки в конце - правило хорошего тона а также упрощает сопровождение (не говоря уж об уменьшении гимора для полследователей). ну чтобы кто-нибудь всовывая код в конце процедуры, который должен сработать в дополнение к тому как оно работает (и не ковыряясь во всем остальном) - не удивлялся тому, что оно не срабатывает...
   Гений 1С
 
152 - 07.12.20 - 01:44
(151) вот, видно что не мальчик, но муж. ;-)
   DionisSergeevich
 
153 - 07.12.20 - 02:39
Вообще не приходилось. И даже не задумывался. Ни в 1с, ни в джаве. Только условные переходы  по смещению в асме, лет 17 назад

4. нет! Код должен быть идеален!
   MadHead
 
154 - 07.12.20 - 02:42
Когда-то давно было. Сейчас потребности такой не возникает

3. почти никогда, но пару раз было
   Доктор Манхэттен
 
155 - 07.12.20 - 06:31
(120) Хоть один одинесник в теме, и то хорошо.
Мои принципы программирования таковы:
1. Никаких условных операторов внутри функций. (Не использовать if)
2. Никаких циклов со счетчиком или с выходом из цикла по условию, и прочие. (никаких for)
3. Возврат из функции только один и в самом конце.
4. Не переопределять переменные. Каждая переменная может быть инициализирована только один раз в момент ее определения. (никаких var, только const)


Если какой-то из пунктов нарушается, ищу что у меня в программе не правильно спроектировано, и почти в 100% случаев нахожу и исправляю.

4. нет! Код должен быть идеален!
   Доктор Манхэттен
 
156 - 07.12.20 - 06:31
(121) Скорее всего чел имел в виду что не должно быть возврата внутри цикла.
   Доктор Манхэттен
 
157 - 07.12.20 - 06:33
(124) Прервать или Продолжить не могут улучшить читаемость, но могут только запутать, усложнить отладку и тестирование.
   Провинциальный 1сник
 
158 - 07.12.20 - 06:51
(157)
Вот такой паттерн c "продолжить" отлаживать намного проще, чем если все фильтры запихать в одну длинную строку Если с условиями по И. Особенно если фильтры сами по себе сложные.

---
Для Каждого .. из ... цикл
  // накладываем фильтры
  Если <фильтр 1> Тогда
    Продолжить;
  КонецЕсли
  ...
  Если <фильтр N> Тогда
    Продолжить;
  КонецЕсли

  <делаем что-то полезное>
КонецЦикла;
   Доктор Манхэттен
 
159 - 07.12.20 - 07:29
(158) Вовсе не проще. Куча условий, трудно читать. Это же говнокод ты только что написал. За такое у нас сразу по рукам канделябрами. Этот код не пройдет Код-ревью и не будет пропущен в продакшн пока не исправишь как надо.
   Paint_NET
 
160 - 07.12.20 - 07:31
(159) Дык показал бы сразу, как надо.
 
 Рекламное место пустует
   Доктор Манхэттен
 
161 - 07.12.20 - 07:32
(160) Вот так надо:

ОтфильтрованныйМассив1 = Фильтр1(ИсходныйМассив);
...
ОтфильтрованныйМассивN = ФильтрN(ОтфильтрованныйМассивN-1);

Для Каждого .. из ОтфильтрованныйМассивN цикл
  <делаем что-то полезное>
КонецЦикла;
   Bigbro
 
162 - 07.12.20 - 07:35
Доктора разработчики ЗУП покусали.

1. да! Свободно и без ограничений
   ДенисЧ
 
163 - 07.12.20 - 07:37
(161) Ты канделябр-то вытащи из "подсвечника"
   Bigbro
 
164 - 07.12.20 - 07:38
за 161 я бы кстати руки ломал.
158 лучше.
   Доктор Манхэттен
 
165 - 07.12.20 - 07:39
(164) Хорошо что тебя не допустят к решению что лучше в серьезных проектах.
   Bigbro
 
166 - 07.12.20 - 07:40
(165) допускали и неоднократно. и не сожалели ни разу. в отличие от тебя очевидно.
   Доктор Манхэттен
 
167 - 07.12.20 - 07:41
Могу объяснить чем (158) хуже:
1. Используются операторы изменения хода программы "Если Тогда"
2. Используются операторы изменения хода программы "Продолжить"
3. Выглядит грязно
   Доктор Манхэттен
 
168 - 07.12.20 - 07:42
(166) Пустые слова.
   Bigbro
 
169 - 07.12.20 - 07:43
(168) слова балаболки, даже не понимающего потенциальных проблем использования (161).
   Mikeware
 
170 - 07.12.20 - 07:46
(136) На СМ-4 (под RSX-11) мы так компилятор паскаля и не запустили. На СМ-1800 и корветах - гоняли, но не в реальных задачах.
а в дельфях вроде уже Result был...
   Доктор Манхэттен
 
171 - 07.12.20 - 07:46
(169) И снова пустые слова.
   Paint_NET
 
172 - 07.12.20 - 07:50
В (161) утяжеление кода бессмысленное, если фильтры простыми условиями задаются. И это, отдельная процедура на каждый фильтр? Серьёзно? Создай одну процедуру и передавай туда структуру отбора с исходными данными, если уж на то пошло. А вот это Фильтр1(...), Фильтр2(...) - дичь полная.
   dmpl
 
173 - 07.12.20 - 07:51
(137) Расскажи это клюшечникам ;)

(151) Ну... а если произошла логическая ошибка, смысл в том коде?

(155) После этого неудивительно что программы такие тормозные и прожорливые до памяти...
   Paint_NET
 
174 - 07.12.20 - 07:51
Эпичненько у тебя получилось лютым говнокодом на просто некрасивый код ответить, бгг :)
   ДенисЧ
 
175 - 07.12.20 - 07:54
(170) На ДВК2 (rt11sj) у меня паскакаль работал. А вот си мне так и не нашли ((
   Доктор Манхэттен
 
176 - 07.12.20 - 07:58
(172) Фильтр1(...) - это я условно описал часть программы, которая выполняет фильтрацию. Если не любишь создавать функции, можешь прямо по тексту выполнить фильтрацию с присвоением результата в новую переменную. Но я бы порекомендовал вынести в функцию любую операцию, имеющую определенный смысл, для улучшения качества кода.
На счет утяжеления - это ничтожно и практически не влияет на быстродействие. То же условие Если Тогда интерпретатор выполнит используя 100500 вызовов функций. Переделав его в вызов своей функции, ты возможно добавишь на незначительное количество вызовов больше, а может наоборот убавишь на некоторое количество, это вообще не важно. Процессорное время стоит во много раз дешевле чем время программиста. Программу нужно писать в первую очередь для человека, который ее будет читать впоследствии, и только во вторую очередь для машины.
   Провинциальный 1сник
 
177 - 07.12.20 - 07:58
(175) Си тоже был на нашей кафедральной СМ-4. Вообще прикольно там было. Знакогенератор был специфический, 7-битный, где маленькие латинские плюс некоторые спецсимволы были заменены на большие русские. В результате вместо фигурных скобок в Си-программах ставили Ш и Щ. Хорошо недолго этим занимались, быстро перешли на борланд на писишках.
   dmpl
 
178 - 07.12.20 - 07:58
(162) Кстати, про внедрение ЗУП на Автовазе. Там самописная программа считала свыше 100 тыс. сотрудников за несколько часов на древнем оборудовании. Когда стали внедрять ЗУП, остановили расчет через 3 суток, хотя и сотрудников уже было в разы меньше, и оборудование для ЗУП гораздо более шустрое.

(167) А теперь покажи что у тебя в функциях Фильтр1...ФильтрN.
   dmpl
 
179 - 07.12.20 - 08:00
(176) Слова человека, который никогда не разрабатывал высоконагруженных систем.
   Доктор Манхэттен
 
180 - 07.12.20 - 08:00
(174) Не тот код ты называешь говнокодом, дружище. Ох как ошибаешься
   Доктор Манхэттен
 
181 - 07.12.20 - 08:05
(179) Все зависит от условий. Паттерн стандартный:

функция Фильтр1 (входящийМассив) {
    возврат входящийМассив.фильтр(элементМассива => условие(элементМассива));
}
   Paint_NET
 
182 - 07.12.20 - 08:06
(180) Ты же понимаешь, что создание функций Фильтр1(), Фильтр2(), ФильтрN() - это именно говнокод, в самом эпичном его проявлении - дублировании кода?

Если идти по твоей схеме, то создавать надо одну функци. Фильтр(ПараметрыОтбора, МассивДанных), без дублирования кода в множестве функций.
   Провинциальный 1сник
 
183 - 07.12.20 - 08:06
Есть два правильных подхода к паттернам разработки.
Первый - писать так, чтобы в коде было легко разобраться тебе через N лет или чужому человеку.
Второй - писать так, чтобы код выполнялся с минимальными затратами ресурсов вычтехники.

И третий - неправильный. Писать так, чтобы выполнять некие навязанные свыше условия, даже если они тормозные и непонятные.
   Доктор Манхэттен
 
184 - 07.12.20 - 08:06
(179) Сразу видно что ты не в курсе что я разрабатывал.
   Paint_NET
 
185 - 07.12.20 - 08:08
(184) Ну опять же, мог бы и написать, если есть публичные проекты, к чему эта токсичность? Иначе получается "я прав, патамушта я прав".
   ДенисЧ
 
186 - 07.12.20 - 08:08
(183) Код писать нужно так, как будто его читать будет параноик с манией убийства, который знает твой домашний адрес
   Доктор Манхэттен
 
187 - 07.12.20 - 08:11
(182) Если код в функциях действительно будет дублироваться, то есть смысл его вынести в одну общую функцию. Но мы не знаем какие там условия, на сколько они сложные, и на сколько задублированный получится код. Поэтому твои слова - просто выдумка, основанная на предположении что код будет задублирован.

Собрать все функции по фильтрации в одну функцию - это правильно, я только за, при условии что эта функция будет выполнять одну общую задачу, состоящую из нескольких напрямую связанных по логике, а не множество разных несвязанных между собой.
   Доктор Манхэттен
 
188 - 07.12.20 - 08:14
(185) "я прав, патамушта я прав" - это вполне достаточный ответ на заявление "ты неправ потому что ты не прав". Раз оппонент не привел ни одного аргумента, то он недостоин получить аргументированный ответ.
   Mikeware
 
189 - 07.12.20 - 08:14
(183) "Помните: программы читаются людьми."© Д.ВанТассел
как правило, оптимизирующие компиляторы (это если не касаться 1с) хорошо сглаживают "перекос в сторону читаемости"
   Paint_NET
 
190 - 07.12.20 - 08:15
(187) Так, теперь ты и в мою сторону начинаешь ядом плеваться, ыксперд?
Это не выдумка, т.к. исходный код, который ты назвал говнокодом, основывается на простых условиях, которые не надо раскидывать по различным функциям фильтров, как ты это реализовал.
   Доктор Манхэттен
 
191 - 07.12.20 - 08:18
(190) Переходишь на личности? Тут спор можно было бы и закончить. Но я объясню: избавившись от условий, я очистил код, превратив его из говнокода в нормальный, легко читаемый, легко отлаживаемый, легко тестируемый.
   Paint_NET
 
192 - 07.12.20 - 08:22
(191) Нет, ты создал из просто некрасивого кода говнокод, сделав N функций с дублирующимся кодом вместо N простых условий. Почему - я выше аргументировал, но ты не сумел опровергнуть мою аргументацию. Начал на ходу придумывать "не знаем, какие там условия, насколько они сложные", т.к. не понимаешь, что нет настолько сложных условий между Если... Когда, которые нельзя унифицировать и передать структурой в универсальную функцию фильтра.
   Галахад
 
193 - 07.12.20 - 08:28
Коли уж пошла такая пьянка, приведите пример конфигурации, на 1С разумеется, от и до написанную прекрасным слогом.
   Paint_NET
 
194 - 07.12.20 - 08:30
(193) *всхохотнув*
ЗУП xD

А вообще, из типовых наиболее приближенна к хорошему коду, имхо, Бухгалтерия.
   Галахад
 
195 - 07.12.20 - 08:32
(194) Желательно не от вендора. Судя по этой теме должны же быть еще более прекрасно написанные программы.
   Paint_NET
 
196 - 07.12.20 - 08:35
(195) Увы, среди нетленок красивый код - это редкое исключение. На некоторые поделия Раруса без слёз не взглянешь.
   Провинциальный 1сник
 
197 - 07.12.20 - 08:37
(196) Красивый код пишут только ради искусства. Когда "джентельмен развлекается". А не по команде сверху или для зарабатывания денег.
   Paint_NET
 
198 - 07.12.20 - 08:38
(197) Ну, можно хотя бы стараться в этом направлении.
Неудобоваримые и плохо поддерживаемые портянки не так уж сложно писать более структурированно и аккуратно, без существенных потерь в скорости.
   dmpl
 
199 - 07.12.20 - 08:48
(184) Если бы ты действительно разрабатывал что-то высоконагруженное, то знал бы, что месяц работы программиста - 5000-10000$, а экономия на оборудовании за счет оптимизации, выполненной за этот месяц - сотни тысяч $. Процессорное время не бесплатное и далеко не бесконечное, если программист считает его бесплатным и бесконечным - он плохой программист. Некоторые системы в принципе не заработают при недостаточном уровне производительности из-за блокировок от медленно исполняющегося кода.
   dmrjan
 
200 - 07.12.20 - 08:53
Использование циклов - зло для SQL-баз. Ограничение стоимости запроса приходится отключать из-за таких программистов.

4. нет! Код должен быть идеален!
  1  2  3  4   

Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.