学习 X# 的时候,接触到依赖注入和接口的概念。对于 VFP 技术背景的开发人员来说,这些是全新的概念。如果不亲自下手尝试很难理解它们到底是什么意思。这里尝试着从 VFP 的角度来阐述它们的大概意思。
在使用 VFP 的过程中,假设你需要创建一个连接类,它用于建立和远程数据库的连接。针对建立连接的方法,常规来说,远程数据库大概率是 SQL Server,那么代码大致是这样的:
Define Class MyWork As Custom
*!* 连接句柄属性,初始值为 -1,表示未连接
nStatementHandle = -1
Procedure Init(tType As Number)
This.nStatementHandle = This.CreatConnection()
EndProc
*!* 创建数据库连接
Procedure CreatConnection() As Number
Local cConnectString As String, nStatementHandle As Number
m.cConnectString = "Driver={SQL Server};UID=sa;PWD=你的密码;Server=你的IP地址;Database=你的数据库"
m.nStatementHandle = Sqlstringconnect(m.cConnectString, .T.)
Return m.nStatementHandle
Endproc
Enddefine
作为特定用途来说,这似乎足够了。
但是,如果你想使它也适应于 MySQL,那么,你大概率是这样设计:
Define Class MyWork As Custom
*!* 连接句柄属性,初始值为 -1,表示未连接
nStatementHandle = -1
Procedure Init(tType As Number)
This.nStatementHandle = This.CreatConnection(m.tType)
EndProc
*!* 创建数据库连接
Procedure CreatConnection(tType as Number) As Number
Local cConnectString As String, nStatementHandle As Number
Do Case
Case tType = 1 && SQL Server 数据库
m.cConnectString = "Driver={SQL Server};UID=sa;PWD=你的密码;Server=你的IP地址;Database=你的数据库"
Case tType = 2 && MySQL 数据库
m.cConnectString = "Driver={MySQL ODBC 8.0 ANSI Driver};UID=root;PWD=你的密码;Server=你的IP地址;Database=你的数据库;Port=你的端口"
EndCase
m.nStatementHandle = Sqlstringconnect(m.cConnectString, .T.)
Return m.nStatementHandle
Endproc
Enddefine
到这个状态还算可以。已经可以连接到两种数据库。但是,如果需求还需要连接到 Access 数据库、Oracle 数据库、PostgreSQL 数据库......情况似乎会变得复杂一些......如果是其他功能有类似的需求呢?例如,你需要从不同的文档格式中读取内容。
"那还不简单啊,加 Case 分支啊......"
可能这是大多数 VFP 开发人员都是这个想法。但是,这可能就是“屎山”的雏形......
到底有没有办法来解决这个问题呢?下回分解!