Правих ASCII визуализация под формата на таблица на информацията от базата данни. Това се оказа предизвикателство, защото не успях лесно да опростя кода и да го именувам ясно и кратко. Докарах го до тук - ако някой има по-добри идеи или коментари да каже.
Това ми е аргументацията, защо съм го направил така.
-
Именуване
Правилото е, че променливата със сложното описание (да я кръстим Х) бива именувана различно в рамките на всяка функция. Името се избира според това коя характеристика е важна за функцията. Напр. отвън
as_table_string
се вика така -as_table_string(items)
, защото за външния свят това са единици информация в масив =>items
. Вътре вas_table_string
аргументът се казваordered_rows_with_cells_described
, защото във функцията се използва, (1) че редовете са наредени (слага се нов ред на първа позиция) и (2) че клетките имат някакво описание, защото то се маха (не е важно какво, затова съм писалdescribed
, а неwith_key_telling_the_column_name
). В другите функции това правило пак се ползва. -
Структура
Публичната ми функция само управлява какво да се случи и по този начин върши само 1 нещо. Задава чрез имената на методите и променливите общо описание на алгоритъма, без да ползва коментари.
class Support module DataToTableString def as_table_string(ordered_rows_with_cells_described) ordered_rows_with_cells_described = column_names_to_head_row ordered_rows_with_cells_described ordered_rows = without_cells_description ordered_rows_with_cells_described rows_of_values_to_table ordered_rows end private def without_cells_description(rows_with_cells_by_column_name) rows_with_cells_by_column_name.map { |cells_by_column_name| Hash[cells_by_column_name].values } end def rows_of_values_to_table(rows_of_values) table_string = rows_of_values.inject("") do |table, cells| column_id = 0 row_str = cells.inject("") do |row, value| row << value.to_s.ljust(2 + max_length_of_column(column_id, rows_of_values)) column_id = column_id + 1 row end table << row_str.strip << "\n" end table_string end def max_length_of_column(column_id, rows_of_values) rows_of_values.map { |row| row[column_id].to_s.length }.max end def column_names_to_head_row(rows_by_ordering_index_where_row_is_hash_of_column_name_and_cell_value) rows = rows_by_ordering_index_where_row_is_hash_of_column_name_and_cell_value column_names = Hash[rows.first].keys rows.unshift column_names.zip(column_names.map &:upcase) rows end end extend DataToTableString end