Архив метки: код

Про дублирование кода в контроллерах

Перестаньте выносить повторяющийся код. Дублирование кода — это нормально. Особенно в контроллерах. Когда мы говорим про DRY многие забывают про Try. Далеко не все дублирование нужно устранять. В целом мотивация этого действа весьма простая — если в коде будут баги и этот код дублируется — то надо править в нескольких местах. Однако с другой стороны, когда речь идет про такие вещи как контроллеры, которые декларируют последовательность действий, очень удобно когда весь флоу прописан последовательно и прочитать его можно без прыжков между файлами. А еще веселее становится после того, как через месяц после устранения дублирования вдруг оказывается что «некоторые штуки то оказывается были просто похожи но не являлись дублированием». И разворачивать всю эту штуку уже не так приятно. Та же история и с «поведениями» для Yii. Они конечно здорово и весело, но при определенном масштабе создают сложности для понимания кода.

 

Так что перед тем как устранять дублирование такими примитивными механизмами как трейты, следует задуматься:

  • А не вытекла ли у меня логика случайно из какого-то объекта? Может она должна быть где-то инкапсулирована?
  • А не проще ли мне вынести эту логику в какой-то отдельный объект, который будет медиатором между той и этой штукой (например между контроллером и моделью данных, или мидлвари, или еще чего).
  • А как много дублирования? одно и то же в двух местах? не, пока рано что-то с этим делать. Добавлю пометку на будущее а если надо будет править буду уже думать.

https://habrahabr.ru/post/326960/#comment_10200012

Изучаем Perl. Упражнения к главе 3.

Перечитывая в 3-ий раз «Изучаем Perl» решил пройтись по всем упражнениям, которые там приводятся. Бубликую здесь свои варианты решения.

п.с. Парсер блогера вырезает строку STDIN, заключенную в знаки <> =(

1.

use strict;
use warnings;
use 5.010;
say 'Enter some lines!';
my @lines = ; 
say "Reversed lines is @lines";

2.

use strict;
use warnings;
use 5.010;
my @names = qw/Perl Php Python Ruby C++ C Shell/;
say 'Enter some numbers:';
chomp(my @numbers = ); 
say 'You favorite languages is:';
foreach(@numbers){
    say $names[$_] if $names[$_];   
}

3.

use strict;
use warnings;
use 5.010;
say 'Input some strings!';
chomp(my @strings = 'STDIN');
@strings = sort @strings;
say "Sorted strings is: @strings";

Perl. Восстановление переменной в цикле

use strict;
use warnings;
use 5.010;
my @languages = qw/Perl PHP Ruby/;
my $lang = 'Python';
foreach $lang (@languages){
    say $lang;
}
say '===========Loop is end!==========';
say $lang;

В результате получим:

Perl
PHP
Ruby
===========Loop is end!==========
Python

Таким образом Perl, при входе в цикл foreach сохраняет значение управляющей переменной, а после выхода из цикла восстанавливает ее.
Кроме того при модификации управляющей переменной — меняется и элемент массива:

use strict;
use warnings;
use Data::Dumper;
use 5.010;

my @languages = qw/Perl PHP Ruby/;
my $lang = 'Python';
foreach $lang (@languages){
    $lang = "$lang is cool!" if $lang eq 'Perl';
    say $lang;
}
say Dumper(\@languages);

Получим:

Perl is cool!
PHP
Ruby
$VAR1 = [
‘Perl is cool!’,
‘PHP’,
‘Ruby’
];

Yii хотелки и меньше лапше-кода

Довольно часто, при работе с сессией в Yii, приходится писать код вот такого плана:

$nickName    = Yii::app()->user->getState('nickName');
$accessLevel = Yii::app()->user->getState('accessLevel');
.........................................................

Аналогично и при установке этих значений.

Было бы здорово иметь возможность передавать методам getState и setState массив параметров:

$data = Yii::app()->user->getState(array(
       'nickName',
       'accessLevel' 
));

или

Yii::app()->user->setState(array(
       'nickName'     => 'xoma',
       'accessLevel'  => 'superAdmin' 
));

JavaScript экономим на if или очередная экономия на спичках

Чем меньше по объему внешний JavaScript-файл, тем лучше (он быстрее загружается браузером и возможно (!) быстрее выполняется).

Мало какие сценарии JavaScript обходятся без конструкции if…else.

Типично она выглядит вот так (использую jQuery):

if($(this).is(':checked')){
    $('span.noAnonym').hide();
}else{
    $('span.noAnonym').hide();
}

Как видно из примера в блоках if и else всего по одному выражению.
В этом случае, конструкцию if…else можно заменить тернарным оператором ? :.

Перепишем предыдущий пример:

$(this).is(':checked') ? 
$('span.noAnonym').hide() :
 $('span.noAnonym').show();

Экономим 10 символов !!!