《面向对象编程学习的BLOG1》

               《面向对象编程学习的BLOG1                                                                                                                                   

前言

   Blog基于南昌航空大学软件工程专业“面对对象编程”笔者的收获所写,内容大体关于配套的PTA题集,收获以及笔记等(btw可能很无聊),辛苦批改的同学可以直接翻到下划线后面的正文部分.

      

          在七个星期的学习中慢慢地进入了解“面向对象编程”,在开课一段时间内对于这门科目的叫法,我都是叫它java课的,这样的称呼就好像狗蛋麻子一样,带着亲切感,所以当课程跳过语法开始真正的教设计的时候,我的表情是这样的:

        

        就,好像和想的不太一样啊?

        罢特!在老师猛烈又耐心一顿输出下,我也慢慢意识到了原来有的名字并不只是为了好听,这门课程的形象也突然就高大了起来.开始写BLOG的时候我有点担心第一次分享会不会没有什么好写的,真正开始的我才意识到可以写的东西很多,开课的时候老师说java没有什么难的,学校里所有年纪大一点的老师java全都是自学的。这无疑给我的学习增加了一点信心.进入正题,前方高能,无关人员速速跑路.

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------

 

 

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------

<笔记整理>

              <代码质量优化>

          本学期老师第一句点评是以一句“你们写的那叫垃圾代码开始的”.这个学期初刚刚完成C语言的课程设计,在整个过程中暴露了很多问题,说起代码质量,脑子里会冒出很多词,但我觉得,代码质量总结起来就两个:好看和好用,可维护性,代码健壮性。可读性好,耦合度低,命名风格清晰易懂等.

          “解耦”.这个词贯穿了前前几周的课程.耦合度高意味着代码之间的依附性强,可迁移性差,为了解决这个问题引出了SRP,即单一职责原则,代码设计的过程中要遵循的七大设计原则之一,耦合度有关的类间关系,如何正确地选择关系

          

 

       耦合度,这一个词同样应用在课堂的练习中雨刷示例中利用Driver类来实现一个中介的作用以降低耦合度.

    

           七大设计原则中我们重点介绍的是单一职责原则和迪米特法则.

           迪米特(Law of Demeter)又叫作最少知识原则(The Least Knowledge Principle )和朋友通信,不和陌生人说话,通过在一个类里面尽可能少的了解其他类,从而降低依赖性,同样减少了耦合度。

    之后讲了怎么进行性能测试包括黑盒白盒,怎么设置测试用例,包括单缺陷测试边界值测试等等。

     

       

       

      总结:

  通过以上的原则和基准,在设计的时候能最大程度避免代码的过度耦合,从而提高代码的独立性,比如雨刷的driver类,通过一个类去代理,使其他的类职责更为单一,同样减少了类之间的交流,像这样的技术都是需要去熟练并掌握的。

---------------------------------------------------------------------

<题目总结>

       迄今为止,一共上交了三个题目集还有一次实验。

  实验1不是很难,主要是关于记事本的运行,错误代码的修改等等.

       大致修改如下:

 

    PTA题目集01,整体的题目量较大但题目整体难度我个人认为还是偏简单的,整体知识点考察侧重于Java教材的前八章内容也就是大学mooc上面的语法内容,题目包括判断三角形类型,学号识别等等,其中大部分的内容在 C语言中已经做过,这里就不做过多赘述,要注意的点比如double和float的选用问题,单纯的过度使用double类型容易导致误差,这在第2题中有很好的展示,另外的话第七题的位置,要求判断三角形,由于我是取巧用了平方,跳过了sqrt,这也会导致一定的误差,如果调用sqrt计算长度有时会有误差无法保留根号,所以改用 

if((Math.abs(z*z-x*x-y*y)<0.001)||(Math.abs(x*x-y*y-z*z)<0.001)||(Math.abs(y*y-x*x-z*z)<0.001())。

 

    PTA题目集02,只有三道题,题目量较小但第二题的难度不算简单,重点在于怎么理解什么叫做基校验,什么叫做偶校验,题目如下:

  7-2 串口字符解析 (50 分)

  在异步通信模式下,串口可以一次发送5~8位数据,收发双方之间没有数据发送时线路维持高电平,相当于接收方持续收到数据“1”(称为空闲位),发送方有数据发送时,会在有效数据(5~8位,具体位数由通信双方提前设置)前加上1位起始位“0”,在有效数据之后加上1位可选的奇偶校验位和1位结束位“1”。

  而第三题7-3 String的格式判断与内容提取 (30 分),主要是在字符串里面筛选排除掉不需要的数据,理清楚题目即可。

  PTA题目集03,该题目集只有4道题但整体的难度个人角度还是认为较大,后面三道题目都是日期内的设计。

  7-2 日期类设计 (30 分) 

  7-3 日期问题面向对象设计(聚合一) (30 分)

  7-4 日期问题面向对象设计(聚合二) (30 分)

  三道题目,虽然题目一样,但是要求不一样,可以说从这道题开始,内容就不只是单单局限于Java的语法,而是真真正正的开始面向对象,三道题目是会使用不同的类,不同的类会带来不一样的耦合度,通过这样的设计能充分理解到。不同的类之间的聚合方式不同所带来的影响,设计的时候要考虑清楚类和类之间是怎么进行信息交流,在。浏览csdn相关算法的时候,有注意到有一些同学选择是一天一天的暴力递增,不是太可取,此外的话。也要注意不同类之间的属性,public跟private,要对类的概念更深入于心等等。

      <设计思路>

      PTA题目集02 7-2 串口字符解析 (50 分)

      首先对于输入的字符串长度进行统计,同时对字符串的内容进行判断.

      若数据不足11位或者输入数据全1没有起始位,则输出"null data"

      输入数据不足11位。例如:111101,输出null data,而如果输入数据全1没有起始位,则也输出null data

  此时如果数据不是全1无起始位或者不足11位,则从第一个起始位零开始操作,同样如果后面是全1无起始位或者不足11位,输出null data,此外就开始基校验和        结束符判定,如果出现偶数个1,那么就要进行奇检,判断第i+10位是不是位1,如果出现奇数个1,那么就要进行偶校验,若某个数据的结束符不为1,则输出          “validate error”。若某个数据奇偶校验错误,则输出“parity check error”。若数据结束符和奇偶校验均不合格

      例如:111000000000000011100000000000000输出“validate error”

 

代码如下:

       import java.util.Scanner;

public class Main{

    public static void main(String[] args) {

        Scanner szy = new Scanner(System.in);

    String eqn;

         eqn=szy.nextLine();

         int flag=0;

if(eqn.length()<11) {

System.out.print("null data");

            return;

}

        //若某个数据的结束符不为1,则输出“validate error”。 若某个数据奇偶校验错误,则输出“parity check error”

  for(int j=0;j<eqn.length();j++){//读取    

            if(eqn.charAt(j)=='0')

               flag++;

          }

        if(flag==0) {

System.out.print("null data");

            return;

}

int left = 0,num = 1;

int  parity = 0,validate = 0;

for(left = 0;left<eqn.length()-10;left++)

 {

if(eqn.charAt(left)=='0') {

System.out.print(num+":");

num++;

if(eqn.charAt(left+10)=='0') {

validate = 0;//判断结束符

}

else {

validate = 1;

 int sum = 0;

for(int i=left+1;i<left+9;i++) {

if(eqn.charAt(i)=='1') {

sum++;

}

}

                 if(sum%2==0) {

if(eqn.charAt(left+9)=='1')

                        {

parity = 1;

}

                        else

                        {

parity = 0;

}

               }

                    else {

if(eqn.charAt(left+9)=='0')

                        {

parity = 1;

}

                        else

                        {

parity = 0;

}

}

}

if(validate==0)

{

System.out.println("validate error");

}

else {

if(parity!=0)

{

   for(int i=left+1;i<left+9;i++)

{

System.out.print(eqn.charAt(i));

    }

System.out.print("\n");

 

}

else

{

                        System.out.println("parity check error");

}

}

left+=10;

}

 

}

}

}

        PTA题目集03 7-2 日期类设计 (30 分)

        设计一个类DateUtil,该类有三个私有属性year、month、day(均为整型数),其中,year∈[1820,2020] ,month∈[1,12] ,day∈[1,31]

        带有下列方法

 public boolean checkInputValidity();//检测输入的年、月、日是否合法

 public boolean isLeapYear(int year);//判断year是否为闰年

public DateUtil getNextNDays(int n);//取得year-month-day的下n天日期

 public DateUtil getPreviousNDays(int n);//取得year-month-day的前n天日期

 public boolean compareDates(DateUtil date);//比较当前日期与date的大小(先后)

 public boolean equalTwoDates(DateUtil date);//判断两个日期是否相等

 public int getDaysofDates(DateUtil date);//求当前日期与date之间相差的天数

public String showDate();//以“year-month-day”格式返回日期值

代码太长就不放了ovo

本题方法很多,代码量较大,应该避免重复调用.这里我用了一个代理类来简化类之间的大量传递.

 public  DateUtil(DateUtil ignoredNewone) {

        this.year = ignoredNewone.getYear();

        this.month = ignoredNewone.getMonth();

        this.day = ignoredNewone.getDay();

    }

 

 

7-3 日期问题面向对象设计(聚合一) (30 分)

 

          聚合方式不同,本题通过把所有对象的行为放在同一个类里,降低了代码的耦合性,对比题目二中。day类里面有month,month里面有year,这样的方式就更显得比较好,行为被区分开来,耦合度也有所降低.

 

7-4 日期问题面向对象设计(聚合二) (30 分)

 

               第四题的聚合方法又区分于前两题,他将整个方法大部分都放置在主类,这样的方式和第3种的区别还是有的,第3种是将相关的行为都放置在每一个类里,这样的好处比如有看起来比较明晰,而第4种将大多数集中在主内。使得不同类之间只有值在传递,第四题的聚合方法又区分于前两题,他将整个方法大部分都放置在主类,这样的方式和第3种的区别还是有的,第3种是将相关的行为都放置在每一个类里,这样的好处比如有看起来比较明晰,使得不同类之间只有值在传递,满足了单一职责原则和迪米特法则,更好的降低了耦合度.

 

------------------------------------------------------------------------------------------------------------------------------

<改进建议>

         在设计的时候不要过于盲目,有的时候要先考虑清楚什么样的算法适合什么样的题目,比如在日期内设计这道题目中单纯的每日累加就很不适合同时也要注意一下类和类之间的聚合方式可以明显的感觉到聚合方式所带来的耦合度对于代码质量的差距,对于最后一题来说是。侧重于主类的聚合方式,就课堂上来说,这其实也和雨伞的道题目的代理driver类有异曲同工之妙,这就产生了很强的借鉴意义,提醒我们在类设计的时候应该把它尽可能的职责分开,不要过分依赖, 而同时也要注意一些书写的问题,在上课的时候,老师就有强调一些命名的法则,比如驼峰表示法,包括父类继承时的@override等等等等,从个人角度,我觉得我的书写还是急需改善的,另外还有一些小细节方面 急需改正比如7-3中对于非法数据的判断如何更合理等等,这些都是需要改进的。

 --------------------------------------------------------------------------------------------------------------------------------

<总结>

在几个礼拜的学习中已经开始慢慢接触到面对对象真正的含义还有效率,优化算法,耦合等等,这漫长的过程,很多习惯都是日积月累,推到,重复,再推倒再重复,以我现在的水平,还很难完成一些更高水准的任务,这也就对自己平时的学习提出了更高的要求,随着课程慢慢深入,题目肯定会变得越来越难,如何让自己保持进度,学好这门学科也就成了当前一个重大任务,脚踏实地,眼望前方,flag没有意义,加油,好好学

 

 

posted @ 2022-04-11 11:38  FE304  阅读(88)  评论(0)    收藏  举报