Проекти - добър код

  1. Правих 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
      

Трябва да сте влезли в системата, за да може да отговаряте на теми.