Tôi cần phát triển API, các chức năng của API là các yêu cầu gọi dịch vụ được máy chủ trưng ra.
Ban đầu API hoạt động như thế này:
class Server:
def firstRequest(self, arg1, arg2):
# block of code A
async = Async()
async.callFirstRequest(arg1, arg2)
# block of code B
def secondRequest(self, argA, argB, argC):
# block of code A (identical to that of firstRequest)
async = Async()
async.callSecondRequest(argA, argB, argC)
# block of code B (identical to that of firstRequest)
class Async:
def callFirstRequest(self, arg1, arg2):
doFirstRequest(arg1, arg2)
# run the real request and wait for the answer
def doFirstRequest(self, arg1, arg2):
response = client.firstRequest(arg1, arg2)
def callSecondRequest(self, argA, argB, argC):
doSecondRequest(argA, argB, argC)
# run the real request and wait for the answer
def doSecondRequest(self, argA, argB, argC):
response = client.secondRequest(argA, argB, argC)
server = Server()
server.firstRequest(arg1=1, arg2=2)
server.secondRequest(argA='A', argB='B', argC='C')
Có rất nhiều mã trùng lặp và tôi không thích cách nó chuyển các đối số cho yêu cầu. Bởi vì có rất nhiều đối số nên tôi muốn trích xuất chúng từ yêu cầu và làm cho một cái gì đó tham số hơn.
Vì vậy, tôi đã tái cấu trúc theo cách này:
# using a strategy pattern I was able to remove the duplication of code A and code B
# now send() receive and invoke the request I wanna send
class Server:
def send(self, sendRequest):
# block of code A
asynch = Async()
sendRequest(asynch)
# block of code B
# Request contains all the requests and a list of the arguments used (requestInfo)
class Request:
# number and name of the arguments are not the same for all the requests
# this function take care of this and store the arguments in RequestInfo for later use
def setRequestInfo(self, **kwargs):
if kwargs is not None:
for key, value in kwargs.iteritems():
self.requestInfo[key] = value
def firstRequest(async)
async.doFirstRequest(self.requestInfo)
def secondRequest(async)
async.doSecondRequest(self.requestInfo)
# Async run the real request and wait for the answer
class Async:
def doFirstRequest(requestInfo):
response = client.firstRequest(requestInfo['arg1'], requestInfo['arg2'])
def doSecondRequest(requestInfo)
response = client.secondRequest(requestInfo['argA'], requestInfo['argB'], requestInfo['argC'])
server = Server()
request = Request()
request.setRequestInfo(arg1=1, arg2=2) # set of the arguments needed for the request
server.send(request.firstRequest)
request.setRequestInfo(argA='A', argB='B', argC='C')
server.send(request.secondRequest)
Các mô hình chiến lược làm việc, sự trùng lặp được loại bỏ. Bất kể điều này tôi sợ có những điều phức tạp, đặc biệt là liên quan đến các đối số, tôi không thích cách tôi xử lý chúng, bởi vì khi tôi nhìn vào mã không có vẻ dễ dàng và rõ ràng.
Vì vậy, tôi muốn biết liệu có một mô hình hoặc một cách tốt hơn và rõ ràng hơn để đối phó với loại mã API phía máy khách này.