aardio 模块化管理

今天学习aardio的模块化设计,感觉就像在用积木搭建程序世界,每个模块都是独立的功能块,组合起来就能实现复杂功能。这种将大问题拆分成小模块的思路,让编程变得清晰又有趣。

一、模块的创建与基础使用

(一)初次尝试模块编写

试着写了个数学工具模块,把加法和减法封装在一起,将文件保存在用户库里:

aardio 复制代码
// mathUtils.aardio文件内容
namespace mathUtils{
    class category{
        add=function(a,b){ return a + b; }
        subtract=function(a,b){ return a - b; }
    }
}

主程序里用import引入后,像这样调用:

aardio 复制代码
import mathUtils;
import console;
var calc = mathUtils.category();
console.log(calc.add(2,4)); // 输出6
console.log(calc.subtract(5,3)); // 输出2

console.pause();

第一次体会到模块的好处:把常用功能单独放一个文件,主程序只需要关注逻辑流程,代码一下子清爽了很多。就像把不同形状的积木分类存放,用的时候直接拿出来就行。

(二)模块的结构理解

这里的namespace就像模块的"名字空间",把相关的类和函数装在一起,避免命名冲突。class里的方法就是具体的功能实现,调用时要先创建类的实例,比如mathUtils.category()

二、模块间的依赖管理

(一)复杂模块的依赖实践

尝试写了一个依赖数学模块的乘法功能:

aardio 复制代码
// advancedMath.aardio
namespace advancedMath{
	import console;
    class multiplication{
        multiply = function(a,b){
            
            import mathUtils; // 在方法内引入依赖模块
            var add = mathUtils.category().add;
            var result = 0;
            for(i=1; b; 1){
                result = add(result,a);
            }
            return result;
        }
    }
}

主程序测试时发现,虽然乘法是通过重复加法实现的,但因为封装在模块里,调用时完全不用关心内部细节:

aardio 复制代码
import advancedMath;

console.log(advancedMath.multiplication().multiply(5,3)); // 输出15

console.pause();

三、模块的封装与接口设计

(一)用户管理模块的封装练习

写了一个用户管理模块,把用户数据存在模块内部,只暴露添加用户和获取数量的接口:

aardio 复制代码
// userManager.aardio
namespace userManager{
	import console;
    var users = {}; // 模块内部数据,外部不能直接访问
    class userManagers{
        addUser = function(name){ ..table.push(users,name); }
        getUserCount = function(){ return #users; }
    }
}

主程序只能通过这两个方法操作数据:

aardio 复制代码
import userManager;
var manager = userManager.userManagers();
manager.addUser("Alice");
manager.addUser("Bob");
console.log(manager.getUserCount()); // 输出2

console.pause();

(二)封装的意义

这种设计就像给积木盒加了盖子,只留几个开口让你拿积木。模块内部的users数组被隐藏起来了,外部只能通过addUsergetUserCount这两个"接口"操作数据,这样既安全又不会让使用者混乱。

四、综合练习:文件工具模块开发

(一)题目要求

创建fileUtils模块,实现计算文件行数和读取内容的功能,在主程序中测试。

(二)代码实现

aardio 复制代码
// fileUtils.aardio
import fsys.file;
namespace fileUtils{
    class fileUtil{
        countLines = function(filePath){
            var file = ..fsys.file(filePath, "r");
            if(!file) return 0;
            var lineCount = 0;
            while(true){
                if(!file.read()) break;
                lineCount++;
            }
            file.close();
            return lineCount;
        }
        
        readFirstLines = function(filePath, lineCount){
            var file = ..fsys.file(filePath, "r");
            if(!file) return {};
            var lines = {};
            for(i=1; lineCount; 1){
                var line = file.read();
                if(!line) break;
                ..table.push(lines, line);
            }
            file.close();
            return lines;
        }
    }
}


// 主程序测试
import fileUtils;
var filePath = "D:/test.txt"; // 替换为实际文件路径
var fileTool = fileUtils.fileUtil();
console.log("文件行数: " + fileTool.countLines(filePath));

var first3Lines = fileTool.readFirstLines(filePath, 3);
for(i=1; #first3Lines; 1){
    console.log("第" + i + "行: " + first3Lines[i]);
}

五、总结

  1. 模块的核心价值:把大程序拆成小功能块,每个模块只做一件事,就像积木各有形状,组合起来功能强大。
  2. 关键知识点
    • namespace用于定义模块边界,避免命名冲突
    • 封装时隐藏内部数据,只暴露必要接口,保证模块安全
  3. 实践感悟 :模块化设计不仅让代码更整洁,还能提高复用性。比如今天写的mathUtils模块,以后做其他计算时都可以直接用。
相关推荐
Moonbit8 小时前
双周报Vlo.74:用于表示错误的 ! 语法被替换为关键字 raise、错误多态支持:高阶函数现可接受带错误的回调
编程语言
大熊猫侯佩17 小时前
Swift 5.9 中 if 与 switch 语句简洁新语法让撸码更带劲
swift·编程语言·apple
用户0595661192093 天前
深入理解Spring Boot框架:从基础到实践
java·spring·编程语言
whysqwhw3 天前
PlantUML 全面指南
编程语言
whysqwhw3 天前
ASCII图表及工具
编程语言
Mirageef4 天前
aardio 继承与多态
编程语言
大熊猫侯佩5 天前
Swift 中强大的 Key Paths(键路径)机制趣谈(下)
swift·编程语言·apple
Mirageef5 天前
aardio 类与对象基础
编程语言
Mirageef7 天前
aardio 自动识别验证码输入
编程语言