Если нельзя, но очень хочется, то нужно обязательно и ничего в мире не стоит того, чтобы делать из этого проблему!


Интересна Java? Кликай по ссылке и изучай!
Если тебе полезно что-то из того, чем я делюсь в своем блоге - можешь поделиться своими деньгами со мной.
с пожеланием
столько времени читатели провели на блоге - 
сейчас онлайн - 

вторник, 21 сентября 2010 г.

Подборка #23

Есть и другие подборки: #1, #2, #3, #4, #5, #6, #7, #8, #9, #10, #11, #12, #13, #14, #15, #16, #17, #18, #19, #20, #21, #22, #23, #24, #25, #26, #27, #28, #29, #30, #31, #32, #33, #34, #35, #36, #37, #38, #39, #40

Эта песня, блин, по всюду. Итак новая версия "And So You Code"


Так случилось, что сейчас мне приходится ревьювить код нескольких junior делающих усилия в пользу Java. Рекомендации всегда один и те же. Так вот, первые ревьюшечки (буду их так называть), с которых я начинаю и на которых заканчиваю первую итерацию любое ревью кода (дальше идет цитата из последнего письма, какбэ повторное использование). Читать дальше...



1. Все константы 1, 2, 3, 150, 160, 0, -1, -10, "qwe", "превед", и тому подобные встречающиеся в коде ты выносишь в виде именованных констант, имя которых скажет об предназначении числа, строки или другой величины. Если константа уже объявлена, то имеет смысл ее повторно использовать. Так же стоит размещать константы в тех классах, которые наиболее подходят для каждой константы в отдельности.

Не бойся большого имени для константы КОЛИЧЕСТВО_ТАРАКАНОВ_СБЕЖАВШИХ_ИЗ_ПОД_ТАПКА нормальное название для константы - а программисту меньше думать, а что же это за число такое 15? Константы объявляются как final static элементы класса, чтобы доступ к ним был как можно проще и изменения значения было не возможным по ходу выполнения программы.

По некоторым рекомендациям 0, 1 могут не иметь своей именованной константы, но и тут есть НО: две разные единички в одном классе могут иметь разный смысл, а потому стоит их все равно выносить в отдельную константу.

2. Есть такое понятие как formatter в IDE, которую ты используешь. Это делается автоматически. Пройдись по всем классам и отформатируй текст под один стиль. Пофиг, какой он будет - главное чтобы везде одинаковый.

3. Имена для локальный переменных и полей класса. Вот тебе вопрос на засыпку что такое: g2, m_tree, vColClass, tableData1, KFDB, k, tf, nf, _d, fld и так далее. Если у тебя есть ответы, попробуй спроси про назначение этих констант своего коллегу.

Переименуй все переменные так, чтобы простое выдирание их имен из контекста говорило о приблизительном предназначении константы. К примеру: modelForProcessing, currentStream, getRandomQuery. Никаких i, j, k, l для циклов и b1, b2 для булевских значений. Даже, если ты ипользуешь их один раз в следующей строчке имя давай максимально информативное. Но не перегибай - если переменная называется переменнаяДляХраненияВеличиныПолученнойИзБазыСоВключеннымРедимомДоставкиПиццы - это уже перегиб. Чаще всего достаточно 1-4 слов по вотТакомуШаблону. Не используй цифр и знаков нижнего подчеркивания в названия методов и переменных - забудь этот синтаксисом коль ты с java.

В твоей IDE должна быть автоматическая замена по гарячей клавише сразу во всех местах - пользуйся ей. Оно должно быть где-то в разделе Refactoring. Кстати для вынроса констант тоже есть автоматическая тулза, вызываемая по горячей клавише.

В общем делай переменные информативными, в этом сила языка высокого уровня - в отличие от ассемблера, где переменная хранилась по какому-то, только Богу понятному, 4DEF адресу.

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

Помни, ты пишешь код не для машины, а для человека. Чаще всего этим человеком будешь ты, когда случайно заглянешь в этот код спустя пол года.

Ну вот пока и все. Исправишь код, подумаем дальше что с ним сделать. А если захочется написать новый код - привыкай к правилу: написал новую функциональность, протестировал (лучше автоматизированно) отрефакторил его по вышеприведенным пунктам №1, №2, №3 и снова протестировал (если к этому моменты у тебя есть автоматические тесты, то проверка займет доли секунды, и не надо будет снова руками все тестировать).
Для примера привожу кусок кода из моей студенческой жизни, чтобы было понятно зачем нужны хорошие имена для констант и локальных переменных.

function TForm1.Otkr: boolean;
var x, y:integer;
    tx, ty:integer;
    aFl, aZap, aNon, aOtk:integer;
begin
    Result:=false;
    for x:=0 to LenX do
        for y:=0 to LenY do begin
            if (WhoArr[x, y] = whOtkr) then begin
                aFl:=0; aZap:=8; aNon:=0; aOtk:=0;
                for tx:=-1 to 1 do
                    for ty:=-1 to 1 do begin
                        if ((tx = 0) and (ty = 0)) then Continue;
                        case (WhoArr[x + tx, y + ty]) of
                            whZaPolem:  dec(aZap);
                            whFlag:     inc(aFl);
                            whNone:     inc(aNon);
                            whOtkr:     inc(aOtk);
                        end;
                    end;
                if (NumArr[x, y] = 0) then Continue;
                if (NumArr[x, y] = aFl) then begin
                    for tx:=-1 to 1 do
                        for ty:=-1 to 1 do begin
                            if ((tx = 0) and (ty = 0)) then Continue;
                            if (WhoArr[x + tx, y + ty] = whNone) then begin
                                SetForegroundWindow(MineHandle);
                                MouseClick(MineLeft + (x + tx)*16 + 8, MineTop + (y + ty)*16 + 8, mbLeft);
                                Result:=true;
                            end;
                        end;
                end;
                if (Result) then Exit;
                if (NumArr[x, y] = (aNon + aFl)) then begin
                    for tx:=-1 to 1 do
                        for ty:=-1 to 1 do begin
                            if ((tx = 0) and (ty = 0)) then Continue;
                            if (WhoArr[x + tx, y + ty] = whNone) then begin
                                SetForegroundWindow(MineHandle);
                                MouseClick(MineLeft + (x + tx)*16 + 8, MineTop + (y + ty)*16 + 8, mbRight);
                                Result:=true;
                            end;
                        end;

                end;
                if (Result) then Exit;                
            end;
        end;
    if (not cbNaSharu.Checked) then Exit;
    Result:=true;
    repeat
        x:=Random(LenX + 1);
        y:=Random(LenY + 1);
    until (WhoArr[x, y] = whNone);
    MouseClick(MineLeft + x*16 + 8, MineTop + y*16 + 8, mbLeft);
end;
Фиг разберешься, правда? Но я то знаю, что это движок моего Саперорешателя - мне проще. Да и комментарии я писал раньше на каждую строчку (тут я их сознательно удалил), чтобы потом легче было...

...загадку интересную загадали мне недавно. Есть 8 монет, есть весы с двумя чашечками. Одна из монет легче остальных. Как за два взвешивания определить легкую монету? Среди какого максимального количества монет можно отыскать одну отличающуюся по весу монетку используя подобный метод за два взвешивания?

Я как всегда для решения этой задачи воспользовался подсознанием - представил себе монетки, представил себе одну легкую, представил весы и процесс взвешивания а потом себя решившего эту задачу, а потом задал вопрос "как?" и перестал думать на эту тему вообще. Решение пришло спустя два часа, когда я готовился ко сну. Логика потребовалась только для того, чтобы перепроверить правильность решения.

Попробуй, у тебя должно получиться так же легко...

...выкачиваю один большой файл с рапиды. Файл разбит на 24 части. После 13 частей стало нудно и решил глянуть, а может есть автоматический загрузчик с рапиды. Оказывается есть.
Пробую качнуть с рапиды автоматический загрузчик с рапиды и опробовать его. Ну и не удивительно - на рапиде этого файла уже нет. Он оказался на депозите. Качем. Ставим. Дот нет фреймворк надо... Ну че за... Ладно потом продолжу. Мораль в другом - все, что ни возникнет в голове, чаще всего уже давно придумали, даже, если идея кажется бредовой. А если ее нет в сети - самое время ее реализовать!..

...Искал одно, но нашел другое. Опробовал - работает!



А вы говорите слепой 10-пальцевый учи. Скоро мыслью буду управлять...

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

Качем учим.

...а вот это будущее

Зачет!
Читаем тут больше...

...вот как Ютюб надо использовать


Вот еще


Класс!..

...Установил и настроил себе DropBox. Идея проста как двери. Тебе выделяется место на винчестере где-то там на серваке (2 гига бесплатно, больше - плати). Ты ставишь себе клиента и у тебя появляется новая папка, которая все действия с ней синхронизирует с серваком. Плюс, папки можно шарить между аккакунтами.


Если кого-то заинтересовало, прошу использовать вот этот линк для начала регистрации. За каждого приверженца мне дадут по 250 Мб дополнительного бесплатного места.

Внимание! Никогда не доверяй тому компьютеру, который не можешь просто выкинуть в окно! Помни про бэкапы...

..сложно работать пожарником


...

...Летчики испытатели


...

...Контра! Сколько времени было убито


























Требуется установка java....

...хочу на работу... АААААА!!!!...

7 комментариев:

  1. письмо для джуниора понравилось, возьму на вооружение.

    Жаль что решение задачи про монетки я знал. Так бы тоже подумал:) И, по-моему, в оригинале их было 9

    ОтветитьУдалить
  2. Кстати, про монеты есть аналогичная задача, но там в качестве подозреваемого фигурирует целый мешок фальшивых монет. Нужно определить за одно взвешивание, причем, мешков с настоящими монетами может быть сколько угодно.

    ОтветитьУдалить
  3. Спасибо за комментарий.
    Да, интересные эти задачки с взвешиваниями.
    А что с дропбоксом?

    ОтветитьУдалить
  4. dropbox - бесполезная вещь. Если б он умел синхронизировать отмеченные папки, а не только свою - цены б ему не было. А так, извини, но я не готов прогибаться под какую-то программу и ее структуру каталогов.

    ОтветитьУдалить
  5. как минимум с одним своим другом я поддерживаю связь через дропбокс. В остальном использую скайп для передачи инфы. Реже рапиду. Есть еще варианты?

    ОтветитьУдалить
  6. Мне хватает варианта с IM, если нужно передать огромное количество информации (порядка нескольких гигабайт) uTorrent + DHT. Рецепт прост: создаешь не приватный torrent без сервера, кидаешь его респонденту и вуаля - через некоторое время файл у него. Плюс этого способа - можно кинуть torrent нескольким людям и закачка пойдет быстрее.

    Как-то пытался синхронизировать папку на рабочем и домашнем компьютерах, задержка через dropbox была порядка недели, при этом он говорил, что все в порядке - все файлы синхронизированы.

    ОтветитьУдалить