MVC pattern

|

MVC 패턴이란?

View, Controller, Model을 분리시켜서 재활용성을 높이는 것이 초점.

그림은 다음과 같다.

MVC

구성 요소

Model

data와 logic을 직접적으로 다루는 역할.

View

정보의 나타내는 뷰.

Controller

input을 받고 Model과 View에 필요한 요청을 함.

기본적인 골자는 위와 같으며 Model, View간의 의존성이 낮을 수록 좋다.

code

간단하게 짜본 코드를 살펴본다.

# Model.py
from functools import reduce
from typing import List

class dataSchema(object):
    def __init__(self, name: str, age: int):
        self.setProperty(name, age)

    def setProperty(self, name: str, age: int):
        self.name = name
        self.age  = age

    def getProperty(self):
        if self.age == -1:
            raise Exception('not setted.')
        return {'name': self.name, 'age': self.age}

    def __str__(self):
        return "(name : {}, age : {})".format(self.name, self.age)

    def __repr__(self):
        return "{}(\"{}\", {})".format(self.__class__.__name__, self.name, self.age)


class Model(object):
    def __init__(self):
        self.data = []

    def append(self, item : dataSchema):
        self.data.append(item)

    def getDataList(self) -> List[dataSchema]:
        return self.data

    def getTotalAge(self) -> int:
        def getAge(data):
            return data.getProperty()['age']
        
        totalAge = reduce(lambda x, y: x+y, map(getAge,self.data))
        return totalAge


def makeAndGetDummyData():
    '''
    실험을 위한 dummy data
    '''
    a = dataSchema("OHS", 28)
    b = dataSchema("HYJ", 28)
    return [a, b]
# View.py
from typing import List


class View:
    def __init__(self):
        pass

    def viewTotalAgeAndCount(self, totAge:int, count:int) -> None:
        print("###### totalAge ######\n{}\n#### number of data ####\n{}".format(totAge, count))
    def viewDataList(self, nameList: List[str], ageList: List[int]) -> None:
        if len(nameList) != len(ageList):
            raise Exception('the length of nameList must be same with the one of ageList.')
        print("name\tage")
        print("----------------")
        for name, age in zip(nameList, ageList):
            print("{}\t{}".format(name, age))
# Controller.py
from Model import Model, makeAndGetDummyData
from View import View
from functools import reduce
from typing import List


class Controller(object):
    def __init__(self):
        self.model = Model()
        dummyDataList = makeAndGetDummyData()
        for d in dummyDataList:
            self.model.append(d)
        self.view = View()

    def touchDataList(self) -> None:
        dataList = self.model.getDataList()

        nameList = [d.getProperty()["name"] for d in dataList]
        ageList = [d.getProperty()["age"] for d in dataList]

        self.view.viewDataList(nameList, ageList)

    def touchTotalAgeAndCount(self) -> None:
        totalAge = self.model.getTotalAge()
        dataLen = len(self.model.getDataList())

        self.view.viewTotalAgeAndCount(totalAge, dataLen)
# mvc.py
from Controller import Controller
if __name__ == '__main__':
    controller = Controller()

    controller.touchDataList()
    controller.touchTotalAgeAndCount()

코드를 보면 Controller에서 dummyData를 넣는 것을 볼 수 있다. 이는 data가 존재하지 않기에 들어간 코드이며, 실제로는 DB에서 가져오거나 하겠지…