首页 > 其他分享 >[AHK]用AutoHotkey面向对象实践“简单工厂模式”

[AHK]用AutoHotkey面向对象实践“简单工厂模式”

时间:2023-04-26 21:32:39浏览次数:42  
标签:oper numberB 运算 numberA AHK 面向对象 result ._ AutoHotkey


用面向对象编程实现一个计算器程序,要求输入两个数和运算符号,得到结果。

“所有编程初学者都会有这样的问题,就是碰到问题就直觉地用计算机能够理解的逻辑来描述和表达待解决的问题及具体的求解过程。这其实是用计算机的方式去思考,比如计算器这个程序,先要求输入两个数和运算符号,然后根据运算符号判断如何运算,得到结果,这本身没有错,但这样的思维却使得我们的程序只为满足实现当前的需求,程序不容易维护,不容易扩展,更不容易复用。从而达不到高质量代码的要求。”

例子:【活体印刷】

[AHK]用AutoHotkey面向对象实践“简单工厂模式”_设计模式

三国时期,由于还未发明活字印刷,所有要改字的时候,就必须要整个刻板全部重新刻!实在是很吐血很蛋痛!而到了后来,活体印刷的出现,此景此情此处只需更改四字即可,其余工作都未白做,岂不妙哉!
“第一,要改,只需更改要改之字,此为可维护;第二,这些字并非用完这次就无用,完全可以在后来的印刷中重复使用,此乃可复用;第三,此诗若要加字,只需刻字加入即可,这是可扩展;第四,字的排列其实可能是竖排也可能是横排,此时只需将活字移动就可做到满足排列需求,此是灵活性好。”
“可维护、可复用、可扩展、灵活性好这四点,不仅仅是面向对象编程的一个起始点更是我们对待每一个程序应用一个较好的编程思想!”

————————————————

基于以上的情景,要求你再写一个Windows的计算器,你现在的代码能不能复用呢?
“有人说直接把代码复制过去不就可以了吗?改动不多不算麻烦。这其实是非常不好的编码习惯,因为当你的代码中重复的代码多到一定程度,维护的时候可能就是一场灾难。越大的系统,这种方式带来的问题越严重,编程有一原则,就是用尽可能的办法去避免重复。回过头看看我们写的代码,有哪些是和控制台(界面逻辑)无关的,而哪些又与计算器(业务逻辑)有关呢?
“准确地说,就是让业务逻辑与界面逻辑分开,让它们之间的耦合度下降。只有分离开,才可以达到容易维护或扩展。”

业务与界面分离

/**
*运算类
*@author sunwind
*/

class Operation {
    GetResult(numberA, numberB, operate)
    {
        result := 0d
        switch (operate)
        {
         case "+":
             result := numberA + numberB
             
         case "-":
             result := numberA - numberB
             
         case "*":
             result := numberA * numberB
             
         case "/":
         {
             if (numberB=0) 
                throw { what: "除零错误!", file: A_LineFile, line: A_LineNumber }
             else
                result := numberA / numberB     
         }              
             
        }
        return result
    }
}


/**
 * 业务与界面分离
 * @author sunwind
 *
 */
class Test {
    main() {        
        try {
            InputBox, strNumberA , 输入, 请输入数字A:
            InputBox, strOperator , 输入, 请选择运算符号(+、-、*、/):
            InputBox, strNumberB , 输入, 请输入数字B:
            strResult := Operation.GetResult(strNumberA,strNumberB, strOperator)
            MsgBox % "结果是:"  strResult
        } catch e {
            MsgBox % "您的输入有错:"  e.what "`n"  e.file "`n"  e.line
        }
    }
}

Test.main()

如此的代码编程,不单是Windows程序,Web版程序需要运算也可以用它,PDA、手机等需要移动系统的软件需要运算也可以用它。但仅此而已,还谈不上完全面向对象,此处仅仅只用了面向对象三大特性中的其中一个(封装),还有两个没用(继承和多态)呢!

紧耦合 VS 松耦合

:“基于以上的代码,是否已做到很灵活的修改和扩展呢?”
条件:“现在如果我希望增加一个开根(sqrt)运算,你会如何改?”
菜鸟回答:“那只需要改Operation类就行了,在switch中加一个分支就行了。”
分析:“问题是你要加一个平方根运算,却需要让加减乘除的运算都得来参与编译,如果你一不小心把加法运算改成了减法,这岂不是大大的糟糕。打个比方,如果现在公司要求你为公司的薪资管理系统做维护,原来只有技术人员(月薪),市场销售人员(底薪+提成),经理(年薪+股份)三种运算算法,现在要增加兼职工作人员(时薪)的算法,但按照上述的程序写法,公司就必须要把包含原三种算法的运算类给你,让你修改,你如果心中小算盘一打,‘TMD!公司给我的工资这么低,这下有机会了’,于是你除了增加了兼职算法以外,在技术人员(月薪)算法中写了一句。

if (技术人员是我)
{
    salary *= 1.1;
}

如此就意味着,你的月薪每月都会增加10%(小心被抓去坐牢),本来是让你加一个功能,却使得原有运行良好的功能代码产生了变化,这个风险太大了!”

简单工厂模式

工厂模式用于处理 如何获取实例对象问题,建造者模式用于处理如何建造实例对象 问题。

工厂方法的实现并不能减少工作量,但是它能够在必须处理新情况时,避免使已经很复杂的代码更加复杂。

通常设计应该是从工厂方法开始,当设计者发现需要更大的灵活性时,设计便会向其他创建型模式演化。当设计者在设计标准之间进行权衡的时候,了解多个创建型模式可以给设计者更多的选择余地。
 

[AHK]用AutoHotkey面向对象实践“简单工厂模式”_面向对象_02

 

#SingleInstance, Force
/**
 * 运算类
 * @author sunwind
 *
 */
class Operation {
    _numberA
    {
        get{
            return this._numberA
        }
    }
    _numberB
    {
         get{
            return this._numberB
        }
  
    }
}
/**
 * 加减乘除类 -- 加法类,继承运算类
 * @author sunwind
 *
 */
class OperationAdd extends Operation {   
   
    result[]
    {
        get{
            return base._numberA + base._numberB
        }
    } 
}
/**
 * 加减乘除类 -- 减法类,继承运算类
 * @author sunwind
 *
 */
class OperationSub extends Operation {
    result[]
    {
        get{
            return base._numberA - base._numberB
        }
    } 

}
/**
 * 加减乘除类 -- 乘法类,继承运算类
 * @author sunwind
 *
 */
class OperationMul extends Operation {   
    result[]
    {
        get{
            return base._numberA * base._numberB
        }
    } 
}
/**
 * 加减乘除类 -- 除法类,继承运算类
 * @author sunwind
 *
 */
class OperationDiv extends Operation {   
   
    result[]
    {
        get{
            return base._numberA / base._numberB
        }
    } 
}
;增加一个新运算,需要增加一个Operation的子类 比如,增加“指数运算”  就幢一个 OperationExp 类 继承 Operation
;并需要在简单运算工厂类中增加相应运算符即可。
class OperationExp extends Operation{
    
    result[]
    {
        get{
            return base._numberA ** base._numberB
        }
    } 
}

/**
 * 简单运算工厂类
 * @author sunwind
 * 
 */
class OperationFacotry {
    createOperate(operate){      
        oper :="" 
        switch (operate)
        {
            case "+":
                oper := new OperationAdd()
            case "-":
                oper := new OperationSub()
            case "*":
                oper := new OperationMul()
            case "/":
                oper := new OperationDiv()
            case "^":
                oper := new OperationExp()
        }
        return oper
    }   
}
/**
 * 客户端代码
 * @author sunwind
 *
 */
class Test{
    main() {
        oper:= ""
        oper := OperationFacotry.createOperate("^")
        oper._numberA:=2
        oper._numberB:=3
        result := oper.result
        MsgBox % "结果是:"  result
    }
}


Test.main()

[AHK]用AutoHotkey面向对象实践“简单工厂模式”_面向对象_03

编程是一门技术,更加是一门艺术,不能只满足于写完代码运行结果正确就完事,时常考虑如何让代码更加简练,更容易维护,容易扩展和复用,只有这样才可以真正得到提高。写出优雅的代码真的是一种很爽的事情。UML类图也不是一学就会的,需要有一个慢慢熟练的过程。所谓学无止境,其实这才是理解面向对象的开始呢。
——程杰《大话设计模式》

 

标签:oper,numberB,运算,numberA,AHK,面向对象,result,._,AutoHotkey
From: https://blog.51cto.com/u_15408625/6228965

相关文章

  • [AHK]双击托盘区某可见程序图标以激活之(为读取微信新消息定义热键)
    检索TrayIcon对应的程序,并激活为QQ激活,自定义热键win+q,实现代码如下:(注意win10下面"QQ.exe"区分大小写才可以)#q::o:=TrayIcon_GetInfo("QQ.exe")Loop,%o.MaxIndex(){WinShow%"QQahk_classTXGuiFoundationahk_pid"o[A_Index].pidWinActivate%"QQahk_cla......
  • 第十五章:面向对象与原型
    学习要点:1.学习条件2.创建对象3.原型4.继承ECMAScript有两种开发模式:1.函数式(过程化),2.面向对象(OOP)。面向对象的语言有一个标志,那就是类的概念,而通过类可以创建任意多个具有相同属性和方法的对象。但是,ECMAScript没有类的概念,因此它的对象也与基于类的语言中的对象有所不同。......
  • [AHK]每个半小时运行一次
    更新时间:2020年2月12日22:57:14 源代码:;Fileencoding:UTF-8/*AutoHotkey版本:1.1.09.01操作系统:WindowsXP作者:sunwind脚本说明:此为脚本每隔半小时运行一次某动作。脚本版本:v1.0Timestamp:2012-12-2011:40*/#Persistent#SingleInstance,forcestart:TargetT......
  • SciTE4AutoHotkey新建文件默认编码 UTF-8 with BOM
    若SciTE4AutoHotkey,能在新建时自动选编码为 带BOM的UTF-8的就省事省心了。可通过配置SciTEGlobal.properties、SciTEUser.properties无法解决这个难题,似乎是个bug。通过菜单 工具Scite4AutoHotkeysettings...设置也只能使新建的文件编码为UTF-8NOBOM经过无数次的搜索以......
  • [ahk]让TC 识别已经打开的路径tab,若已存在则仅激活不重复打开。
    #SingleInstance,force;FileName:OpenInTC.ahk;Fileencoding:UTF-8BOM/*AutoHotkey版本:1.1.9.0操作系统:WindowsXP/Vista/7作者:sunwind设计目的:[ahk]让TC识别已经打开的路径tab,若已存在则仅激活不重复打开。设计思路:先保存当前配置,再检测其是否存......
  • 用热键win+字母激活任务栏上的按钮[ahk]
    ;bug:热键请自行修改,发现按win+dwin+l等和系统热键冲突,可以改成空格键或Capslock键+字母;Fileencoding:UTF-8AutoHotkey版本:1.0.9.1操作系统:WindowsXP脚本说明:QuicktaskswitchingwithWin+[a,b,...,z]脚本版本:v1.0Timestamp:2012-12-2014:12:56*......
  • [ahk]右键菜单打开文件所在文件夹(快捷方式也适用)
    功能:能打开文件所在路径并定位到文件上,能正确解析lnk所指文件的目录。 copypath.ahk 文件如下: #NoTrayIconClipboard=%1% openpath.ahk文件如下:#NoTrayIconClipboard=%1%Run,%"Explorer.exe/select,"Clipboard说明一:剪贴板内容被置为文件路径了。说明二:需要注册到......
  • [AHK]热键获取TC当前的路径
    原创部分:热键alt+shif+c复制当前tc窗口中的路径。#IfWinActiveahk_classTTOTAL_CMD!+c::PostMessage1075,2029,0,,ahk_classTTOTAL_CMD;复制完整路径return#IfWinActive2010年04月11日星期日17:07一故事的开始,寻找TotalCommander(以下简称TC)的快捷键--“在下已经严重鼠......
  • 用自己指定的模板创建ahk脚本
    在windows右键弹出菜单的新建菜单中加入“AutoHotkey脚本” 1.首先写好模板文件,随便保存在一个地方,比如我是“X:\AutoHotkey\AutoHotkey\SHELLNEW\Template.ahk”;2.打开注册表(regedit),找到[HKEY_CLASSES_ROOT]->[.ahk](没有的话,自己新建项.ahk);3.在[.ahk]下新建项[ShellN......
  • [ahk]获取文华财经全自动运行模组信号记录
    #Persistent#SingleInstanceForceDetectHiddenWindows,OnControl:="SysListView323"WinTitle:="全自动运行模组ahk_class#32770"WinText:="List1"ControlClick,Button26,%WinTitle% ControlGet,......