powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Быдлокод-1 (26 строк) и стандарты программирования
20 сообщений из 20, страница 1 из 1
Быдлокод-1 (26 строк) и стандарты программирования
    #39978508
grasi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте!

Предлагаю задачу начинающим программистам (класса FizzBuzz).

Для изучения какого-нибудь языка, я просматриваю (поверхностно конечно) полную документацию по нему.
Взяв список функций PHP (файл functions.txt во вложении), формирую аналогичный файл (functions-2.txt), в котором все функции пронумерованы по алфавиту, методы классов не нумеруются.

Делаю это с помощью следующего кода (Python).

Код: python
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.
num_row=0
f_out = open('functions-2.txt', 'w')
prev_class='?'

with open('functions.txt') as f_in:
  for s in f_in:
    num_row += 1

    if num_row >=6 and num_row <= 11144:
      if len(s) == 2:
         s = '\n' + s[:1] + ':' + s[1:]
         num_func = 0
      else:
         pos = s.find('::')
         if pos >= 0:
           class_name = s[:pos]
           if prev_class <> class_name:
              prev_class = class_name
              num_func += 1
              s = str(num_func).rjust(3) + ' ' + s
           else:
             s = ' '.rjust(4) + s
         else:
            prev_class = '?'
            num_func += 1
            s = str(num_func).rjust(3) + ' ' + s

    f_out.write(s)

f_out.close()



Данный код не отвечает никаким стандартам программирования (SOLID, Strategy Pattern, ETL-Extract,Transform, Load).
Вся обработка вынесена в тело цикла.
Я не знаю, как код переписать грамотно в функциональном или ООП-стиле, чтобы его можно было расширять и сопровождать дальше (тяжелое наследие опыта с PL/1, Fortran, FoxBase, FoxPro).
Я думаю, навскидку, этот код надо разбить ,как минимум, на 3 короткие функции (или 3 метода одного класса).

Ответ можно не обязательно на Python.
...
Рейтинг: 0 / 0
Быдлокод-1 (26 строк) и стандарты программирования
    #39978543
mini.weblab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
grasi,
1)
начинающие программисты языка Python программируют исключительно на языке Python,
и поэтому не создают тяжелых наследий типа PHP, PL1, FoxPro, you name it. (Меньше знаешь - крепче спишь.)
2)
и для решения подобного типа задач используют метаданные и модули типа inspect,
которые являются частью языка Python

и мне почему-то кажется, что в PHP тоже должно быть нечто подобное...
...
Рейтинг: 0 / 0
Быдлокод-1 (26 строк) и стандарты программирования
    #39978547
mini.weblab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
кстати, забыла! еще в Python есть авто-генераторы документации, как, например, sphinx и pydoc
...
Рейтинг: 0 / 0
Быдлокод-1 (26 строк) и стандарты программирования
    #39978549
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
grasi
Я не знаю, как код переписать грамотно в функциональном или ООП-стиле, чтобы его можно было расширять и сопровождать дальше (тяжелое наследие опыта с PL/1, Fortran, FoxBase, FoxPro).
Я думаю, навскидку, этот код надо разбить ,как минимум, на 3 короткие функции (или 3 метода одного класса).


А зачем? Цель какая?
...
Рейтинг: 0 / 0
Быдлокод-1 (26 строк) и стандарты программирования
    #39978552
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Любой рефакторинг должен начинаться с покрытия кода тестами.

В противном случае как мы узнаем что не сломали функционал в процессе изменений ?

Автор у тебя есть тесты?
...
Рейтинг: 0 / 0
Быдлокод-1 (26 строк) и стандарты программирования
    #39978601
grasi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо за ответы!

Для подобных задач буду применять паттерн State.

А в PHP 5479 функций (включая классы).
...
Рейтинг: 0 / 0
Быдлокод-1 (26 строк) и стандарты программирования
    #39978609
mini.weblab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
grasi


А в PHP 5479 функций (включая классы).

очень хорошо, теперь вам будет чем заняться.
...
Рейтинг: 0 / 0
Быдлокод-1 (26 строк) и стандарты программирования
    #39978610
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
При чем здесь state?

Автор сам уже все решил? Ну ладно. Зачем тогда топик поднимал?
...
Рейтинг: 0 / 0
Быдлокод-1 (26 строк) и стандарты программирования
    #39978621
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если не стёб, конечно, прро сопровождение и расширение. Для ООП можно всё в класс завернуть хотя бы. Правда класс без геттеров будет. Ну, если сразу не стоит задача искать по номеру/имени.
...
Рейтинг: 0 / 0
Быдлокод-1 (26 строк) и стандарты программирования
    #39978655
grasi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не стеб и не троллинг. Я переписал через паттерн State.
Состояние понадобилось, потому что я не нумерую методы внутри класса.

Код: python
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.
41.
def ordered_func_in_file(in_file_name, out_file_name):
  state = {}
  state['row_ord'] = 0
  state['func_ord'] = 0
  state['class'] = '?'
  state['input_s'] = ''
  state['output_s'] = ''

  f_in = open(in_file_name)
  f_out = open(out_file_name, 'w')
  for s in f_in:
    handle_state(state, s)
    f_out.write(state['output_s'])
  f_in.close()
  f_out.close()

def handle_state(state, s):
  state['input_s'] = s
  state['output_s'] = s
  state['row_ord'] = state['row_ord'] + 1
  if not (state['row_ord'] >=6 and state['row_ord'] <= 11144):
    return
  if len(s) == 2:
    state['output_s'] = '\n' + s[:1] + ':' + s[1:]
    state['func_ord'] = 0
    return
  pos = s.find('::')
  if pos >= 0:
    class_name = s[:pos]
    if state['class'] <> class_name:
       state['class'] = class_name
       state['func_ord'] = state['func_ord'] + 1
       state['output_s'] = str(state['func_ord']).rjust(3) + ' ' + s
    else:
      state['output_s'] = ' '.rjust(4) + s
  else:
     state['class'] = '?'
     state['func_ord'] = state['func_ord'] + 1
     state['output_s'] = str(state['func_ord']).rjust(3) + ' ' + s

ordered_func_in_file('functions.txt', 'functions-2.txt')



На выходе имею шпаргалку вида:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
a:
  1 abs - Абсолютное значение (модуль числа)
  2 acos - Арккосинус
...
 16 APCIterator::current - Получить текущий элемент
    APCIterator::getTotalCount - Получить общее количество
    APCIterator::getTotalHits - Получить общее число попаданий в кэш
    APCIterator::getTotalSize - Получить общий размер кэша
...
129 atanh - Гиперболический арктангенс

b:
  1 base64_decode - Декодирует данные, закодированные MIME base64
  2 base64_encode - Кодирует данные в формат MIME base64
  3 basename - Возвращает последний компонент имени из указанного пути
  4 BaseResult::getWarnings - Получает предупреждения последней операции
    BaseResult::getWarningsCount - Получает количество предупреждений последней операции
  5 base_convert - Преобразование числа между произвольными системами счисления
...
 26 zookeeper_dispatch - Вызвать callback-функции для ожидающих операций

...
Рейтинг: 0 / 0
Быдлокод-1 (26 строк) и стандарты программирования
    #39978686
mini.weblab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в контексте поставленной задачи (и в контексте ее решения) слышать такие слова как
"быдлокод", "дизайн-паттерн", "стандарты программирования", "стиль" это очень смешно
...
Рейтинг: 0 / 0
Быдлокод-1 (26 строк) и стандарты программирования
    #39978688
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Самоуничижение никогда не способствовало решению вопроса. По крайней мере здесь. На скруле.
...
Рейтинг: 0 / 0
Быдлокод-1 (26 строк) и стандарты программирования
    #39978699
mini.weblab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Самоуничижение никогда не способствовало решению вопроса. По крайней мере здесь. На скруле.

что ты имеешь ввиду под самоуничижением?

человек парсит PHP код с помощью Питона, и при этом жалуется на быдлокод?
...
Рейтинг: 0 / 0
Быдлокод-1 (26 строк) и стандарты программирования
    #39979138
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Опубликованный "особым образом" заголовок настраивает читателя на определённое отношение к теме топика и к автору.

Это просто проверено наблюдением. Вместо того чтобы назвать топик технически-нейтрально ("парсер"), автор
добавил эмоциональный эпитет. И теперь вместе с этим эпитетом нам всем дальше жить. До конца этого топика.
...
Рейтинг: 0 / 0
Быдлокод-1 (26 строк) и стандарты программирования
    #39981107
K23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
K23
Гость
grasi
Не стеб и не троллинг. Я переписал через паттерн State.
Состояние понадобилось, потому что я не нумерую методы внутри класса.

Код: python
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.
41.
def ordered_func_in_file(in_file_name, out_file_name):
  state = {}
  state['row_ord'] = 0
  state['func_ord'] = 0
  state['class'] = '?'
  state['input_s'] = ''
  state['output_s'] = ''

  f_in = open(in_file_name)
  f_out = open(out_file_name, 'w')
  for s in f_in:
    handle_state(state, s)
    f_out.write(state['output_s'])
  f_in.close()
  f_out.close()

def handle_state(state, s):
  state['input_s'] = s
  state['output_s'] = s
  state['row_ord'] = state['row_ord'] + 1
  if not (state['row_ord'] >=6 and state['row_ord'] <= 11144):
    return
  if len(s) == 2:
    state['output_s'] = '\n' + s[:1] + ':' + s[1:]
    state['func_ord'] = 0
    return
  pos = s.find('::')
  if pos >= 0:
    class_name = s[:pos]
    if state['class'] <> class_name:
       state['class'] = class_name
       state['func_ord'] = state['func_ord'] + 1
       state['output_s'] = str(state['func_ord']).rjust(3) + ' ' + s
    else:
      state['output_s'] = ' '.rjust(4) + s
  else:
     state['class'] = '?'
     state['func_ord'] = state['func_ord'] + 1
     state['output_s'] = str(state['func_ord']).rjust(3) + ' ' + s

ordered_func_in_file('functions.txt', 'functions-2.txt')



На выходе имею шпаргалку вида:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
a:
  1 abs - Абсолютное значение (модуль числа)
  2 acos - Арккосинус
...
 16 APCIterator::current - Получить текущий элемент
    APCIterator::getTotalCount - Получить общее количество
    APCIterator::getTotalHits - Получить общее число попаданий в кэш
    APCIterator::getTotalSize - Получить общий размер кэша
...
129 atanh - Гиперболический арктангенс

b:
  1 base64_decode - Декодирует данные, закодированные MIME base64
  2 base64_encode - Кодирует данные в формат MIME base64
  3 basename - Возвращает последний компонент имени из указанного пути
  4 BaseResult::getWarnings - Получает предупреждения последней операции
    BaseResult::getWarningsCount - Получает количество предупреждений последней операции
  5 base_convert - Преобразование числа между произвольными системами счисления
...
 26 zookeeper_dispatch - Вызвать callback-функции для ожидающих операций




Это не является паттерном Состояние. По крайне мере в классической реализации. Просто потому что здесь не инкапсулированы классы в отдельные состояния. Для такой задачи, вероятно, лучше чем поделить на несколько функций ничего не надо. Или готовое найти.

Эксперименты над таким куском кода не позволять архитектурные темы понять, так как они обычно на уровне выше, когда уже набор классов есть, или всё приложение рассматривается целостно.
...
Рейтинг: 0 / 0
Быдлокод-1 (26 строк) и стандарты программирования
    #39981110
ShSerge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
grasi
...Данный код не отвечает никаким стандартам программирования (SOLID, Strategy Pattern, ETL-Extract,Transform, Load)....

Стандартов программирования нет.
...
Рейтинг: 0 / 0
Быдлокод-1 (26 строк) и стандарты программирования
    #39993710
ShSerge,

Соглашусь. Весь код одинаковый. Главное иметь нормальный редактор, хрясь

Код: php
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.
41.
42.
43.
44.
45.
46.
47.
48.
<?
function rjust($s, $w, $c = ' ') {
    if((strlen($s) >= $w) or !($w = intval($w)) or !strlen($c))
		return $s;

    while(strlen($c) < $w)
        $c .= $c;
	
    return substr($c.$s, (-1 * $w));
}


$num_row = 0;
$f_out = fopen('functions-2.txt', 'w');
$prev_class = '?';
$num_func = 0;

if ($handle = fopen("functions.txt", "r")) {
    while (($s = fgets($handle)) !== false) {
        $num_row += 1;

        if ($num_row >= 6 and $num_row <= 11144) {
            if (strlen($s) == 2) {
                $s = "\n" . $s[0] . ':' . $s[1];
                $num_func = 0;
            } else {
                $pos = strpos($s, '::');
                if ($pos >= 0) {
                    $class_name = substr($s, 0, $pos);
                    if ($prev_class <> $class_name) {
                        $prev_class = $class_name;
                        $num_func += 1;
                        $s = rjust($num_func, 3) . ' ' . $s;
                    } else
                        $s = rjust(' ', 4) . $s;
                } else {
                    $prev_class = '?';
                    $num_func += 1;
                    $s = rjust($num_func, 3) . ' ' . $s;
                }
            }
        }
        fwrite($f_out, $s);
    }
    fclose($handle);
}

fclose($f_out);



И вдруг откуда ни возьмись, схожий код по структуре.
...
Рейтинг: 0 / 0
Быдлокод-1 (26 строк) и стандарты программирования
    #39993971
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для такой простой задачи применять разные паттерны и рассуждать о стилях можно только в академических целях. Сферический конь в вакууме.
...
Рейтинг: 0 / 0
Быдлокод-1 (26 строк) и стандарты программирования
    #39993983
Фотография crutchmaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
grasi,

Зачем это, когда есть нормальный справочник на php.net?
...
Рейтинг: 0 / 0
Быдлокод-1 (26 строк) и стандарты программирования
    #39993984
Фотография crutchmaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
grasi
(файл functions.txt во вложении)

Кстати, где он?
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Быдлокод-1 (26 строк) и стандарты программирования
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]