Page 1 of 2

Форматирование кода

PostPosted: Thu, 05.12.2013 00:53:07
by VBI
когда-то я выработал приемлемую для себя систему по форматированию кода.
итак:
после ret добавлаем дополнительный перевод строки. визуально разбивает код на части
дополню - выравнивание кода - одним, двумя (сейчас) табами. видим вертикальную логику.
подпрограммы называем понятными себе именами. внутри подпрограмм различные незначащие переходы обозначаю сокращениями от подпрограммы с номерами, с понтом бейсик)
в больших прогах подпрограммы местами стоит каментить, в частности описывать обработку данных, где что.
все константы (equ) выносим в начало, до org/ сразу после него.
все данные - в конец. дополняем org где и т.д.
служебные подпрограммы астого использования (расчёт следующей строки внизу/вверху и т.п. хню) - в самый конец кодового блока.
всё, что часто повторяется - в подпрограммы с понятными именами, расположение в служебных.
если редко - под первым вызовом, после ret.

в демах - сначала декранч, заполнение памяти кодом/данными, потом основной цикл.
размещение кода принципиально с #8000, с 6000 данные для выборки, с С000 - всё что угодно, господа))
никакого совмещения ld a,b; c,a; d,a и т.п., тяжко читаеться (Гоблин привет! :badtease: )
макросы не юзаю принципиально.

подход сейчас - это z80, бейсика/48/128 и т.д. нету, есть пространство памяти, всё своё. основы, так скажем - проц, память, порты.

ваше мнение?

я очень активен сегодня. почему-то)) здесь приятное, такое "молодёжное" стартаперское место, творим/обсуждаем. тот форум постарел

современное:
Code: Select all
      device zxspectrum128
           org #7000

INT_VECTOR      EQU #B700 ;размер #1C0
num_enemy_sprites   equ 7
lives_adr   equ #50de
money_adr   equ #50fe
back_sprites    equ #6000
mouse_screen   equ #6e00

; TOWERS list
; 0 type
; 1 position
; 2 fire rating
; 3 fire rating counter
; 4 num_spr
; 5 -... ranged map cells
; #ff - end of tower
; #fe - end of all towers


start:

      ld sp,#5fff
      call init_game
game_loop   
      ld a,1
      ld (screen_ready),a
      ld a,2
;      out (#fe),a
      call restore_view

end_wave   ld a,0
      or a
      call nz,enemy_create

      ld a,3      
;      out (#fe),a
      call enemy_pos
      ld a,4
;      out (#fe),a
      call spr_store

      ld a,5
;      out (#fe),a
      call spr_view

      ld a,6
;      out (#fe),a
      call towers_fire
      ld a,7
;      out (#fe),a
      call tower_fires_view
      xor a
      ld (screen_ready),a
      out (#fe),a

      halt      
           jp game_loop


это сейчас в разработке, позже покажу. :D
тег [code] убил всю стройность, блин

Re: Форматирование кода

PostPosted: Thu, 05.12.2013 01:33:02
by nyuk
VBI wrote:никакого совмещения ld a,b; c,a; d,a и т.п., тяжко читаеться (Гоблин привет! :badtease: )

Юзаю. Научился у гоблина. А еще через двоеточие часто пишу. А еще, а еще часто использую цифровые метки типа 1f/1b. Знаю, не все их любят.

От двойных табов избавляйся, можно же в редакторе настроить размер табуляции.

В остальном согласен. Или какого рода мнение требовалось?

Re: Форматирование кода

PostPosted: Thu, 05.12.2013 01:49:32
by VBI
это обсуждение.
метки типа 1f/1b чем-то похожи ма мои 212 и т.д.?
а совмещение утяжеляет понимание (мне так кажется), хоть вродь и уплотняет визуально код
ньюк, такая хня (работающий сайт, 1500 народу в сутки):

Code: Select all
$sql='select count(cid) from news where subj="'.$s.'"';
$result = mysql_query($sql);
$ap=mysql_fetch_array($result);
$all_page=$ap[0];

 // select news.name as nn,author,cut,news_data,num_comments,news.cid as nc, info,rating,tags,rateplus,rateminus,razdel.name as rn,razdel.cid as rzc from news,razdel where news.subj=0 and razdel_cid=razdel.cid order by news.cid desc limit 5


$sql0='FROM news,razdel WHERE news.subj="'.$s.'" and razdel_cid=razdel.cid';
if (isset($index_theme_rating)&&$index_theme_rating==0) $sql0.=' and rateminus<='.$rating_treshold;
if (!isset($index_theme_rating))                   $sql0.=' and rateminus<='.$rating_treshold;

$sql=' SELECT news.name as nn,author,cut,news_data,num_comments,news.cid as nc, info,rating,tags,rateplus,rateminus,razdel.name as rn,razdel.cid as rzc '.$sql0;

$sql.=' order by news_data desc limit '.(($np-1)*$news_on_page).','.$news_on_page;
$result = mysql_query($sql);
echo mysql_error();
 if (mysql_num_rows($result)!=0)
 {
echo '<p class=txt>';
   view($result);
 }
}

понятней строками. чо табы экономить, они для тебя

Re: Форматирование кода

PostPosted: Thu, 05.12.2013 02:36:02
by Keeper
VBI wrote:такая хня (работающий сайт, 1500 народу в сутки)

Тебя уже ждет твоя первая sql-инъекция :1tooth:
З.Ы.: говнокод детектыд

Re: Форматирование кода

PostPosted: Thu, 05.12.2013 05:54:49
by g0blinish
Эко пиво с демами пробило тебя :vodka:

код в сырцах пишу в EmEditor'e форматирование само по себе - отступ по пробелу или по табуляции.
ну иногда встречаются пустые строки - выделяются процедуры или участки кода.

Re: Форматирование кода

PostPosted: Thu, 05.12.2013 07:23:26
by nyuk
VBI wrote:метки типа 1f/1b чем-то похожи ма мои 212 и т.д.?

Нашел в доке по sjASMPlus. Называется "Temporary labels"
To keep the number of used labels reasonable it is possible to use numbers as labels. These labels can only be used as labels to jump to. To jump to these labels, use the number followed by an 'F' for forward branches or a 'B' for backward branches. Temporary labels should not be used within macro's.

Помогает избавляться от локальных меток.
Keeper wrote:Тебя уже ждет твоя первая sql-инъекция :1tooth:

Ну почему же? Может у него где-то ранее все переменные эскейпятся/интвалятся.
Будем в это верить :-)

Re: Форматирование кода

PostPosted: Thu, 05.12.2013 07:50:08
by g0blinish
nyuk wrote:у почему же? Может у него где-то ранее все переменные эскейпятся/интвалятся.

доо, после падения zxaaa.untergrund.net?

---

VBI wrote:никакого совмещения ld a,b; c,a; d,a и т.п., тяжко читаеться (Гоблин привет! )

это всё старая беда - код пишется, ненужные инструкции убираются, мусор впадлу чистить.

Re: Форматирование кода

PostPosted: Thu, 05.12.2013 07:57:07
by NovaSTorm
VBI wrote:TOWERS list

Tower defence? Ждёмс =)

VBI wrote:никакого совмещения ld a,b; c,a; d,a и т.п., тяжко читаеться

Тяжко, но пачку "pop de:ld a,(hl):and d:or e:ld (hl),a:inc l" я всётаки пишу в строчку. За кучу регистров через запятую - УБИВАТ!

VBI wrote:макросы не юзаю принципиально.

Макры - это хорошо. Читабельность кода повышают, да и удобство. Беда, что в sjasm они убогие, неполноценные =(
Так, видимо нельзя сгенерить кусок кода, значение по формуле посчитать например, а можно только код целиком.
DB MACRO_NAME PARAM
например.

Re: Форматирование кода

PostPosted: Thu, 05.12.2013 08:14:15
by g0blinish
NovaSTorm wrote:За кучу регистров через запятую - УБИВАТ!

Даже за это?
Code: Select all
;b=x3,c=x4,e=x1,d=x2
 push de
 exx
 pop de
 
 ld a,e:cp d;x1>x2?
 jr nc,noswap1
 ld a,e
 ld d,e
 ld d,a
noswap1:
 ;e=source X,d=destination X
 push hl
 ld a,e:sub d
 ld b,a
 ld c,a;$12
 ld e,d,d,0
 add hl,de
linelp1:ld (hl),c:inc hl:djnz linelp1
 pop hl
 exx

Image

Re: Форматирование кода

PostPosted: Thu, 05.12.2013 09:19:50
by NovaSTorm
g0blinish wrote:Даже за это?

За ld a,i,c,b,d,e,h,l.

Re: Форматирование кода

PostPosted: Thu, 05.12.2013 09:39:58
by nyuk
NovaSTorm wrote:За ld a,i,c,b,d,e,h,l.

а если так, всё равно смерть?
Code: Select all
ld a,i, c,b, d,e, h,l

Re: Форматирование кода

PostPosted: Thu, 05.12.2013 09:50:42
by moroz1999
А есть ли тула для автоформата?
Чтобы подаешь ей текст с ld a,i,c,b,d,e,h,l, а на выходе раздельные команды?

С настроками под свой вкус, конечно же.

Re: Форматирование кода

PostPosted: Thu, 05.12.2013 10:00:21
by g0blinish
NovaSTorm wrote:За ld a,i,c,b,d,e,h,l.

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

---

moroz1999 wrote:тобы подаешь ей текст с ld a,i,c,b,d,e,h,l, а на выходе раздельные команды?

если сочинишь RegExp, то это EmEditor.

Re: Форматирование кода

PostPosted: Thu, 05.12.2013 10:43:06
by VBI
Keeper, инйекции - это бывает полезно ;) у меня не говнокод, у меня ещё хуже, всё в смеси. да, никакой фильтрации, да, просто не ломают, да <_<
if (isset($s))$s=intval(htmlentities($s)); - так нормально?
NovaSTorm, да, хвастонул)) попозже сделаю тему о разработке. пока выкладывать это не охота, рано ещё, слабовато
nyuk, уже немного луше. наверное, дело привыки
g0blinish, всяко бывает, оно ж рнр.

Re: Форматирование кода

PostPosted: Thu, 05.12.2013 10:52:27
by moroz1999
g0blinish wrote:если сочинишь RegExp, то это EmEditor.

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

Re: Форматирование кода

PostPosted: Thu, 05.12.2013 11:19:49
by g0blinish
VBI wrote:if (isset($s))$s=intval(htmlentities($s)); - так нормально?


я так понял, ты с базами не работаешь, но:
$coder=mysql_real_escape_string($coder);

moroz1999 wrote:Регулярку можно сочинить всякую, но это попахивает велосипедоводством, так как всяко есть уже что-то готовое.

о, братец, ты лузер еще торт m(
я для себя велосипеды изобретал, когда полученной ID'ой дизассемблер в порядок приводил, весь поиск свелся к чтению мана. Потрачено неск. минут времени, а уж сэкономлено - тьма колов времени.

VBI wrote:g0blinish, всяко бывает, оно ж рнр.

я написал онлайнер для сайта. Первые два пста:
-jscript.alert(0);
-wow, filtering works!

Re: Форматирование кода

PostPosted: Thu, 05.12.2013 11:43:12
by moroz1999
g0blinish wrote:о, братец, ты лузер еще торт m(
я для себя велосипеды изобретал, когда полученной ID'ой дизассемблер в порядок приводил, весь поиск свелся к чтению мана. Потрачено неск. минут времени, а уж сэкономлено - тьма колов времени.

Велосипед тоже не каждый нужно изобретать, надо экономить своё время, чтобы тратить его на наиболее интересные вещи.

VBI wrote:g0blinish, всяко бывает, оно ж рнр.

Не надо гнать на PHP - никто не мешает юзать PDO, написать/юзать готовый activerecord или orm - тысячи их, и все эскейпят данные перед внесением.
Для пробы рекомендую взять класс доступа к базе от Code Igniter, он по синтаксису очень вменяемый и имеет active record реализацию.

VBI wrote:if (isset($s))$s=intval(htmlentities($s)); - так нормально?

htmlentities внутри не нужен, intval приводит значение строго к integer, с которым кроме переполнения вообще ничего случиться не может.

Re: Форматирование кода

PostPosted: Thu, 05.12.2013 11:47:30
by g0blinish
moroz1999 wrote:надо экономить своё время, чтобы тратить его на наиболее интересные вещи.

Ну верно. если обнаружишь в себе затруднения читать строчки инструкций, пора заняться чем-то.

Re: Форматирование кода

PostPosted: Thu, 05.12.2013 13:47:45
by VBI
moroz1999, сенкс.
век учись - дураком помрёшь %)

Re: Форматирование кода

PostPosted: Thu, 05.12.2013 15:26:52
by Keeper
VBI, про базы данных тебе уже рассказали, или всё escapeить или использовать какой нибудь Database Abstraction Layer. Теперь про изъятие данных из GET POST COOKIE и их валидацию. Вот кусок говнокода:
Code: Select all
define('HTTP_GET',1);
define('HTTP_POST',2);
define('HTTP_GP',3);

class core {

    function isString($value){return is_scalar($value);}

    function isInt($value,$min=null,$max=null) {
        if (!is_scalar($value))return false;
        if (!preg_match('`^(\+|-)?\d+$`x',(string)$value))return false;
        if ($min!==null&&(int)$value<$min)return false;
        if ($max!==null&&(int)$value>$max)return false;
        return true;
    }

    function isFloat($value,$min=null,$max=null) {
        if (!is_scalar($value))return false;
        if (!preg_match('`^[+-]?(\d+)$`x',(string)$value )&&!preg_match('`^[+-]?((\d*\.(\d+))|((\d+)\.\d*))$`x',(string)$value)&&!preg_match('`^[+-]?(((\d+)|((\d*\.(\d+))|((\d+)\.\d*)))[eE][+-]?(\d+))$`x',(string)$value))return false;
        if ($min!==null&&(float)$value<$min)return false;
        if ($max!==null&&(float)$value>$max)return false;
        return true;
    }

    function isEmail($value){return is_scalar($value)&&preg_match('`^[-!#\$%&\'*+\\./0-9=?A-Z^_\\`a-z{|}~]+@[^.@]+(\.[^.@]+)+$`x',$value);}

    function isUrl($value) {
        if (is_scalar($value)) return preg_match( '`^((http(s?))|(ftp))://([^:#&?/\\\\]+?(:[^:#&?/\\\\]+?)?@)?((([a-zA-Z0-9\-]+\.)+[a-zA-Z0-9\-]+)|((\d{1,3}.){3}\d{1,3})|(localhost))(:\d{1,5})?((((/[^/]+)+/?)|/))?(\?.+?)?(\#[^:#&?/\\\\]+?)?$`xi',$value)||(preg_match('`^mailto:(.+?)$`',$value,$aMatches)&&preg_match('`^[-!#\$%&\'*+\\./0-9=?A-Z^_\\`a-z{|}~]+@[^.@]+(\.[^.@]+)+$`x',$aMatches[1]));
        return false;
    }

    function isEmptyString($value){return is_scalar($value)&&preg_match('`^\s*$`',$value);}

    function setCookie($name,$value="",$expire=0,$path="/",$domain="",$isSecure=false){setcookie($name,$value,$expire,$path,$domain,$isSecure?1:0);}
    function deleteCookie($name){setcookie($name,'',time()-3600,'/','',false);}
    function getCookie($name) {if (isset($_COOKIE[$name]))return core::deslash($_COOKIE[$name]);else return false;}

    function httpGetString($name,$def_value=false,$source=HTTP_POST){
        $ret_val=core::httpGet($name,$def_value,$source);
        if (is_scalar($ret_val)) return $ret_val;elseif ($ret_val) unset($ret_val);
        return $def_value;
    }

    function httpGetInt($name,$def_value=false,$source=HTTP_POST,$min=null,$max=null){
        $ret_val = core::httpGet( $name, $def_value, $source );
        if (core::isInt($ret_val,$min,$max)) return $ret_val;elseif ($ret_val) unset($ret_val);
        return $def_value;
    }

    function httpGet( $name, $def_value = false, $source = HTTP_POST ) {
        $ret_value = false;
        if ( ( $source & HTTP_GP ) == HTTP_GP ) {
            if ( isset( $_GET[ $name ] ) ) {
                return core::deslash( $_GET[ $name ] );
            } elseif ( isset( $_POST[ $name ] ) ) {
                return core::deslash( $_POST[ $name ] );
            } else return $def_value;
        } elseif ( ( $source & HTTP_GET ) == HTTP_GET ) {
            if ( isset( $_GET[ $name ] ) ) return core::deslash( $_GET[ $name ] ); else return $def_value;
        } else {
            if ( isset( $_POST[ $name ] ) ) return core::deslash( $_POST[ $name ] ); else return $def_value;
        }
    }

    function httpGetFile( $name ) {
        if ( isset( $_FILES[ $name ] ) && isset( $_FILES[ $name ]['tmp_name'] ) && $_FILES[ $name ]['tmp_name'] ) {
            $result = core::deslash( $_FILES[ $name ] );
            if ( strpos( $result['name'], '.' ) !== false ) {
                $name_parts = explode( '.', $result['name'] );
                $result['ext'] = $name_parts[ count( $name_parts )-1 ];
                unset( $name_parts );
            } else $result['ext'] = '';
            return $result;
        } else return false;
    }

    function deslash( $value ) {
        if ( get_magic_quotes_runtime() || get_magic_quotes_gpc() ) {
            if ( is_scalar( $value ) ) return stripslashes( $value ); elseif ( is_array( $value ) ) {
                foreach ( $value as $key => $data ) $value[ $key ] = core::deslash( $data );
            } elseif ( is_object( $value ) ) {
                foreach ( $value as $key => $data ) $value->$key = core::deslash( $data );
            }
        }
        return $value;
    }

    function redirect( $url, $forceHTMLRedirect = false ) {
        if ( $forceHTMLRedirect || headers_sent() ) {
            echo "<meta http-equiv=\"refresh\" content=\"0; url='".$url."'\">\n";
            echo "<script language='javascript'>window.location.replace( '".$url."' );</script>\n";
        } else header("Location: $url");
    }

    function sendNoCachingHeaders() {
        header ("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
        header ("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
        header ("Cache-Control: no-cache, must-revalidate");
        header ("Pragma: no-cache");
    }

    function getRequestHeaders() {
       if ( is_callable( 'getallheaders' ) ) return getallheaders(); else {
          $headers = array();
            foreach ( $_SERVER as $n => $v ) if ( strtolower( substr( $n, 0, 5) ) == 'http_' ) {
               $headers[ str_replace( '_', '-', substr( $n, 5 ) ) ] = $v;
            }
            return $headers;
    }}

}

function isBeginsWith( $subject, $pattern ) {
    if ( substr( $subject, 0, strlen( $pattern ) ) == $pattern ) return true; else return false;
}

function isEndsWith( $subject, $pattern ) {
    $pattern_length = strlen( $pattern );
    if ( $pattern_length > strlen( $subject ) ) return false;
    if ( substr( $subject, -$pattern_length ) == $pattern ) return true; else return false;
}

Обертку класса можно убрать если не нужна. Имена функций вроде достаточно очевидны. юзать так:
Code: Select all
//минимальный вариант
$shit_from_user = core::httpGetInt('shitting_int');
//Pro version :)
$shit_from_user = core::httpGetInt('shitting_int', -100500, HTTP_GP, 41, 43);

На валидатор url советую обратить внимание ибо фильтры из пхп5 до сих пор не умеют проверять ойпи и прочие ништяки которые могут быть в урле, и это ёбаный стыд я щитаю...

Re: Форматирование кода

PostPosted: Thu, 05.12.2013 16:06:17
by moroz1999
Если уж пошли письками мериться, то класс core сам по себе - хорошее начало очень плохой затеи.
Чтобы в полной мере хлебнуть ооп-геморроя заниматься архитектурной астронавтикой, стоит не забывать про single responsibility.

Re: Форматирование кода

PostPosted: Thu, 05.12.2013 16:24:14
by Keeper
moroz1999 wrote:хорошее начало очень плохой затеи.

Не заметил как вызываются методы сего "божественного объекта"? :)

---

Кстати, в контексте пхп клал я на каноны ООП :)

Re: Форматирование кода

PostPosted: Thu, 05.12.2013 16:49:59
by g0blinish
начали за форматирование, закончили за упокой B)

Re: Форматирование кода

PostPosted: Thu, 05.12.2013 17:18:19
by moroz1999
Keeper wrote:Не заметил как вызываются методы сего "божественного объекта"? :)

Ищо как заметил.
Я синглтоны-то злом считаю, а у тебя в примере вообще фактически глобальные функции :)
Keeper wrote:Кстати, в контексте пхп клал я на каноны ООП :)

Это обычно до первого крупного проекта :)

---

g0blinish wrote:начали за форматирование, закончили за упокой B)

Согласен, наоффтопили бесстыдно.

Re: Форматирование кода

PostPosted: Thu, 05.12.2013 17:32:44
by Keeper
moroz1999 wrote:Я синглтоны-то злом считаю

синглтоны крайне необходимы и полезны, например для объектов которые предоставляют интерфейс с БД
moroz1999 wrote:а у тебя в примере вообще фактически глобальные функции

в общем-то да, но скорее namespace
moroz1999 wrote:Это обычно до первого крупного проекта

ну это да
govnokod.jpg
govnokod.jpg (424.58 KiB) Viewed 30599 times

moroz1999 wrote:Согласен, наоффтопили бесстыдно.

А тут разве не флейм? :1tooth: