回文、数组、三角形、公民类、Time 类、复数类、员工工资和异常练习这些小题,连起来能看到从语法到对象建模的过程。
C-sharp 这个公开仓库很朴素,里面是一组按周整理的面向对象程序设计作业。
目录里能看到判断回文数、平均数和最值、一维数组、三角形类、公民类、Time 类、点和直线、复数类、员工工资、宠物类、异常练习等题目。
公开仓库在这里:
https://github.com/GitLaughs/C-sharp这类仓库看起来很零散,但放在一起看,能看出这门课是怎么一周一周加难度的:先是输入输出和条件判断,再到数组、循环、类、对象、静态字段、重载、继承、多态和异常。
课程作业如果只按“第几周交什么”保存,很快就会变成硬盘里的历史文件。换个角度看,它也能串成一张学习路线图。
小题目不小
刚开始学 C# 或面向对象时,最容易低估小题目。
判断回文数、计算平均数、字符串输入输出,看起来只是语法练习。不过这些题目训练的是最基本的程序控制能力:
- 数据从哪里来。
- 类型如何转换。
- 分支条件怎么写。
- 循环什么时候停止。
- 输出结果如何被验证。
这些能力没有打牢,后面写类和对象时会更乱。因为面向对象并不会替你解决基础流程问题,它只是提供另一种组织程序的方式。
所以基础题也在练语法之外的东西:把一段程序从输入、处理到输出完整跑通。
从数组开始理解数据集合
第五周一类题目通常会进入数组、循环应用、天数计算、三角形类、公民类。这里开始出现一个变化:程序不再只处理一个数字或一行文本,而是处理一组数据,或者一个带有多个属性的对象。
数组题会让人意识到,很多问题不是“算一个值”就结束,还要遍历一组值并维护状态。比如最大值、最小值、平均数,背后都有同一套模式:
初始化状态 -> 遍历数据 -> 更新状态 -> 输出结果类题则让人开始区分“数据本身”和“围绕数据的操作”。三角形不能一直当成三个散落的数字处理,公民信息也不能只写成几行字符串。写成类以后,属性、构造、校验和行为才有地方放在一起。
到这里,面向对象课程才开始有感觉。
类不是语法包装
很多初学者第一次写类时,只是把变量搬进 class 里,再写几个 get/set。这样虽然满足形式要求,但还没有理解对象建模。
像 Time 类、点和直线、复数类这些题目更适合练“对象应该承担什么责任”。
Time 类要处理小时、分钟、秒的范围和格式化输出;点和直线要处理坐标、距离或斜率;复数类要处理实部、虚部以及加减乘除。它们共同的问题是:
- 构造时要不要校验?
- 属性能不能被随意改?
- 方法应该返回新对象还是修改自己?
- 输出字符串是否应该和内部表示分开?
- 范围条件应该在哪里处理?
这些问题处理清楚了,class 才像是在建模,而不是单纯装变量。
如果课程作业能在 README 或注释里记录这些取舍,后面回看时就不会只剩题解,还能看出当时怎么练对象建模。
重载和静态字段是设计信号
方法重载和静态字段经常被当成语法点讲,但它们背后有设计含义。
重载说明同一个概念可以接受不同输入形式。比如构造一个对象时,可以从默认设置开始,也可以从完整参数开始。它让接口更贴近调用者,但也要求不同重载之间行为一致,不能每个重载都像独立函数。
静态字段则说明某些信息属于类型本身,不归某个实例独占。比如对象计数、共享配置、统一常量,都可能用到静态成员。它方便,但也容易让状态变得隐蔽。
课程小题里练这些特性,比在大项目里第一次遇到问题要温和得多。小题目允许你犯错,也方便重写。
继承题要先问关系是否成立
第九周一类题目通常会有员工工资、优秀教师学生、宠物类、汽车、包裹投递等对象关系题。
这时最容易出现一个误区:看到多个类,就想立刻继承。
继承要先看它们是不是同一类东西,字段重复只能算一个提醒,不能直接当理由。学生、教师、员工、宠物、汽车这些题目都可以练这个判断:
- 哪些属性是共同抽象?
- 哪些行为可以放在基类?
- 哪些只是组合关系?
- 子类是否真的能替代父类使用?
- 多态调用时会不会让逻辑更清楚?
刚学的时候,最容易把名词都写成类,或者一看到重复字段就抽父类。后来回头看,这反而是继承题最该练的地方。
异常练习是工程意识的入口
异常练习通常出现在后面,因为它要求你承认程序会失败。
输入可能不合法,文件可能打不开,计算可能越界,对象状态可能不完整。基础题里这些问题可以被忽略,但真实程序里不行。
异常处理要先明确几件事:
- 哪些错误应该提前校验。
- 哪些错误应该抛给调用者。
- 哪些错误可以恢复。
- 错误信息应该如何帮助定位问题。
- 测试里是否覆盖失败路径。
这也是课程作业从“能跑”走向“可靠”的一步。
仓库可以比作业本更有用
如果一个课程仓库只是把每周文件丢进去,课程结束以后很快就没人再看。更好的整理方式是把它变成学习路线:
- README 列出每周主题和对应知识点。
- 每个题目说明训练目标,别只写题目名。
- 对典型 bug 记录修复思路。
- 对重写过的题目保留前后差异。
- 把相似题目串成概念线,例如“类封装线”“继承线”“异常线”。
这样整理不是给作业硬套一个大项目外壳。它更像一份索引,方便以后翻回来时,马上知道自己当时学到哪一步。
为什么它适合写进博客
很多学习记录不需要等到项目很大才需要记录。
像这个 C# 作业仓库,单个题目可能很小,但组合起来就是一条学习曲线。把它写成博客,可以记录三个层面的东西:
- 当时学了哪些语法和概念。
- 哪些题目第一次迫使自己做对象建模。
- 哪些错误暴露了工程意识不足。
只把代码放到 GitHub 上,后来再看往往只知道自己写过这些题。多写几句回看,至少能记住当时为什么那样写,下一次哪里可以改。
小作业也能看出学习路线
课程作业最容易被低估,因为它们看起来太普通。不过普通题目恰好适合记录学习过程:语法、数组、类、静态成员、重载、继承、多态、异常,一步一步都能在小题里看见。
整理这些作业,不用证明当时写得多好。更实际的用处,是以后还能顺着这条线找回自己的学习过程。
对我来说,这类仓库最有用的地方是:它把“我学过这门课”变成了“我能回看自己当时怎么理解编程”。
继续读