Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Программирование Новый топик    Ответить
 Быдлокод-1 (26 строк) и стандарты программирования  [new]
grasi
Member

Откуда:
Сообщений: 3
Здравствуйте!

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

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

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

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.
11 июл 20, 22:30    [22165853]     Ответить | Цитировать Сообщить модератору
 Re: Быдлокод-1 (26 строк) и стандарты программирования  [new]
mini.weblab
Member

Откуда:
Сообщений: 1027
grasi,
1)
начинающие программисты языка Python программируют исключительно на языке Python,
и поэтому не создают тяжелых наследий типа PHP, PL1, FoxPro, you name it. (Меньше знаешь - крепче спишь.)
2)
и для решения подобного типа задач используют метаданные и модули типа inspect,
которые являются частью языка Python

и мне почему-то кажется, что в PHP тоже должно быть нечто подобное...
12 июл 20, 02:02    [22165900]     Ответить | Цитировать Сообщить модератору
 Re: Быдлокод-1 (26 строк) и стандарты программирования  [new]
mini.weblab
Member

Откуда:
Сообщений: 1027
кстати, забыла! еще в Python есть авто-генераторы документации, как, например, sphinx и pydoc
12 июл 20, 02:29    [22165904]     Ответить | Цитировать Сообщить модератору
 Re: Быдлокод-1 (26 строк) и стандарты программирования  [new]
hVostt
Member

Откуда:
Сообщений: 18013
grasi
Я не знаю, как код переписать грамотно в функциональном или ООП-стиле, чтобы его можно было расширять и сопровождать дальше (тяжелое наследие опыта с PL/1, Fortran, FoxBase, FoxPro).
Я думаю, навскидку, этот код надо разбить ,как минимум, на 3 короткие функции (или 3 метода одного класса).


А зачем? Цель какая?

К сообщению приложен файл. Размер - 78Kb
12 июл 20, 02:43    [22165907]     Ответить | Цитировать Сообщить модератору
 Re: Быдлокод-1 (26 строк) и стандарты программирования  [new]
mayton
Member

Откуда: loopback
Сообщений: 48022
Любой рефакторинг должен начинаться с покрытия кода тестами.

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

Автор у тебя есть тесты?
12 июл 20, 07:48    [22165918]     Ответить | Цитировать Сообщить модератору
 Re: Быдлокод-1 (26 строк) и стандарты программирования  [new]
grasi
Member

Откуда:
Сообщений: 3
Спасибо за ответы!

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

А в PHP 5479 функций (включая классы).
12 июл 20, 12:24    [22165983]     Ответить | Цитировать Сообщить модератору
 Re: Быдлокод-1 (26 строк) и стандарты программирования  [new]
mini.weblab
Member

Откуда:
Сообщений: 1027
grasi


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

очень хорошо, теперь вам будет чем заняться.
12 июл 20, 13:07    [22165996]     Ответить | Цитировать Сообщить модератору
 Re: Быдлокод-1 (26 строк) и стандарты программирования  [new]
mayton
Member

Откуда: loopback
Сообщений: 48022
При чем здесь state?

Автор сам уже все решил? Ну ладно. Зачем тогда топик поднимал?
12 июл 20, 13:14    [22165997]     Ответить | Цитировать Сообщить модератору
 Re: Быдлокод-1 (26 строк) и стандарты программирования  [new]
exp98
Member

Откуда:
Сообщений: 2445
Если не стёб, конечно, прро сопровождение и расширение. Для ООП можно всё в класс завернуть хотя бы. Правда класс без геттеров будет. Ну, если сразу не стоит задача искать по номеру/имени.
12 июл 20, 14:20    [22166010]     Ответить | Цитировать Сообщить модератору
 Re: Быдлокод-1 (26 строк) и стандарты программирования  [new]
grasi
Member

Откуда:
Сообщений: 3
Не стеб и не троллинг. Я переписал через паттерн State.
Состояние понадобилось, потому что я не нумерую методы внутри класса.

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')


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

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-функции для ожидающих операций

12 июл 20, 15:17    [22166054]     Ответить | Цитировать Сообщить модератору
 Re: Быдлокод-1 (26 строк) и стандарты программирования  [new]
mini.weblab
Member

Откуда:
Сообщений: 1027
в контексте поставленной задачи (и в контексте ее решения) слышать такие слова как
"быдлокод", "дизайн-паттерн", "стандарты программирования", "стиль" это очень смешно
12 июл 20, 18:32    [22166100]     Ответить | Цитировать Сообщить модератору
 Re: Быдлокод-1 (26 строк) и стандарты программирования  [new]
mayton
Member

Откуда: loopback
Сообщений: 48022
Самоуничижение никогда не способствовало решению вопроса. По крайней мере здесь. На скруле.
12 июл 20, 18:43    [22166102]     Ответить | Цитировать Сообщить модератору
 Re: Быдлокод-1 (26 строк) и стандарты программирования  [new]
mini.weblab
Member

Откуда:
Сообщений: 1027
mayton
Самоуничижение никогда не способствовало решению вопроса. По крайней мере здесь. На скруле.

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

человек парсит PHP код с помощью Питона, и при этом жалуется на быдлокод?

Сообщение было отредактировано: 12 июл 20, 19:17
12 июл 20, 19:18    [22166115]     Ответить | Цитировать Сообщить модератору
 Re: Быдлокод-1 (26 строк) и стандарты программирования  [new]
mayton
Member

Откуда: loopback
Сообщений: 48022
Опубликованный "особым образом" заголовок настраивает читателя на определённое отношение к теме топика и к автору.

Это просто проверено наблюдением. Вместо того чтобы назвать топик технически-нейтрально ("парсер"), автор
добавил эмоциональный эпитет. И теперь вместе с этим эпитетом нам всем дальше жить. До конца этого топика.
13 июл 20, 18:17    [22166737]     Ответить | Цитировать Сообщить модератору
 Re: Быдлокод-1 (26 строк) и стандарты программирования  [new]
K23
Member

Откуда:
Сообщений: 27
grasi
Не стеб и не троллинг. Я переписал через паттерн State.
Состояние понадобилось, потому что я не нумерую методы внутри класса.

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')


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

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-функции для ожидающих операций




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

Эксперименты над таким куском кода не позволять архитектурные темы понять, так как они обычно на уровне выше, когда уже набор классов есть, или всё приложение рассматривается целостно.
17 июл 20, 20:00    [22169494]     Ответить | Цитировать Сообщить модератору
 Re: Быдлокод-1 (26 строк) и стандарты программирования  [new]
ShSerge
Member

Откуда: ʚонɔ dиw
Сообщений: 24887
grasi
...Данный код не отвечает никаким стандартам программирования (SOLID, Strategy Pattern, ETL-Extract,Transform, Load)....

Стандартов программирования нет.
17 июл 20, 20:07    [22169497]     Ответить | Цитировать Сообщить модератору
Все форумы / Программирование Ответить