My Select Query — how to?

INTRO

Добрый день, всем! Сегодня на данной статье мы рассмотрим такой небольшой и уникальный проект My Select Query, в ходе которого откроем для себя новые аспекты программирования. Сам проект является отличным вступлением в ООП, написания своих парсеров и т.д. Итак поехали !

PLAN

Наш план для достижения Success. выглядит таким образом:

  • Project description
  • Key moments
  • Writing code and explanation

PROJECT DESCRIPTION

Что такое MySelectQuery ? Это проект в котором, мы должны создать класс с названием MySelectQuery, который будет выполнять запросы насчёт csv и выводить соответствующий результат на консоль. То есть, класс через какие-то «функции» должен получить данные о запросе и вывести ответ к этому запросу из данного csv.

KEY MOMENTS

Раньше вы писали код на языке Си. Язык Си является процедурным языком, соответсвенно все это время вы писали процедурный код в рамках Season 01 Arc 1-2. Однако, сегодня мы познакомимся с таким новым для нас подходом написания кода как ООП (Объектно Ориентированное Программирование). Именно ООП-подход будет использоваться для реализации какого проекта? MySelectQuery.

OOP

(Объектно-ориентированное программирование) – это парадигма, то есть стиль проектирования программы, где программа описывается в виде совокупности обьектов и классов. А каждый обьект представляет собой модель определенной, реальной вещи или же обьекта. В ООП есть такие ключевые понятия:

Класс – это представление любой вещи из реального мира, будь это животное или даже сложные системы. Но, класс описывает этот обьект не совсем полностью, лишь частично для решения конкретной проблемы или задачи

Обьект — экземпляр класса с определенными свойствами и методами. То есть, класс для обьекта задается как шаблон или каркас, по которому он должен строится. Поэтому, обьект это сущность, созданная по этому шаблону. Имеет в себе определенные свойства (переменные, где будут храниться данные ) и методы (функции или действия, которые осуществляет обьект).

Метод — в ООП означает функцию или процедуру, принадлежащая какому-то классу или объекту. Методы используется для совершения каких-то действий самим обьектом или же классом.

Свойство — способ доступа к внутреннему состоянию объекта, имитирующий переменную некоторого типа. Под словом состояние обьекта подразумевается его данные, которые описывают его.

Конструктор —  это тот же обычный метод в ООП, но вызываемый автоматический при создании объекта. ВАЖНО! Имена конструкторов в каждом языке выглядят по разному и нельзя создать свой метод с таким же именем. Все методы с таким именем будут определены как КОНСТРУКТОР.

CSV

CSV это файл в текстовом формате или строка, предназначенный для представления табличных данных.

WRITING CODE AND EXPLANATION

Бум! Осталось лишь написать код и +1 законченный проект в кармане. *** В качестве демострационного языка будет использовать Ruby. Но вы можете использовать любой обьектно-ориентированный язык.***

В описании сказано, что мы должны:

  • создать класс MySelectQuery
  • прописать два метода. Конструктор и метод Where().
  • Конструктор принимает один аргумент — csv string (Это строка хранит в себе табличные данные. Соответственно, у такой таблицы есть имя полей и значения этих полей). Далее обьект хранит данную строку в своем свойстве.
  • Метод where() принимает два аргумента. Имя поля и значения данного поля. И этот метод извлекает из csv ту запись, которая соответсвует к этим параметрам.

Begining

Создаем класс MySelectQuery. В Руби Класс создается с таким образом.

class MySelectQuery # инициализация класса 
# Здесь будут написаны тело класса
end # не забудьте закрыть класс 

Создаем метод конструктор. Напомните себе что это такое?. В руби конструктор обьявляется как initialize().

Конструктор принимает один аргумент csv строку. Передадим аргумент как csv_content. Далее этот аргумент присвоим к автоматичеки созданной свойстве как @csvData. @ — означает что мы создаем или обращаемся к свойству обьекта Свойства создаются автоматический. Просто дайте имя свойству. Но при присвоенни сделаем небольшую обработку.


require 'csv' # подключаем модуль csv для работы с такими данными

class MySelectQuery # инициализация класса 
# Здесь будут написаны тело класса
    # Все внутри пишется через табуляцию.
    initialize(csv_content)
       @csvData = CSV.parse(csv_content, headers: true) # переобразовываем строку в массив csv обьектов      
    end # и тут тоже

end # не забудьте закрыть класс 

Конструктор прописан, теперь пишем where(). Через этот метод получаем нужные нам данные, имя поле и значения этого поля. Далее, ищем в каждом csv обьекте массива @csvData такое поле (column_name) и сравниваем эти значения с заданным значением поле (column_value).




require 'csv' # подключаем модуль csv для работы с такими данными

class MySelectQuery # инициализация класса 
# Здесь будут написаны тело класса
    # Все внутри пишется через табуляцию.
    def initialize(csv_content)
       @csvData = CSV.parse(csv_content, headers: true) # переобразовываем строку в массив csv обьектов      
    end # и тут тоже
     
    def where(column_name, column_value)
       # получаем доступ к свойству и итерируем через цикл
        @csvData.each do |row|

            # сравниваем каждое значения такого поля
            if row[column_name] == column_value # и если равно то, пока что выведем 
                 p row # вывод соответствующей записи
            end
        end
    end

end # не забудьте закрыть класс 



Окей, мы наши эти записи. Но эти записи теперь надо обработать в нужный формат, удобный для Gandalf и добавить его в итогового массива. Описывая так, наши вводимые и выводимые данные должны быть таким образом:

Input: "name" && "Andre Brown"
Output: ["Andre Brown,2007,2009,F,6-9,245,birth_date,May 12, 1981,'DePaul University'"]

Поэтому давайте преобразуем в такой тип каждую запись. «Andre Brown,2007,2009,F,6-9,245,birth_date,May 12, 1981,’DePaul University'». Для этого этот row мы конвертируем в хеш .to_hash, затем берем эти значения хеша через .values, он возвращает нам массив и для преобразования в строку мы добавляем эти значения в одну строку через запятые .join(‘,’).



require 'csv' # подключаем модуль csv для работы с такими данными

class MySelectQuery # инициализация класса 
# Здесь будут написаны тело класса
    # Все внутри пишется через табуляцию.
    def initialize(csv_content)
       @csvData = CSV.parse(csv_content, headers: true) # переобразовываем строку в массив csv обьектов      
    end # и тут тоже
     
    def where(column_name, column_value)
       # получаем доступ к свойству и итерируем через цикл
        @csvData.each do |row|
            result = [] # создаем итоговый массив
            # сравниваем каждое значения такого поля
            if row[column_name] == column_value # и если равно то, пока что выведем 
                result.push(row.to_hash.values.join(',')) # добавляем в массив уже обработанную запись
            end
        end
       result # возврат результата
    end

end # не забудьте закрыть класс

УРА! Все этапы были созданы. реализованы. СТОП! Что мы сделали? Мы создали класс, прописали его методы и все. Но создать обьект, вызвать эти обьекты мы еще не делали. Поэтому, после класса пропишем такой небольшой код.

..........
csv_content="name,year_start,year_end,position,height,weight,birth_date,college\nAlaa Abdelnaby,1991,1995,F-C,6-10,240,'June 24, 1968',Duke University\nZaid Abdul-Aziz,1969,1978,C-F,6-9,235,'April 7, 1946',Iowa State University\nKareem Abdul-Jabbar,1970,1989,C,7-2,225,'April 16, 1947','University of California, Los Angeles
Mahmoud Abdul-Rauf,1991,2001,G,6-1,162,'March 9, 1969',Louisiana State University\n"
instance=MySelectQuery.new(csv_content) # создания обьекта с названием instance через ключевое слово #.new(). new() также принимает аргументы конструкора.
p instance.where('name', 'Mahmoud Abdul-Rauf') # вывод результата

Теперь можете проверить через гендальф). Удачи на следующиз проектах.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.