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架构上是如何编程的。

相关内容

    暂无相关文章

评论关闭