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

Программирование, алгоритмы

Postby VBI » Thu, 05.12.2013 00:53:07

когда-то я выработал приемлемую для себя систему по форматированию кода.
итак:
после 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] убил всю стройность, блин
User avatar
VBI
 
Posts: 1965
Joined: Mon, 03.06.2013 09:20:29

Postby nyuk » Thu, 05.12.2013 01:33:02

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

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

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

В остальном согласен. Или какого рода мнение требовалось?
не отрастил
User avatar
nyuk
 
Posts: 556
Joined: Thu, 26.07.2012 09:08:24

Postby VBI » Thu, 05.12.2013 01:49:32

это обсуждение.
метки типа 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);
 }
}

понятней строками. чо табы экономить, они для тебя
User avatar
VBI
 
Posts: 1965
Joined: Mon, 03.06.2013 09:20:29

Postby Keeper » Thu, 05.12.2013 02:36:02

VBI wrote:такая хня (работающий сайт, 1500 народу в сутки)

Тебя уже ждет твоя первая sql-инъекция :1tooth:
З.Ы.: говнокод детектыд
TS-Labs wrote:Кеерег: я детекчу, что ты тролль, и зарегался тут только, чтоб меня заебать :smoke:
Keeper
 
Posts: 121
Joined: Thu, 26.07.2012 08:31:16

Postby g0blinish » Thu, 05.12.2013 05:54:49

Эко пиво с демами пробило тебя :vodka:

код в сырцах пишу в EmEditor'e форматирование само по себе - отступ по пробелу или по табуляции.
ну иногда встречаются пустые строки - выделяются процедуры или участки кода.
[x] No Screenshot
User avatar
g0blinish
Упырь говнофорума
 
Posts: 3641
Joined: Tue, 18.06.2013 10:59:01

Postby nyuk » Thu, 05.12.2013 07:23:26

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:

Ну почему же? Может у него где-то ранее все переменные эскейпятся/интвалятся.
Будем в это верить :-)
не отрастил
User avatar
nyuk
 
Posts: 556
Joined: Thu, 26.07.2012 09:08:24

Postby g0blinish » Thu, 05.12.2013 07:50:08

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

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

---

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

это всё старая беда - код пишется, ненужные инструкции убираются, мусор впадлу чистить.
[x] No Screenshot
User avatar
g0blinish
Упырь говнофорума
 
Posts: 3641
Joined: Tue, 18.06.2013 10:59:01

Postby NovaSTorm » Thu, 05.12.2013 07:57:07

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
например.
NovaSTorm
 
Posts: 75
Joined: Sat, 22.06.2013 19:33:40

Postby g0blinish » Thu, 05.12.2013 08:14:15

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
[x] No Screenshot
User avatar
g0blinish
Упырь говнофорума
 
Posts: 3641
Joined: Tue, 18.06.2013 10:59:01

Postby NovaSTorm » Thu, 05.12.2013 09:19:50

g0blinish wrote:Даже за это?

За ld a,i,c,b,d,e,h,l.
NovaSTorm
 
Posts: 75
Joined: Sat, 22.06.2013 19:33:40

Postby nyuk » Thu, 05.12.2013 09:39:58

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

а если так, всё равно смерть?
Code: Select all
ld a,i, c,b, d,e, h,l
не отрастил
User avatar
nyuk
 
Posts: 556
Joined: Thu, 26.07.2012 09:08:24

Postby moroz1999 » Thu, 05.12.2013 09:50:42

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

С настроками под свой вкус, конечно же.
User avatar
moroz1999
 
Posts: 1872
Joined: Wed, 01.08.2012 11:23:51

Postby g0blinish » Thu, 05.12.2013 10:00:21

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

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

---

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

если сочинишь RegExp, то это EmEditor.
[x] No Screenshot
User avatar
g0blinish
Упырь говнофорума
 
Posts: 3641
Joined: Tue, 18.06.2013 10:59:01

Postby VBI » Thu, 05.12.2013 10:43:06

Keeper, инйекции - это бывает полезно ;) у меня не говнокод, у меня ещё хуже, всё в смеси. да, никакой фильтрации, да, просто не ломают, да <_<
if (isset($s))$s=intval(htmlentities($s)); - так нормально?
NovaSTorm, да, хвастонул)) попозже сделаю тему о разработке. пока выкладывать это не охота, рано ещё, слабовато
nyuk, уже немного луше. наверное, дело привыки
g0blinish, всяко бывает, оно ж рнр.
Last edited by VBI on Thu, 05.12.2013 10:53:04, edited 1 time in total.
User avatar
VBI
 
Posts: 1965
Joined: Mon, 03.06.2013 09:20:29

Postby moroz1999 » Thu, 05.12.2013 10:52:27

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

Хочется автоматизации, как в PHPStorm - настроил в свойствах проекта поведение отступов, тип табов, переносов строк в длинных массивах, нажал сочетание клавиш - и вуаля, весь проект отформатирован.
Регулярку можно сочинить всякую, но это попахивает велосипедоводством, так как всяко есть уже что-то готовое.
User avatar
moroz1999
 
Posts: 1872
Joined: Wed, 01.08.2012 11:23:51

Postby g0blinish » Thu, 05.12.2013 11:19:49

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!
[x] No Screenshot
User avatar
g0blinish
Упырь говнофорума
 
Posts: 3641
Joined: Tue, 18.06.2013 10:59:01

Postby moroz1999 » Thu, 05.12.2013 11:43:12

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, с которым кроме переполнения вообще ничего случиться не может.
User avatar
moroz1999
 
Posts: 1872
Joined: Wed, 01.08.2012 11:23:51

Postby g0blinish » Thu, 05.12.2013 11:47:30

moroz1999 wrote:надо экономить своё время, чтобы тратить его на наиболее интересные вещи.

Ну верно. если обнаружишь в себе затруднения читать строчки инструкций, пора заняться чем-то.
[x] No Screenshot
User avatar
g0blinish
Упырь говнофорума
 
Posts: 3641
Joined: Tue, 18.06.2013 10:59:01

Postby VBI » Thu, 05.12.2013 13:47:45

moroz1999, сенкс.
век учись - дураком помрёшь %)
User avatar
VBI
 
Posts: 1965
Joined: Mon, 03.06.2013 09:20:29

Postby Keeper » Thu, 05.12.2013 15:26:52

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 до сих пор не умеют проверять ойпи и прочие ништяки которые могут быть в урле, и это ёбаный стыд я щитаю...
TS-Labs wrote:Кеерег: я детекчу, что ты тролль, и зарегался тут только, чтоб меня заебать :smoke:
Keeper
 
Posts: 121
Joined: Thu, 26.07.2012 08:31:16

Postby moroz1999 » Thu, 05.12.2013 16:06:17

Если уж пошли письками мериться, то класс core сам по себе - хорошее начало очень плохой затеи.
Чтобы в полной мере хлебнуть ооп-геморроя заниматься архитектурной астронавтикой, стоит не забывать про single responsibility.
User avatar
moroz1999
 
Posts: 1872
Joined: Wed, 01.08.2012 11:23:51

Postby Keeper » Thu, 05.12.2013 16:24:14

moroz1999 wrote:хорошее начало очень плохой затеи.

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

---

Кстати, в контексте пхп клал я на каноны ООП :)
TS-Labs wrote:Кеерег: я детекчу, что ты тролль, и зарегался тут только, чтоб меня заебать :smoke:
Keeper
 
Posts: 121
Joined: Thu, 26.07.2012 08:31:16

Postby g0blinish » Thu, 05.12.2013 16:49:59

начали за форматирование, закончили за упокой B)
[x] No Screenshot
User avatar
g0blinish
Упырь говнофорума
 
Posts: 3641
Joined: Tue, 18.06.2013 10:59:01

Postby moroz1999 » Thu, 05.12.2013 17:18:19

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

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

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

---

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

Согласен, наоффтопили бесстыдно.
User avatar
moroz1999
 
Posts: 1872
Joined: Wed, 01.08.2012 11:23:51

Postby Keeper » Thu, 05.12.2013 17:32:44

moroz1999 wrote:Я синглтоны-то злом считаю

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

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

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

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

А тут разве не флейм? :1tooth:
TS-Labs wrote:Кеерег: я детекчу, что ты тролль, и зарегался тут только, чтоб меня заебать :smoke:
Keeper
 
Posts: 121
Joined: Thu, 26.07.2012 08:31:16

Next

Return to Coding

Who is online

Users browsing this forum: No registered users and 1 guest

cron

x