Гость
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Быдлокод-1 (26 строк) и стандарты программирования / 20 сообщений из 20, страница 1 из 1
11.07.2020, 22:30
    #39978508
grasi
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Быдлокод-1 (26 строк) и стандарты программирования
Здравствуйте!

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

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


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

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

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

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

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


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

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

Автор сам уже все решил? Ну ладно. Зачем тогда топик поднимал?
...
Рейтинг: 0 / 0
12.07.2020, 14:20
    #39978621
exp98
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Быдлокод-1 (26 строк) и стандарты программирования
Если не стёб, конечно, прро сопровождение и расширение. Для ООП можно всё в класс завернуть хотя бы. Правда класс без геттеров будет. Ну, если сразу не стоит задача искать по номеру/имени.
...
Рейтинг: 0 / 0
12.07.2020, 15:17
    #39978655
grasi
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Быдлокод-1 (26 строк) и стандарты программирования
Не стеб и не троллинг. Я переписал через паттерн 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
12.07.2020, 18:32
    #39978686
mini.weblab
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Быдлокод-1 (26 строк) и стандарты программирования
в контексте поставленной задачи (и в контексте ее решения) слышать такие слова как
"быдлокод", "дизайн-паттерн", "стандарты программирования", "стиль" это очень смешно
...
Рейтинг: 0 / 0
12.07.2020, 18:43
    #39978688
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Быдлокод-1 (26 строк) и стандарты программирования
Самоуничижение никогда не способствовало решению вопроса. По крайней мере здесь. На скруле.
...
Рейтинг: 0 / 0
12.07.2020, 19:18
    #39978699
mini.weblab
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Быдлокод-1 (26 строк) и стандарты программирования
mayton
Самоуничижение никогда не способствовало решению вопроса. По крайней мере здесь. На скруле.

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

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

Это просто проверено наблюдением. Вместо того чтобы назвать топик технически-нейтрально ("парсер"), автор
добавил эмоциональный эпитет. И теперь вместе с этим эпитетом нам всем дальше жить. До конца этого топика.
...
Рейтинг: 0 / 0
17.07.2020, 20:00
    #39981107
K23
K23
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Быдлокод-1 (26 строк) и стандарты программирования
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
17.07.2020, 20:07
    #39981110
ShSerge
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Быдлокод-1 (26 строк) и стандарты программирования
grasi
...Данный код не отвечает никаким стандартам программирования (SOLID, Strategy Pattern, ETL-Extract,Transform, Load)....

Стандартов программирования нет.
...
Рейтинг: 0 / 0
29.08.2020, 01:54
    #39993710
Быдлокод-1 (26 строк) и стандарты программирования
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
31.08.2020, 01:20
    #39993971
DarkMaster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Быдлокод-1 (26 строк) и стандарты программирования
Для такой простой задачи применять разные паттерны и рассуждать о стилях можно только в академических целях. Сферический конь в вакууме.
...
Рейтинг: 0 / 0
31.08.2020, 05:51
    #39993983
crutchmaster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Быдлокод-1 (26 строк) и стандарты программирования
grasi,

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

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


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