MVC pattern
10 Oct 2016 | python patternMVC 패턴이란?
View, Controller, Model을 분리시켜서 재활용성을 높이는 것이 초점.
그림은 다음과 같다.
구성 요소
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에서 가져오거나 하겠지…