1

Тема: Як не варто писати код. Поганий VS Хороший код.

Вирішив написати куски коду які реально не фонтан.

1. У вюшках (html)

// як не треба робити вивід
<? if ($task['price_change'] < 0) { ?>-<? } else { ?>+<? } ?>

// як треба
<?= $task['price_change'] < 0 ? '-' : '+'; ?>

p.s. По мірі знаходження цікавих поганих кусків коду буду кидати сюди ;) У тему пише як не треба і як треба ;)

Re: Як не варто писати код. Поганий VS Хороший код.

?PHP  
    for(
            $i
    =
            0        ;    $i
    <5    ;                    $i++)
                {    
            if
                    ($i
                            %
    2)echo
 $i;
            echo 'О<hr>'
    ;}                         ?>
Подякували: funivan, miroslav.chandler2

3

Re: Як не варто писати код. Поганий VS Хороший код.

<?php

   //You can even add more Dollar Signs

   $Bar = "a";
   $Foo = "Bar";
   $World = "Foo";
   $Hello = "World";
   $a = "Hello";

   $a; //Returns Hello
   $$a; //Returns World
   $$$a; //Returns Foo
   $$$$a; //Returns Bar
   $$$$$a; //Returns a

   $$$$$$a; //Returns Hello
   $$$$$$$a; //Returns World

   //... and so on ...//

?>

Є такий проект http://govnokod.ru/, там дуже багато прикладів такого коду.)

Щоб зрозуміти рекурсію потрібно спочатку зрозуміти рекурсію.
int fac(int n) { return n < 2 ? 1 : n*fac(n-1); }
Подякували: d4rkc10ud, funivan2

4

Re: Як не варто писати код. Поганий VS Хороший код.

Що цікаво: пхп на говнокоді абсолютний лідер з трикратним відривом від найближчого переслідувача. При цьому в рейтингу популярності мов програмування займає лише шосте місце з 6% проти 20% у C.

5

Re: Як не варто писати код. Поганий VS Хороший код.

треба підкреслити що на російському говнокоді, на міжнародному пхп був би поруч з візуал бейсиком та джаваскриптом.

Світ врятують краса та масові розстріли
Лепей жывы сабака, чымся здохлы леў
Хто до нас із томагавком прийде, той од томагавка і томагавкнеться

6

Re: Як не варто писати код. Поганий VS Хороший код.

Коли я починав програмувати я також писав "негарний" код. Пам'ятаю навіть на одному форумі викладав свої скрипти і там зазнав шквал критики в свою сторону. Я тоді навіть не знав що можна ще якось по іншому і писати і не розумів тої критики. Але з часом, після прочитання достатньої кількості літератури починаєш бачити недоліки свого коду і виправляєш їх.

Щоб зрозуміти рекурсію потрібно спочатку зрозуміти рекурсію.
int fac(int n) { return n < 2 ? 1 : n*fac(n-1); }

Re: Як не варто писати код. Поганий VS Хороший код.

Patron написав:

Коли я починав програмувати я також писав "негарний" код. Пам'ятаю навіть на одному форумі викладав свої скрипти і там зазнав шквал критики в свою сторону. Я тоді навіть не знав що можна ще якось по іншому писати і не розумів тої критики. Але з часом, після прочитання достатньої кількості літератури починаєш бачити недоліки свого коду і виправляєш їх.

Питання не по темі, але скільки часу, Ви вже вивчаєте php?

8

Re: Як не варто писати код. Поганий VS Хороший код.

Я php вже не вивчаю бо воно мені вже трохи набридло (хоча зараз працюю php програмістом). Взагалі почав вивчати php у 2008 році. Потім захопився java, потім C++.

Щоб зрозуміти рекурсію потрібно спочатку зрозуміти рекурсію.
int fac(int n) { return n < 2 ? 1 : n*fac(n-1); }

9

Re: Як не варто писати код. Поганий VS Хороший код.

opencart (/catalog/model/checkout/order.php), функція confirm():

$this->db->query("INSERT INTO `" . DB_PREFIX . "order` SET invoice_prefix = '" . $this->db->escape($data['invoice_prefix']) . "', store_id = '" . (int)$data['store_id'] . "', store_name = '" . $this->db->escape($data['store_name']) . "', store_url = '" . $this->db->escape($data['store_url']) . "', customer_id = '" . (int)$data['customer_id'] . "', customer_group_id = '" . (int)$data['customer_group_id'] . "', firstname = '" . $this->db->escape($data['firstname']) . "', lastname = '" . $this->db->escape($data['lastname']) . "', email = '" . $this->db->escape($data['email']) . "', telephone = '" . $this->db->escape($data['telephone']) . "', fax = '" . $this->db->escape($data['fax']) . "', payment_firstname = '" . $this->db->escape($data['payment_firstname']) . "', payment_lastname = '" . $this->db->escape($data['payment_lastname']) . "', payment_company = '" . $this->db->escape($data['payment_company']) . "', payment_company_id = '" . $this->db->escape($data['payment_company_id']) . "', payment_tax_id = '" . $this->db->escape($data['payment_tax_id']) . "', payment_address_1 = '" . $this->db->escape($data['payment_address_1']) . "', payment_address_2 = '" . $this->db->escape($data['payment_address_2']) . "', payment_city = '" . $this->db->escape($data['payment_city']) . "', payment_postcode = '" . $this->db->escape($data['payment_postcode']) . "', payment_country = '" . $this->db->escape($data['payment_country']) . "', payment_country_id = '" . (int)$data['payment_country_id'] . "', payment_zone = '" . $this->db->escape($data['payment_zone']) . "', payment_zone_id = '" . (int)$data['payment_zone_id'] . "', payment_address_format = '" . $this->db->escape($data['payment_address_format']) . "', payment_method = '" . $this->db->escape($data['payment_method']) . "', payment_code = '" . $this->db->escape($data['payment_code']) . "', shipping_firstname = '" . $this->db->escape($data['shipping_firstname']) . "', shipping_lastname = '" . $this->db->escape($data['shipping_lastname']) . "', shipping_company = '" . $this->db->escape($data['shipping_company']) . "', shipping_address_1 = '" . $this->db->escape($data['shipping_address_1']) . "', shipping_address_2 = '" . $this->db->escape($data['shipping_address_2']) . "', shipping_city = '" . $this->db->escape($data['shipping_city']) . "', shipping_postcode = '" . $this->db->escape($data['shipping_postcode']) . "', shipping_country = '" . $this->db->escape($data['shipping_country']) . "', shipping_country_id = '" . (int)$data['shipping_country_id'] . "', shipping_zone = '" . $this->db->escape($data['shipping_zone']) . "', shipping_zone_id = '" . (int)$data['shipping_zone_id'] . "', shipping_address_format = '" . $this->db->escape($data['shipping_address_format']) . "', shipping_method = '" . $this->db->escape($data['shipping_method']) . "', shipping_code = '" . $this->db->escape($data['shipping_code']) . "', comment = '" . $this->db->escape($data['comment']) . "', total = '" . (float)$data['total'] . "', affiliate_id = '" . (int)$data['affiliate_id'] . "', commission = '" . (float)$data['commission'] . "', language_id = '" . (int)$data['language_id'] . "', currency_id = '" . (int)$data['currency_id'] . "', currency_code = '" . $this->db->escape($data['currency_code']) . "', currency_value = '" . (float)$data['currency_value'] . "', ip = '" . $this->db->escape($data['ip']) . "', forwarded_ip = '" .  $this->db->escape($data['forwarded_ip']) . "', user_agent = '" . $this->db->escape($data['user_agent']) . "', accept_language = '" . $this->db->escape($data['accept_language']) . "', date_added = NOW(), date_modified = NOW()");

Більш менш адекватно, хоча теж є мінуси. Просто виглядає набагато краще, коли не в один рядок.

$sql = "
            INSERT INTO `oc_order`
            SET invoice_prefix = '" . $this->db->escape($data['invoice_prefix']) . "',
                store_id = '" . (int)$data['store_id'] . "',
                store_name = '" . $this->db->escape($data['store_name']) . "',
                store_url = '" . $this->db->escape($data['store_url']) . "',
                firstname = '" . $this->db->escape($data['name']) . "',
                email = '" . $this->db->escape($data['email']) . "',
                telephone = '" . $this->db->escape($data['telephone']) . "',
                payment_method = '" . $this->db->escape($data['payment']) . "',
                shipping_address_1 = '" . $this->db->escape($data['shipping_address']) . "',
                shipping_method = '" . $this->db->escape($data['shipping']) . "',
                comment = '" . $this->db->escape($data['comment']) . "',
                total = '" . (float)$data['total'] . "',
                affiliate_id = '" . (int)$data['affiliate_id'] . "',
                language_id = '" . (int)$data['language_id'] . "',
                currency_id = '" . (int)$data['currency_id'] . "',
                currency_code = '" . $this->db->escape($data['currency_code']) . "',
                currency_value = '" . (float)$data['currency_value'] . "',
                ip = '" . $this->db->escape($data['ip']) . "',
                forwarded_ip = '" .  $this->db->escape($data['forwarded_ip']) . "',
                user_agent = '" . $this->db->escape($data['user_agent']) . "',
                accept_language = '" . $this->db->escape($data['accept_language']) . "',
                date_added = NOW(), date_modified = NOW()";
Подякували: miroslav.chandler, funivan2

10

Re: Як не варто писати код. Поганий VS Хороший код.

вот тому я і люблю орм)

pew pew :D
Блоґ

11

Re: Як не варто писати код. Поганий VS Хороший код.

можна було зробити функцію, яка б на вході приймала массив і розпихала по бд, шото типу

$this->db->add('tbl_goods',$_POST['order']);

db class
public function actionAdd($table,$data)
{
    $escapedArr = array();
    foreach($data as $name => $val)
    {
        if(!$this->validate($name,$val))
            $this->addError($name,$val);

        $escapedArr[$this->escapeRowName($name)] = $this->escapeData($val);
    }

    $sql = 'INSERT '.$table.' INTO ('.implode(', ', array_keys($escapedArr)).') VALUES ('.implode(', ', array_values($escapedArr)).')';
    $this->sql($sql);
}
pew pew :D
Блоґ
Подякували: Replace, funivan2

12

Re: Як не варто писати код. Поганий VS Хороший код.

Опенкарт жжот. Я для магазинів юзаю prestashop. Буде час скину код. Ну реально в деяких місцях така жопа що капєц ))

if(!$this->validate($name,$val))
            $this->addError($name,$val);

Особисто я завжди використовую { i }

if(!$this->validate($name,$val)){
            $this->addError($name,$val);
}

Хоча якщо дивитись то ваш код Мирославе у 100 разів кращий ніж опенкарта)) Тут хоч ясно що куди ;)

2 Patron
Я php вже не вивчаю бо воно мені вже трохи набридло (хоча зараз працюю php програмістом)

В смислі не вивчаєте. Кодите на рнр і не вивчаєте її???

13

Re: Як не варто писати код. Поганий VS Хороший код.

Дякую)
Це на випадок, як хлопці з опен карту будуть читати наш форум)

if(!$this->validate($name,$val)){
            $this->addError($name,$val);
}

Це ж джави здається пішло, не подобається такий варіант, ієрархію важко відслідкувати)
краще вже

if(!$this->validate($name,$val))
{
            $this->addError($name,$val);
}

але після пітону, ніде дужок ставити не хочеться)

pew pew :D
Блоґ

14

Re: Як не варто писати код. Поганий VS Хороший код.

Це на випадок, як хлопці з опен карту будуть читати наш форум)

:lol: Ага якщо глянуть то да буде їм де повчитись ;)

Ну так з дужками чи без це на колір і смак ...

Загалом класна тема) Викладаєм ще код який не фонтан :)

15

Re: Як не варто писати код. Поганий VS Хороший код.

В смислі не вивчаєте. Кодите на рнр і не вивчаєте її???

Ось так коджу і не вивчаю. Те що мені по роботі потрібно (найбільш використовувані функції) я вже вивчив, а якщо попадеться якась функція якої незнаю то використовую гугл.

Щоб зрозуміти рекурсію потрібно спочатку зрозуміти рекурсію.
int fac(int n) { return n < 2 ? 1 : n*fac(n-1); }

16

Re: Як не варто писати код. Поганий VS Хороший код.

Шановні форумчани. Пропоную вам брати код з цієї теми - http://replace.org.ua/post/2435/#p2435 та показувати, як би ви написали якісніше код. Читаючи відгуки, думаю, над табуляцією та форматуванням любителям буде де розгорнутись.

Чому б граблі не вчили, а серце вірить в чудеса :)
Для зв'язку використовуйте персональну сторінку форуму, або блог http://skorbyk.com/

17

Re: Як не варто писати код. Поганий VS Хороший код.

<?php
 
$zapisi='zapisi.txt';
 
$p=fopen($zapisi,'r');
 
$n=fread($p,filesize($zapisi));
 
fclose($p);
 
echo $n;
 
&nbsp;
 
$myfile='myfile.txt';
 
$m=fopen($myfile,'w+');
 
fwrite($m,'мій допис до файлу');
 
fclose($m);
 
?>

1. $zapisi='zapisi.txt'; - краще не називати змінну $zapisi. Ім'я файлу аналогічно.
Перед і після = повинні бути пробіли. Ось так нормально:

$records = 'records.txt';

2. $p=fopen($zapisi,'r'); - що за змінна така $p? Від pointer? Можливо краще $fp чи взагалі $handle як в офіційній документації.

$fp = fopen($records, 'r');

3. &nbsp; - м?

4. $myfile='myfile.txt'; - що за назва файлу така? Тут одразу можна повернутись до 1-го пункту і змінити $records на $records_path, а тут зовсім по іншому назвати, так щоб це було більш читабельно.

5. Змінна $m - аналогічно.

6. Де коментарі? Тим паче це навчальний код.

Працюйте.. =)

P.S. Це останнє повідомлення не по темі.

Подякували: Patron1

18

Re: Як не варто писати код. Поганий VS Хороший код.

Знайшов на одному блозі....

class User
 {
  public function new_user($Name,$Password,$Sex,$Age,$Email,$Biography,$Experience,$Situation,$Terms,$Capcha)
  {
   $Name = strip_tags($Name);
   $Biography = strip_tags($Biography);
   $Experience = strip_tags($Experience);
   $Situation = strip_tags($Situation);
   $Terms = strip_tags($Terms);
   if(empty($Name))
    return 'Заповніть поле нік нейм.';
   if(empty($Password)) 
    return 'Поле пароль повинне бути заповненим.';
   $Password = sha1($Password);
   switch($Sex)
   {
    case 'man': 
    $Sex = "man";
    break;
    case 'women':
    $Sex = 'women';
    break;
    default :
    return 'Ти хто такий, давай до побачення!';
   }
   $Age = intval($Age);
    if($Age < 5)
     return 'Ти хто такий, давай до побачення!';
    if(!eregi("^[a-zA-Z0-9_\.-]+@[a-zA-Z0-9\-]+\.[a-zA-Z0-9\.-]+$",$Email))
     return 'Некоректний e-mail';
    /*if(md5($Capcha) != $_SESSION['SCPC'])
     return 'Невірно введені символи з картинки';*/
    if(empty($Biography) or empty($Experience) or empty($Situation) or empty($Terms))
     return 'Не всі поля заповнені';
     
   include($_SERVER['DOCUMENT_ROOT'].'/include/db.php');
    if(!$db)
     return 'Помилка з`єднання з mysql сервером';
   @ $result = $db->query("SELECT id FROM user WHERE nickname = '".mysql_escape_string($Name)."'"); 
    if($result->num_rows == 1)
     return 'Дане імя уже використовується.';
    echo 'Все ок'; 
    $result->free();
   @ $result_u = $db->query("INSERT INTO user(nickname,password,sex,age,email,moderation,admin,cash,posx,posy,posz,new)
    VALUES('".mysql_escape_string($Name)."','$Password','$Sex','$Age','$Email','1','0','0','0.00000','0.00000','0.00000','1')");
    $result = $db->query("INSERT INTO temp_data(email,biography,experience,situation,terms) VALUES('$Email','".mysql_escape_string($Biography)."',
   '".mysql_escape_string($Experience)."','".mysql_escape_string($Situation)."','".mysql_escape_string($Terms)."')");
    if(!$result_u) 
     return 'Помилка реєстрації. Повторіть спробу пізніше.';
    else
     return 'Ви успішно зареєструвалися';
  }
  public function auth_user($Nick,$Password)
  {
   if(empty($Nick) or empty($Password))
    return 'Не всі дані заповнені.';
   include($_SERVER['DOCUMENT_ROOT'].'/include/db.php');
    if(!$db)
     return 'Помилка з`єднання з mysql сервером';
     $Nick = strip_tags($Nick);
     $Password = sha1($Password);
   @ $result = $db->query("SELECT cash FROM user WHERE nickname = '".mysql_escape_string($Nick)."' AND password = '$Password'"); 
    if($result->num_rows == 0)
     return 'Неправильний логін або пароль.';
    return $result->fetch_assoc();
  }
}
Подякували: funivan1

19

Re: Як не варто писати код. Поганий VS Хороший код.

return 'Ти хто такий, давай до побачення!';

:D

pew pew :D
Блоґ

20

Re: Як не варто писати код. Поганий VS Хороший код.

miroslav.chandler написав:

return 'Ти хто такий, давай до побачення!';

:D

Проявили "Креатіфф"