软件构造lab2感悟

首先,任务的理解至关重要,要求实现接口,并使用泛型,

接口:只定义了没有实现的方法;

实现类:实现接口的所有方法。

泛型:方便程序拓展

第一个边的实现比较简单,只需要一个Edge单元,包含源点,目标点,权重,无规则的单向链表。

第二种点的实现,编写时遇到了很多次问题,首先是点需要包含源点,目标点,权重,但是他们有很大区别,vetex的封装性更好,意味着所有在点中的信息都不能直接访问,,必须写在vetex类中调用方法。

可以有两种结构,一种是顶点set+链表+自己定义的edge,另一种是map(目标点,权重),第二种的结构更加严格,必须明确存在的点都作为源点,map中是目标点,如果一条边a->b,虽然b不是源点,也要把b加入到vetexs中,只不过map为空。

这道题最大的亮点是set函数,包含非常多的功能,删除已存在的边,修改边权重,添加新的边,还要注意点的添加不能重复。

接口也是可复用性的体现,良好的编程策略是从高层到低层建设,先要具有大局思维,思考比蛮干更加重要,而良好的编程策略和习惯更加重要,一开始大家都会走弯路,但是你放弃了坚持,也就放弃了因为痛苦而成长的机会。要不是发现顶点表实现的困难性也就不会意识到良好的数据结构是那么的重要,打个比方,完成一个任务如果花费的时间不一样的话,你做的更加的慢其实也是退步,因为同一间事情的逻辑是一样的,就好像一个封装一样,都是工具罢了,在动手编程的时候考虑信息的存储形式是非常重要的,直接决定了工程量的大小,而在这次实验中,我发现封装之后虽然更加的安全但是灵活性下降了很多,做好安全性和性能的平衡非常重要。但是有一点毫无疑问,就是自己做的封装单元的元素越好,最好不要包含复杂的数据结构,要是边的集合的话,只需要实现每条边的基本类型int,L即可,在内部访问点的时候也非常的方便,但是如果是点,内部有复杂的结构,我用的是图加上L,源点的名字,以及目标点,长度,既然封装好了那么都不能直接在concreteVetex中访问,极大的降低了灵活性,总的来说,也就是SET,MAP一些复杂的工具本身就是为了简化,把它作为基本的类型时至少确保方法实现的功能比较强大,这样才不会浪费它了灵活性,如果把他封装起来就像是让世界冠军在偏远地区小学当体育老师一样,不能发挥它的特长也付出了很大的代价来留住它。

 

posted @ 2022-05-25 22:39  dawang3  阅读(40)  评论(0)    收藏  举报