Python演绎的精彩故事(一)
Python演绎的精彩故事(一)
Python是一门广受赞誉的编程语言。她既有强大、简洁而优雅的表现力,又能够支撑工业级的开发实践。
但本文不是Python的入门介绍和教程。
今天我们来讲一个与众不同的故事,看看Python还有哪些不为人知的精彩值得发掘。
我们想借助Python的智慧和威力来尝试一种新思维、新设计、新框架。我们希望构造一种可以媲美硬件工业成熟典范的力量,让软件开发也能够高效、成熟而艺术。这是本文作者的一个梦想。
故事情节概要:假设我们要编写一个应用程序,功能是基于网络的纯文本聊天客户端程序,命名为TextChat。
按照常见的典型设计,开发者这样切分了系统模块:
1.Controller :控制服务器的连接。
2.LoginWindow:供用户输入用户名和密码,登录服务器。
2.ChatWindow :显示聊天信息及好友在线状态,输入并发送聊天消息,登出服务器。
3.CommunicationManager:负责进行通讯的底层网络模块。
用于App主体及各主要class的代码(近似Python语法的伪代码,简略起见仅作示意用)大概长这个样子:
import CommunicationManager
import LoginWindow
import ChatWindow
import Controller
def main():
serverHost = u'192.168.1.100'
serverPort = 8000
ctrl = Controller()
ctrl.StartWork(serverHost, serverPort)
# 连接服务器,创建LoginWindow和ChatWindow,启动LoginWindow。
class Controller(): def __init__(self): pass def StartWork(self, serverHost, serverPort): commMgr = CommunicationManager(serverHost, serverPort) succeeded = commMgr.Connect() if not succeeded: return winChat = ChatWindow(commMgr) winLogin = LoginWindow(commMgr, winChat) winLogin.Show() #Modal window. commMgr.Disconnect()
# 登录服务器,启动ChatWindow。
class LoginWindow(): def __init__(commMgr, winChat): self.__commMgr = commMgr self.__winChat = winChat def Show(): username = xxx.GetValue() password = xxx.GetValue() succeeded = self.__commMgr.Login(username, password) if not succeeded: return self.__winChat.Show()
#处理用户Chat操作:邀请好友、收发message,登出服务器。
class ChatWindow(): def __init__(commMgr): self.__commMgr = commMgr def __OnInviteButtonPressed(): ... friendName = xxx.GetValue() succeeded = self.__commMgr.InviteFriend(friendName, self.HandleReceivedMsg) ... def __OnSendButtonPressed(): ... message = xxx.GetValue() succeeded = self.__commMgr.SendMessage(message) ... def HandleReceivedMsg(receivedMsg): ... def __OnWindowClosing(self): self.__commMgr.Logout()
# 提供所有底层通讯功能:连接、断开;登入、登出;收发消息;邀请好友等。
class CommunicationManager(): def __init__(serverHost, serverPort): self.__serverHost = serverHost self.__serverPort = serverPort def Connect(serverHost, serverPort): pass def Disonnect(serverHost, serverPort): pass def Login(username, password): pass def Logout(): pass def InviteFriend(friendName, callbackListener): ... self.__MessageReceiveThread(callbackListener) ... def SendMessage(message): pass def __MessageReceiveThread(callbackListener): pass
各模块之间的协作与交互关系参看模块关系图。
vcSjv+m85LXE8e66z7nYz7WjujwvcD4KMS5Db250cm9sbGVyPT0+TG9naW5XaW5kb3e6zUNvbW11bmljYXRpb25NYW5hZ2VyoaM8YnI+CjIuTG9naW5XaW5kb3c9PT5DaGF0V2luZG93us1Db21tdW5pY2F0aW9uTWFuYWdlcqGjPGJyPgozLkNoYXRXaW5kb3c9PT5Db21tdW5pY2F0aW9uTWFuYWdlcqGjPGJyPgo8YnI+CtTa1eLA76OsQT09PkIoQdLAwLXT2kIptcTS4su8vs3Kx6O6QdDo0qqz1tPQQrXEyrXA/bKizai5/cq1wP2199PDQrXEt723qKGjPGJyPgo8YnI+Cjxicj4Ku/nT2kMmIzQzOyYjNDM7u/JKYXZh1eLA4L6yzKyx4LPM0+/R1KOsQbHYvavU2rHgwuu6zbHg0uvG2rzkvs2/qsq8svrJ+rbUQrXE0sDAtaOswP3I56O6PGJyPgoxLmluY2x1ZGW21Le9tcTNt87EvP6hozxicj4KMi7RzyYjMjY2ODQ7sLTV1bbUt721xG1ldGhvZMn5w/ex4NC0tffTw9PvvuSjrLLOyv21xMDg0M26zcuz0PKjrLe1u9gmIzIwNTQwO7XEwODQzba8sdjQ69K7y7+yu7m2oaM8YnI+Cjxicj4KPGJyPgo8cD7I57n7QsSjv+m7ucO709C/qreio6xBxKO/6bXEuty24LT6wuu/ycTcvs3Du7eo0LSho8jnuftCxKO/6beiyfrBy7HkuPyjrEHEo7/pzfnN+dKysru1w7K71tjQwrHg0uuhozwvcD4KPHA+QcSjv+m1xL+qt6LV37G7QsSjv+nHo9bGtcO63L/go6y63L/goaPV4r7NysfEo7/p8e66z7rNseCzzNPv0dTX1MnttcTM2LXjy/m0+MC0tcTNtLP+oaM8L3A+CjxwPrWxyLujrMuuxr28q7jftcTJ2cr9v6q3otXf0rLQ7dPQsOy3qLHcv6rSu7K/t9bJz8r2zsrM4qOstavEx9CpvLzHycrHvt/T0M/gtbHE0bbItcSjrLK7ysfLrba8xNzVxr/YtcPBy6GjPC9wPgo8cD62+MnPzsTL+dW5yr61xLT6wuvU8srHtPO24Mr9v6q3otXf1+6zo8q508O1xLXk0M3M18K3o6zKx8/WyrXW0NfuxtWx6bTm1Nq1xMfpv/ahozwvcD4KPHA+PGJyPgo8L3A+CjxwPsq1vMrP7sS/tcS55sSj1LbUtrTz09rV4rj2PHN0cm9uZz48ZW0+VGV4dENoYXQ8L2VtPjwvc3Ryb25nPqOsxuTEo7/pvOS1xPHuus/WrrbgoaLWrri01NO/ydLUz+u8+6GjPC9wPgq1q7ey09C5/b6t0em1xL+qt6LV37a8xNzA7b3ixuTW0LXEzbSz/qGjPGJyPgo8YnI+Cgo8cD61vbTLzqrWuaOsyse5ysrCtcTQ8sS7vde2zqGjPC9wPgo8cD61sdK7s+/EqtW5tcS/qrei1d/T9rW9UHl0aG9utcTKsbryo6zV5tX9we7Iy9DSuKO1xLnKysKyxb+qyryhozwvcD4KPHA+PGJyPgo8L3A+CjxwPrzZtqijrM7Sw8fA+9PDUHl0aG9uv6q3ojxlbT48c3Ryb25nPlRleHRDaGF0PC9zdHJvbmc+PC9lbT7Wrsewo6zS0b6tyrXP1sHL0rvM19Om08OzzNDyv/K83KOss8bWrs6qPHN0cm9uZz5Tb2Z0Y2hpcDwvc3Ryb25nPqGjPC9wPgrV4rj2v/K83LD8uqzI/bj21+m8/qO6TWFjaGluZbrNQ2hpcLXI1+m8/qGj1eLQqdfpvP631rHwxKPE4rzGy+O7+tOyvP7Ptc2ztcS7+sb3us3QvsasoaM8YnI+Cjxicj4KCjxwPsTHw7TK18/Io6y/7MvZ1KTAwNK7z8KjrLv509o8c3Ryb25nPlNvZnRjaGlwPC9zdHJvbmc+vNy5ubXE06bTw7PM0PKjrMbkQXBwxvS2r7K/t9a0+sLrysfU9cO00LS1xKGjPC9wPgo8cD48cHJlIGNsYXNzPQ=="brush:java;">from Softchip import Machine
import CommunicationManager
import LoginWindow
import ChatWindow
import Controller
def main():
CHIP_ID_COMM_MGR = u'chip_id_comm_mgr'
CHIP_ID_CONTROLLER = u'chip_id_controller'
CHIP_ID_LOGIN_WIN = u'chip_id_login_win'
CHIP_ID_CHAT_WIN = u'chip_id_chat_win'
chipList = [
{
Machine.CI_CREATOR: CommunicationManager,
Machine.CI_ARGS : CHIP_ID_COMM_MGR,
},
{
Machine.CI_CREATOR: Controller,
Machine.CI_ARGS : CHIP_ID_CONTROLLER,
},
{
Machine.CI_CREATOR: LoginWindow,
Machine.CI_ARGS : CHIP_ID_LOGIN_WIN,
},
{
Machine.CI_CREATOR: ChatWindow,
Machine.CI_ARGS : CHIP_ID_CHAT_WIN,
},
]
machine = Machine()
machine.CreateChips(chipList)
machine.Boot()
machine.Trigger(u'api_start_work', u'192.168.1.100', 8000)
怎么样?是不是觉得像军队的列阵一般整齐、刚劲、简洁!
这正是我们所期待的代码。当然,代码虽然优美,但要能够真正work才行,不能只是花拳绣腿。
Softchip架构在底层默默地支撑着,而各模块也需要按照明确的规范来设计。
在本系列的下一篇,我们将浏览各模块的代码,看看在Softchip架构上是如何编程的。
相关内容
- 暂无相关文章
评论关闭