У меня есть конструкция следующего вида
switch($first_lvl) {
case 'first_sub_lvl_step_1' :
switch ($second_lvl) {
case 'second_sub_lvl_step_1' :
switch ($third_lvl) {
case 'third_sub_lvl_step_1' :
//sameAction
break;
case 'third_sub_lvl_step_2' :
//sameAction
break;
}
break;
case 'second_sub_lvl_step_2' :
//sameAction
break;
}
break;
case 'first_sub_lvl_step_2' :
//sameAction
break;
}
Да, я в курсе - выглядит это абсолютно нечитаемо. Вкратце, тут изображен трех-уровневый switch-case. На каждый case идет либо универсальная функция со своим входным параметром, либо индивидуальная функция.
Такой пирамидой я избавил себя от лишних файлов. Все кейсы снабжены коментариями и в оригинальном коде это выглядит не так ужасно как в данном примере.
У меня только один вопрос - это нормальная практика или так категорически делать не стоит? Аргументируйте пожалуйста ответ и если так делать не стоит посоветуйте оптимальный выход.
Благодарю.
Спустя 2 часа, 2 минуты, 40 секунд (27.08.2012 - 04:14) Guest написал(а):
Нормальное синтаксически верное выражение. Ну и что что огород?
Спустя 2 часа, 27 минут, 19 секунд (27.08.2012 - 06:41) KOPOJI написал(а):
Оно конечно нормальное синтаксическое выражение.. Но я советую пересмотреть архитектуру приложения, лично у меня ни разу не было такой ситуации с необходимостью двойных свитчей
Спустя 3 минуты, 13 секунд (27.08.2012 - 06:44) KOPOJI написал(а):
от каши можно избавиться следующим образом: разбить это
к примеру вот так
ну и так далее - разбить можно при желании..
к примеру вот так
function foo($first_level) {
//здесь первый, главный свитч
switch($first_level) {
case 'first_sub_lvl_step_1' : return .... ; break;
....
}
}
switch(foo()) {
...
}
ну и так далее - разбить можно при желании..
Спустя 1 час, 1 минута, 52 секунды (27.08.2012 - 07:46) Игорь_Vasinsky написал(а):
не читабильно как бы...
я бы рекомендовал попробывать этапы запихать в обёртки (функции) и работать с ними.
я бы рекомендовал попробывать этапы запихать в обёртки (функции) и работать с ними.
Спустя 10 часов, 53 минуты, 34 секунды (27.08.2012 - 18:40) NierRa написал(а):
Есть следующая конструкция:
Как ее заменить на что-то подобного вида, если внутри switch-case циклы не работают?
switch($a) {
case 1:
case 2:
case 3:
case 4:
case 5:
call_user_func('sameFunc', $a, $b, $etc)
break;
default:
//SameAction
}
Как ее заменить на что-то подобного вида, если внутри switch-case циклы не работают?
define('START_NUMB', 1);
define('MAX_NUMB', 5);
switch($a) {
for($int = START_NUMB; $int <= MAX_NUMB; $int++) {
case $int :
call_user_func('sameFunc', $a, $b, $etc);
break;
}
default:
//SameAction
}
Спустя 1 час, 55 минут (27.08.2012 - 20:35) sergeiss написал(а):
Цитата (NierRa @ 27.08.2012 - 04:11) |
Не хотел создавать тему только из-за одного вопроса, но нужен совет... |
А зачем бы тогда вообще создавать темы на этом форуме? ;)
Если я правильно понял то, что ты хочешь сделать.... Хотя исходных данных и недостаточно. ОК. Предположим, что в твоем цикле, при вызове call_user_func() переменным является первый параметр, некое имя функции. Точнее, одна из набора функций. Используем ассоциативные массивы.
Тогда....
// пусть всего 3 функции будет
$func_array=array( 0 => 'func_00', 1 => 'func_01', 2 => 'func_02');
// вызываем последовательно все функции
for( $i = 0; $i <=2 ; $i++)
call_user_func( $func_array[ $i ], $a, $b, $etc);
Если на каждом шаге цикла должны изменяться другие параметры, то их ними можно точно также изменять.
Спустя 1 час, 21 минута, 4 секунды (27.08.2012 - 21:56) NierRa написал(а):
Вот кусок кода о котором речь:
Функция create_Hero используется одна и та же, просто на вход в нее поступают разные параметры. Я бы хотел вот тот список кейсов занести в цикл
Листинг функций выложу на всякий случай
Upd. Про обработку данных знаю, Этот кусок кода написан для теста и я экономлю себе время
...
case 'placement':
switch($round) :
case 1:
case 2:
case 3:
case 4:
case 8:
case 9:
case 10:
$class = call_user_func('create_Class', $round);
call_user_func('create_Hero', $round, $class);
break;
default:
call_user_func('create_Placement');
break;
endswitch;
break;
...
Функция create_Hero используется одна и та же, просто на вход в нее поступают разные параметры. Я бы хотел вот тот список кейсов занести в цикл
Листинг функций выложу на всякий случай
function create_Class($round) {
switch ($round) {
case 1:
case 4:
case 7:
$class = 'agi';
break;
case 2:
case 5:
case 8:
$class = 'str';
break;
case 3:
case 6:
case 9:
$class = 'int';
break;
}
return $class;
} /* endFunction */
function create_Hero($round, $class) {
echo '<div id="temp">';
$query = mysql_query("SELECT *
FROM `heroes`
WHERE `for_round` = '".$round."'
AND `heroClass` = '".$class."'
ORDER BY `key`") or call_user_func(db_connect_error);
while($hero = mysql_fetch_assoc($query)) : ?>
<script type="text/javascript">
$(document).ready(function(){
$(".CheckBoxClass").change(function(){
if($(this).is(":checked")){
$(this).next("label").addClass("LabelSelected");
}
else{
$(this).next("label").removeClass("LabelSelected");
}
});
$(".RadioClass").change(function(){
if($(this).is(":checked")){
$(".<?= $hero['name']; ?>Selected:not(:checked)")
.removeClass("<?= $hero['name']; ?>Selected");
$(this).next("label").addClass("<?= $hero['name']; ?>Selected");
}
});
});
</script>
<input id="<?= $hero['name']; ?>" class="RadioClass" name="group1" type="radio">
<label id="<?= $hero['name']; ?>" for="<?= $hero['name']; ?>"
class="<?= $hero['name']; ?>"></label>
<?php endwhile;
echo '</div>';
} /* endFunction */ ?>
Upd. Про обработку данных знаю, Этот кусок кода написан для теста и я экономлю себе время
Спустя 2 часа, 11 минут, 58 секунд (28.08.2012 - 00:08) sergeiss написал(а):
А зачем вообще вот этот вложенный свич?
Цитата (NierRa @ 27.08.2012 - 23:56) |
switch($round) : case 1: case 2: case 3: ... |
Тут просится обычный IF.
Ну, например, так....
if( in_array( $round, array( 1, 2, 3, 4, 8, 9, 10) ) )
{
// тут делаешь то, что надо
}
else
{
// дефолт
}
Спустя 33 минуты, 14 секунд (28.08.2012 - 00:41) NierRa написал(а):
К сожалению я только учусь и моих знаний и опыта просто не хватает для таких решений
Спустя 5 минут, 52 секунды (28.08.2012 - 00:47) sergeiss написал(а):
Цитата (NierRa @ 28.08.2012 - 02:41) |
К сожалению я только учусь.... |
Почему "к сожалению"? Если реально учишься и используешь новые знания, то это как минимум "хорошо", а не "к сожалению".
Спустя 4 минуты, 15 секунд (28.08.2012 - 00:51) NierRa написал(а):
У меня есть достаточно большой проект (только для персонального пользования), который я пишу исходя из тех знаний, которые уже имею. Постоянно переписываю отдельные участки кода, исходя из приобретенных новых знаний.
К сожалению - это потому что в сутках 24 часа, а не 72 и мне катастрофически не хватает времени захватывать больше информации
К сожалению - это потому что в сутках 24 часа, а не 72 и мне катастрофически не хватает времени захватывать больше информации
_____________
Задача на корректную обработку данных (мое решение)
http://eu.battle.net/sc2/ru/profile/2212951/1/IIIIIIIIIIII/