Previously on OOP:
Operandclass in expr package stores an attribute“value”of type double. AndOperatorclass stores two attributes of type Expression and the operational symbol, for instance,“+”and“*”.
编写一个main函数来检验OperandandOperatorclass的功能。
第一部分是创建Operand类的实例的例子,第二部分是创建Operator类的实例的例子,本黄鸭相信各位宝宝们应该都没有问题。
第三部分也是一个Operator类的实例,但是constructor里面传递的第一个参数是Operator类型的,第二个参数是Operand类型的。这种做法是被允许的,因为OperatorandOperator都是Expression类的子类。在evaluatestar的时候,会做plus.evaluate() *five.evaluate(),乘号前面的部分会先计算出表达式plus的值。这种做法相当于先做“2+3”,再把结果乘以5。
创建一个存放Operand数据类型的数组,名称是values。本黄鸭又要再次强调一遍,数组里面存放的元素类型只能是primitive type or object references。Operand类不属于primitive type,所以values数组里面的元素都是Operand类型的object references。
values数组的初始化能如上段代码所示,写在等号右边的大括号中。需要注意的是,大括号中列举的是数组的元素,所以中间用逗号间隔,而不是表示语句结束的分号。在大括号的后面,声明数组的语句结束,使用分号间隔。
接下来,我们可以使用for each statement遍历values数组,并且打印所有的元素。用红色的一行代码把values数组中的元素排序,再打印一遍排好序的数组。在红色的那行代码中,有几个comments:
(1)sort()函数是Arrays中的一个已经定义好的static function。这里不需要import java.util package,这是因为这里使用了此package的fully qualified name。
(2)实现排序的前提条件是Operand类的实例之间能够比较,有一种已经定义好的比较方式,所以Operand类implements Comparable interface,并且overridden了里面的比较函数。除了Comparable interface,使用Comparator等其他含有比较的类也是完全可以的。
有一个经典的事情是编程的时候应该采用top-down的方式,即自上而下的方式,也就是从最高层的requirements开始思考,然后不断地补充细节的功能。
与之相对的,是bottom-up的思维模式,即自下而上的,也就是从细节开始做起,最后才搭建成一个可以实现user requirements的程序。在编程中,这种思维方式比较少。
在考试中,top-down的思维模式体会在从main facade开始编写,或者是从main函数的功能开始思考。先Start from an example,然后write an exampleandadd relevant class to make the example work。接着就编译,一般都会有编译错误,因为会缺少一些辅助的类和功能,此时click the errors, and Eclipse can automatically create new classes & new constructors。
有一个难点是判断什么时候需要使用common base class,即inheritance。比如,在expr package的例子中,Operand and Operator就有commonparentclass,这是因为我们认为操作数和操作符都是表达式的组成部分。
在后面的例子中,本黄鸭会尽量地推广top-down的思维模式。
欢迎使用本黄鸭编写的小程序~
微信公众号二维码:
领取专属 10元无门槛券
私享最新 技术干货