作业二:读书笔记

Posted 杨向阳

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了作业二:读书笔记相关的知识,希望对你有一定的参考价值。

这个作业属于哪个课程 软件代码开发技术
这个作业要求在哪里 作业二
这个作业的目标 学习软件设计模式和原则

一、准备工作

名称 作者 链接
《软件秘笈:设计模式那点事》(本文使用) 郑阿奇 链接
《软件设计模式》 朱洪军 链接

二、归纳总结

什么是软件设计模式?

​ 模式就是经验的总结。设计模式就是被反复使用,经过梳理总结的代码设计经验。使用设计模式的能够提高代码的可重用性,并且让程序更加安全可靠。

软件设计的分类?

​ 按目的分,设计模式可以分为创建型模式、结构型模式和行为型模式。创建型模式用来处理对象的创建过程;结构型模式用来处理类或对象组合;行为型模式用来对类或对象怎么交互和怎样分配职责进行描述。

设计模式

  • 创建型模式

    1. 工厂方法模式:定义一个创建产品对象的工厂接口,让子类决定实例化哪一种实例对那个。
    2. 抽象工厂模式:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类
    3. 建造者模式:复杂对象的创建与表示分离同样的构建过程可以创建不同的表示。
    4. 原型模式:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象
    5. 单例模式:保证一个类仅有一个实例,并提供一个访问它的全局访问点
  • 结构型模式

    1. 适配器模式:将一个类的接口转换成客户希望的另外一个接口
    2. 桥接模式:将抽象部分与它的实现部分分离,使它们都可以独立地变化
    3. 组合模式:将对象组合成树形结构以表示“部分-整体”的层次结构
    4. 装饰者模式:动态地给一个对象添加一些额外的职责
    5. 外观模式:为子系统中的一组接口提供一个一致的界面
    6. 享元模式:运用共享技术有效地支持大量细粒度的对象
    7. 代理模式:为其他对象提供一种代理以控制对这个对象的访问
  • 行为型模式

    1. 责任链模式

    2. 命令模式:将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤消的操作

    3. 解释器模式:给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子

    4. 迭代器模式:提供一种方法顺序访问一个聚合对象中各个元素, 而又不需暴露该对象的内部表示

    5. 中介者模式:用一个中介对象来封装一系列的对象交互

    6. 备忘录模式:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态

    7. 观察者模式:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被自动更新

    8. 状态模式:允许一个对象在其内部状态改变时改变它的行为

    9. 策略模式:定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换

    10. 模板方法模式:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中

    11. 访问者模式:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中

      (是书上定义)

设计模式六大原则

  1. 开-闭原则:对拓展开发,对修改关闭
  2. 单一职责原则:一个类只负责一个任务功能
  3. 依赖倒置原则:上下层不应该相互依赖,两者都应该依赖其抽象。细节依赖于抽象
  4. 接口隔离原则:接口中不存在派生类用不到却必须实现的方法
  5. 里式替换原则:使用父类的地方一定能用派生类,子类不能重写父类非抽象方法。
  6. 迪米特法则:尽量不要让实体类之间建立直接调用,最好通过其友元来建立中转关系。

三、心得体会

//结合自己曾经的软件开发实践,思考用到了哪些原则或模式?谈谈读书的心得体会。

这是leecode上得到一道题,给你一个整数数组 nums,找到峰值元素并返回其索引。数组可能包含多个峰值,在这种情况下,返回 任何一个峰值 所在位置即可。在做题的时候我没有使用辅助函数。

class Solution 
public:
    int findPeakElement(vector<int>& nums) 
    int n = nums.size();
    int l = 0, r = n - 1;
    if(n == 1||nums[0] > nums[1])
            //在峰值,直接输出
            return 0; 
        
    if(nums[r - 1] < nums[r])
            //在峰值,直接输出
            return r; 
        
    while(l < r)
        int mid = (l + r + 1) / 2;
        if(nums[mid - 1] < nums[mid] && nums[mid] > nums[mid + 1])
            //在峰值,直接输出
            return mid; 
        
        else if(nums[mid] < nums[mid + 1])
            //峰底或者上升,往右一定有峰 //在峰低往两边都行,智慧得随便选择了一遍
            l = mid;
        
        else if(nums[mid] > nums[mid + 1])
            //下降峰,往左一定有峰
            r = mid - 1;
        
    
    return -1;
    
;

通过增加一个辅助函数,让函数的目标更清晰,代码编写也变得更加简洁。每个函数的职责更加单一,符合设计模式六大原则中的单一职责原则。

class Solution 
public:
    int findPeakElement(vector<int>& nums) 
        int n = nums.size();
        // 辅助函数,输入下标 i,返回一个二元组 (0/1, nums[i])
        // 方便处理 nums[-1] 以及 nums[n] 的边界情况
        auto get = [&](int i) -> pair<int, int> 
            if (i == -1 || i == n) 
                return 0, 0;
            
            return 1, nums[i];
        ;

        int left = 0, right = n - 1, ans = -1;
        while (left <= right) 
            int mid = (left + right) / 2;
            if (get(mid - 1) < get(mid) && get(mid) > get(mid + 1)) 
                ans = mid;
                break;
            
            if (get(mid) < get(mid + 1)) 
                left = mid + 1;
            
            else 
                right = mid - 1;
            
        
        return ans;
    
;

四、博文编辑界面截图

读书笔记(十四)——作业的知识点与注意事项

1、 SQL Server 代理中包含很多的类别,有作业、警报、操作员、代理等,作业属于其中的一个类别

 

1、 用自动化数据备份来介绍作业的具体运用规则

用命令符启用sqlserveragent

②添加作业的类别,明确进行作业的任务

EXEC msdb.dbo.sp_add_category

@class = \'JOB\'--添加对象的类别,如:作业、报警

,@name = \'ct_药房管理系统_Maintain\'; ---设置类别的名字

 

③添加作业(包括名字、任务,所属的类别)

EXEC msdb.dbo.sp_add_job

@job_name = \'jb_药房管理系统_FullBackup_Weekly\' --为作业命名

,@description = \'Full Backup job for 药房管理系统every week(end).\' ---作业的任务描述,每周自动备份更新

,@category_name = \'ct_药房管理系统_Maintain\'; ---作业所属的类别

 

为作业添加具体的任务描述,就是作业计划(jobschedule

DECLARE

@StartDate INT = CONVERT(CHAR(8),GETDATE(),112)

,@EndDate INT = CONVERT(CHAR(8),DATEADD(year,1,GETDATE()),112)

,@StartTime INT = 220000;

 

EXEC msdb.dbo.sp_add_jobschedule

@job_name = \'jb_药房管理系统_FullBackup_Weekly\' --作业名字

,@name = \'jc_药房管理系统_FullBackup_Sunday2200\' ---作业计划的名字,为数据库自动每周星期日22:00备份

,@freq_type = 8 --对应每周的频率类型,具体见表格

,@freq_interval = 1 --对应星期天的频率类型,具体见表格

,@freq_recurrence_factor = 1--作业计划间隔一周

,@active_start_date = @StartDate

,@active_end_date = @EndDate

,@active_start_time = @StartTime

,@active_end_time = @StartTime;

                                                                          

                                                                                    频率类型表

                                                          

                                                                                         频率间隔表

为作业制定服务器,作业将会在sqlserveragent启用后生效

 

    EXEC msdb.dbo.sp_add_jobserver    
             @job_name = \'jb_药房管理系统_FullBackup_Weekly\'               
,@server_name =@@SERVERNAME; --默认为local服务器 ,也可以指定现有目标的服务器名称

 

⑥测试作业执行(将电脑的时间往下调整至周日)

    RESTORE HEADERONLY
         FROM jb_药房管理系统_FullBackup_Weekly

3、 邮件通知,数据库是否备份

数据的自动备份系统应该存在提示,因此就可以利用邮件来实现这一个功能,下面就介绍利用邮件通识相关人员系统是否完整备份,备份是否成功。SQL就自带有邮件通知的功能

①启用邮件

    EXEC sp_configure \'SHOW ADVANCED OPTIONS\',1;                
    RECONFIGURE;                
    EXEC sp_configure \'DATABASE MAIL XPs\';                
    EXEC sp_configure \'DATABASE MAIL XPs\',1;                
    RECONFIGURE;

②添加配置文件

EXEC msdb.dbo.sysmail_add_profile_sp                
        @profile_name = \'mp_药房管理系统_Dba\'            
        ,@description = \'Database mail profile for 药房管理系统database administrator.\';        

③添加邮件的账号

EXEC msdb.dbo.sysmail_add_account_sp                
        @account_name = \'ma_药房管理系统_Dba\'            
        ,@description = \'Database mail account for 药房管理系统database administrator.\'            
        ,@email_address = \'dba@药房管理系统.com\'            
        ,@display_name = \'药房管理系统DBA\'            
        ,@mailserver_name = \'127.0.0.1\'    ---SMTP发送地址        
        ,@mailserver_type=\'SMTP\'            
        ,@port = 25            
        ,@use_default_credentials = 1;        ---默认使用Windows验证方式

④将邮件的账号和配置文件相互关联

EXEC msdb.dbo.sysmail_add_profileaccount_sp

@profile_name = \'mp_药房管理系统_Dba\'

,@account_name = \'ma_药房管理系统_Dba\'

,@sequence_number = 1;

 

EXEC msdb.dbo.sysmail_configure_sp

    \'AccountRetryAttempts\', \'3\' ;

 

EXEC msdb.dbo.sysmail_configure_sp

    \'AccountRetryDelay\', \'5\' ;

⑤发送邮件

EXEC msdb.dbo.sp_send_dbmail                
        @profile_name = \'mp_药房管理系统_Dba\'            
        ,@recipients = \'dba@药房管理系统.com\'            
        ,@subject = \'TestMail_2\'            
        ,@body = \'Another test mail for 药房管理系统database administrator.\';            

4、 系统尽管已经通知是否备份,但是有时候系统备份也会失败,因此最好能将备分具体的情况一同发送到邮箱。系统自动备份成功与否就要有明确的判断,用四个on来判断成功还是失败的分支,看到底执行哪一个步骤。

①添加计划步骤

 

EXEC msdb.dbo.sp_add_jobstep                
    @job_name = \'jb_药房管理系统_FullBackup_Weekly\'            
    ,@step_name = \'js_药房管理系统_FullBackup\'            
    ,@step_id = 1            
    ,@database_name = \'master\'            
    ,@subsystem = \'TSQL\'            
    ,@command =             
        \'EXEC 药房管理系统.dbo.usp_BackupFull\'        
    ,@retry_attempts = 3            
    ,@retry_interval = 0            
    ,@on_success_action = 4            
    ,@on_success_step_id = 2            
    ,@on_fail_action = 4            
    ,@on_fail_step_id = 3;    
EXEC msdb.dbo.sp_add_jobstep                
    @job_name = \'jb_药房管理系统_FullBackup_Weekly\'            
    ,@step_name = \'js_药房管理系统_MailAfterFullBkOk\'            
    ,@step_id = 2            
    ,@database_name = \'master\'            
    ,@subsystem = \'TSQL\'            
    ,@command =             
        \'EXEC 药房管理系统..usp_execMailAfterBkOk;\'        
    ,@retry_attempts = 3            
    ,@retry_interval = 0;    

②发送邮件,将结果以附件的形式发送至邮箱

EXEC msdb.dbo.sp_add_jobstep                
    @job_name = \'jb_药房管理系统_FullBackup_Weekly\'            
    ,@step_name = \'js_药房管理系统_MailAfterFullBkFail\'            
    ,@step_id = 3            
    ,@database_name = \'master\'            
    ,@subsystem = \'TSQL\'            
    ,@command =             
        \'EXEC 药房管理系统..usp_MailAfterBkFail;\'        
    ,@retry_attempts = 3            
    ,@retry_interval = 0;            


    EXEC msdb.dbo.sp_send_dbmail                
        @profile_name = \'mp_药房管理系统_Dba\'            
        ,@recipients = \'dba@药房管理系统.com\'            
        ,@subject = \'TestMail_2\'            
        ,@body = \'This mail contains the query result as attach.\'    ---以附件的形式发送        
        ,@query=            
            \'SELECT TOP 100        
                    *
                FROM    
                    master.dbo.spt_values\'
        ,@attach_query_result_as_file = 1;            

 

以上是关于作业二:读书笔记的主要内容,如果未能解决你的问题,请参考以下文章

第五周读书笔记

读书笔记(十四)——作业的知识点与注意事项

算法作业13——《算法图解》读书笔记

读书笔记——软件设计原则设计模式

《我是一只IT小小鸟》读书笔记

第九周读书笔记-补充