面向对象编程(Object Oriented Programming)概念总结及延伸(一)

程序员的纯文本日志实践:programming.log 工作流 编程日志(programming log)是一种面向开发者思维过程的技术记录方式,其核心在于用最简化的纯文本格式,实现低认知负荷、高可追溯性的技术反思与知识沉淀。它基于时间线性结构而非标签分类,依托 Unix 工具链(grep/vim/git)达成零依赖、抗格式腐烂、跨平台一致的工程可靠性。相比传统笔记工具,它更强调‘记录即思考’的即时性与真实性,天然适配调试复盘、架构决策、代码审查等高频开发场景。作为 developer journal 的轻量级实现,它不替代文档系统,而是补全了从代码提交到思维留痕之间的 阅读详情

1.介绍

    笔者的梦想是成为一个架构师,但是要成为一个合格的架构师是相当不易的,它既需要丰富的项目经验也需要不断地吸取新的知识,而且在这过程中我们也要不断巩固基础知识。我也注意到了,现在主流的文章大都集中到了新技术新的框架的学习,大家对于最新的技术都怀有无比好奇的学习态度,这点是好的,可是只是一味站在高层学习而忽略了最本质的知识,这是不好的,所以笔者在吸取了很多教训之后决定写此篇文章总结自己对面向对象知识的学习。

    另外,需要提出的一点是,现在的开发大多基于框架或者现有类库,因为开发人员要在很短的时间内完成开发任务,而且对于开发人员的培训来说,课题也主要集中在了框架的学习上而忽略了基础,我觉得这点不是很好,尤其是对想成为出色架构师的人而言。而如果当他们过渡到了软件架构师的职位后,虽然职称变了,以前遗留下来对于基础知识以及架构知识的真空将成为架构高质量软件的瓶颈。

    笔者本人也是无一例外的成为主流趋势下的受害者,荒废了多年的基础,今天要痛定思过之后总结面向对象的基础知识,希望大家能帮助我完善,在这先谢谢大家了。

2.背景

    我们大家或多或少都应该有这么个经验,作为新手时我们常常挣扎于理解一个新概念的准确定义,而对于有相关经验的人他们则能够很好地了解这些概念的意思,它的用途是什么。作为曾经不明白它意义的人之一,曾经的煎熬历历在目,其中的痛苦真是不言而喻。上面的道理到了软件架构也无一例外的相似,例如:当你作为架构师开始设计自己第一个系统的时候,各方面的盲点一下子涌现了出来,这其中的痛苦真的令人很沮丧,你将应用所有你学过的知识去尽力完善设计,例如:以前的经验告诉你每个类都要为其定义接口。总之,这只能是一个痛苦的过程。还有可能有人会嘲笑你设计的系统是错误的,然后你根据建议又进入了再学习的过程。在这过程中你思考了很多也读了很多资料,在不断的挫折中为以前荒废的基础还债。我希望本文能作为一个启发式的文章,让大家加深对基础的学习,为以后的工作开个好头。

3.主要内容

3.1 什么是软件架构

      软件架构可以被定义为以下准则:

    (1)将问题和系统划分为相互独立的不同部分

    (2)创建上述独立部分之间的接口的技术

    (3)管理全局的结构和流程的技术

    (4)为系统和运行环境定义接口的技术

    (5)能合理的使用开发和产品发布的工具、技术和方法

3.2 为什么架构这么重要?

        软件架构的主要目的是为系统和环境定义非功能需求。详细设计是在系统功能按照架构准则划分后才开始的。架构很重要,因为好的架构具备以下特点:

    (1)控制复杂度

    (2)强调使用最佳实践

    (3)要求系统的一致性和统一性

    (4)为项目增加可预见性

    (5)强调重用性

3.3 什么是面向对象编程(OOP)?

        OOP是一个设计哲学。它代表面向对象编程(Object Oriented Programming)。OOP使用与过程编程语言(C语言、Pascal等)不同类型的编程语言。OOP中的单位是对象(Object),通过使用面向对象的编程理念我们获得了可重用性。

        为了清晰地了解面向对象的概念,让我们举个简单的例子把,例如你的手,手就是一个对象。你拥有两中类型的手:左手和右手,它们的主要功能是由从你肩部的电信号进行管理和控制的,在这里肩部就是一个接口,身体通过这个接口和你的手进行交互。手就是一个类,通过轻微改动类中的属性(左和右)就可以达到了手这个类的重用。

3.4 什么是对象(Object)?

        一个对象可以被认为是一个事物,它可以展开一些列相关的活动。对象可以展开的活动定义了对象的行为。例如:手可以抓东西,学生可以给出自己的姓名和年龄。

       在纯面向对象中,一个对象被定义为一个类的实例。

3.5 什么是类(Class)?

        一个类可以简单的代表一种类型的对象。它是一个描述对象细节的蓝本/模板,而对象是创建类的蓝本/模板。类包含三个部分:类名、属性和操作,如下图所示:

图1:类的组成

        类在代码中的编写可以是这样:

        public class Student

        {

            //属性和操作

        }

        在下面给出的代码中,我们可以说对象oStudent是由类Student创建的。

        Student oStudent = new Student();

        在现实世界中,你会发现很多单独的对象其实都是一类的。例如:世界上有很多的自行车,但它们都是同样的制造和模型。每个自行车都是由同一个蓝本创建的。在面向对向中,我们认为自行车是自行车类的实例。

        在软件世界中,虽然你可能没有意识到,但是你已经在使用类了。例如,TextBox控件就是产生于TextBox这个类,它定义了外观和功能。每次你通过VS将TextBox拖拽到设计器中你就已经在创建一个TextBox的实例了。

3.6 怎样识别和设计类?

        这是一门艺术。每个设计师都用不同的技术识别类。然而通过面向对象设计原则,有5个原则应该在设计一个类的过程中参考:

       (1)SRP-The Single Responsibility Principle(单独职责原则)-

             一个类应该有且只有一个理由去改变。

       (2)OCP-The Open Closed Principle(开闭原则)-

             一个类应该可以在不修改的前提下扩展类的行为。

        (3)LSP-The LisKov Substitutable Principle(LisKov可替换原则)-   

            子类型必须能够替换掉它们的基类型,即子类需要具备父类所有的属性和行为  

        (4)DIP-The Dependency Inversion Principle-

            应该依赖与抽象而不是具体。

        (5)ISP-The Interface Segregation Principle-

            为客户端定义合适粒度的接口

        同时,为了正确地识别出类,你需要将系统功能分解为一个树状,对于这棵树,你需要识别出达到不可再分的叶子级别功能,然后你可以将各个功能进行分组,分组后就形成了类,记住,类必须将包含的是相同类型的功能和操作。然而一个定义良好的类必须是个有意义的功能集合,而且应该指出可重用性,尤其是对系统要求可维护性和可扩展性很高的情况下。

        在软件世界中,有个概念叫做分治(dividing and conquering)经常被推荐,如果你在初始分析一个系统,你将发现很难去组织,所以最好的方式是首先将系统进行模块化划分,然后对每个模块单独进行深层分析,进而识别出类,这就是分治的核心思想。

        一个软件系统可能由很多类组成。但对于任何情形,对于这些类都应该进行良好的组织。设想一下一个很大的机构,它们的员工有上千人(在这里我们假设一个员工就是一个类),为了有效地管理劳动力,你需要指定合理的管理策略。对于软件,管理策略也是必须的,为了管理软件系统的类,降低复杂性,软件设计者将这些策略分为以下四种:封装(Encapsulation)、抽象(Abstraction)、继承(Inheritance)和多态(Polymorphism),这四个概念是面向对象编程的主要准则。

   3.7 什么是封装(或者信息隐藏)?

        封装的含义是是隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读和修改的访问级别。对于一个封装的程序对象而言,它包含了实现自身功能的所有资源(数据和方法)。在OOP中,类通过暴露公有(public)方法或者属性实现封装的,这个类就像一个容器或者胶囊,它封装了方法和属性的细节,外部只用知道方法和属性的接口即可,通过封装我们可以对类内部的实现细节进行修改而会影像整个系统。总而言之,封装就是隐藏了怎么做,调用者只要知道它能做什么就行。

 图2 从类外部看封装

 

        为了可以模块化/定义一个类的功能,这个类可以使用其它的类暴露的方法和属性,调用的方式可以有很多种形式,在面向对象编程中,有一些技术对于类之间互相连接,它们的名字是:关联(Association)、聚合(Aggregation)和组合(Composition)。

        封装还有很多其它用途,例如我们经常使用的接口,接口可以用来隐藏一个类的实现信息。其实这也是种封装,如下所示:

        IStudent oStudent = new LocalStudent();

        IStudent oStudent = new ForeignStudent();

        根据上边的例子(我们假设LoaclStudent和ForeignStudent实现了IStudent这个接口),我们可以看到接口隐藏了它们的实现细节。

3.8 什么是关联(Association)?

        关联对于两个类而言是一种“a”的关系,简单说,当一个对象通过对另一个对象的引用去使用另一个对象的服务或者操作时,两个对象就互相关联了。关联是两个类关系中很普遍的定义,聚合和组合相对来说比较特殊。

       public class StudentRegisterar

       {

              public StudentRegisterar()

              {

                      new RecordManager().Initialize();

              }

       }

        如上边的例子,我们可以说类StudentRegisterar和类RecordManager互相关联,也可以说有一个从StudentRegisterar到RecordManager的方向关联以及StudentRegisterar使用(“use”)了RecordManager。既然一个方向已经显式地指定了,在上例中StudentRegisterar是控制类。

图3: 关联

        对于初学者而言,关联是一个容易混淆的概念。造成这种混淆的主要原因是另两个OOP的概念,它们是组合和聚合。当每个人都懂得了关联的概念后,但在学习了聚合和组合后就变得混乱了。聚合和组合不能分开进行理解。如果你明白了聚合的概念,那它将会损坏你对关联的概念,如果你理解了组合的概念,很可能它会破坏你对聚合的理解,所以这三者要一起来学习和理解,通过对比找出其中的异同。所以下面让我们来了解一下这三者之间的区别吧。

3.9 关联、聚合和组合三者之间的区别

        关联是两个类之间的一个“use”的关系,一个类使用了另一个类的方法。聚合是一种特殊的关联,对于两个类,它们是“has a”的关系。当类的一个对象拥有(has a)另一个对象,也就是一个对象成为另外一个对象的组成部分时,我们说它们之间有种聚合关系,与关联不同的是,聚合总是强调方向性。如下面的代码和UML图所示:

       public class University

       {

               //一个大学总会有个法律顾问

               private Chancellor universityChancellor = new Chancellor();

       }

图4: 聚合

        在上面的例子中我们可以说University聚合了Chancellor,或者说University有(has a)Chancellor。但是如果没有法律顾问(Chancellor)大学也能存在。但是一个大学如果没有院系(Faculties)就不可能存在,可以说University的生命周期依附于Faculty的声明周期。如果Faculty调用了dispose方法那么University就不能存在了。对于这种情形我们可以说Univesity和Faculty是一中组合的关系。所以组合可以说是一种特殊形式的聚合。

图5: 组合

 

       我们再来看看另一个例子,.NET和Java中其实就是使用了组合关系定义集合的,而且组合还被用到了很多别的方面中,只是大多数人忽略了生命周期这个概念,生命周期对于组合的两个对象而言是互相绑定的,它们之间互相依赖。所以如果你想将两个对象绑定为组合关系,那么最好的方式就是你直接定义被组合的类为另一个类的内部类,访问级别设为私有(private)或者保护(protected)。

      所以简言之,我们可以说聚合是一种特殊的关联,而组合是一种特殊的聚合,而且关联->聚合->组合。

    

图6:关联、聚合以及组合之间的关系

     由于精力有限,今天就写到这里了,因为内容比较多,所以难免存在脑子混乱和打字错误的可能,希望大家能帮助我修正,OOP的其它内容将在下篇文章中继续总结,谢谢。

 

转自:http://www.cnblogs.com/talentbuilder/archive/2010/04/27/1722223.html

Pitfalls of Object Oriented Programming 立即下载

相关推荐

Object-Oriented Programming with Object-C

Object-Oriented Programming with Object-C Object-C 进阶书籍---面向对象

面向对象程序设计(Object Oriented Programming)

(英語:,:)是種具有概念的,同时也是一种程式开发的抽象方针。它可能包含與。对象則指的是(class)的实例。它将作为的基本单元,将程序和其中,以提高软件的重用性、灵活性和扩展性,物件裡的程序可以訪問及經常修改物件相關連的資料。在物件導向程式編程裡,電腦程式會被設計成彼此相關的物件。面向对象程序设计可以看作一种在程序中包含各种独立而又互相调用的对象的思想,这与传统的思想刚好相反:传统的程序设计主张将程序看作一系列的集合,或者直接就是一系列对电脑下达的指令。

weixin_40191861的博客 819

如何用Arduino和HX711压力传感器制作一个简易电子秤(含OLED显示)

本文详细介绍了如何使用Arduino、HX711压力传感器和OLED显示屏制作一个简易电子秤。从硬件连接到软件编程,提供了分步教程,包括核心元件功能解析、接线方法、库安装、模块测试以及关键的校准流程。项目实践性强,适合创客和DIY爱好者学习嵌入式系统与传感器应用。

tea88的博客 536

Object Oriented Programming面向对象编程

OOP  面向对象编程(Object Oriented Programming)是一种计算机编程架构。OOP 的一条基本原则是计算机程序是由单个能够起到子程序作用的单元或对象组合而成。OOP 达到了软件工程的三个主要目标:重用性、灵活性和扩展性。为了实现整体运算,每个对象都能够接收信息、处理数据和向其它对象发送信息。OOP 主要有以下的概念和组件:       组件 - 数据和

lwhlau的专栏 960

大数据应用技术实验报告一 Hadoop三种模式安装配置

JDK+Hadoop安装配置、单机模式配置 以下操作在SecureCRT里面完成 1.关闭防火墙 firewall-cmd --state 显示防火墙状态running/not running systemctl stop firewalld 临时关闭防火墙,每次开机重新开启防火墙 systemctl disable firewalld 禁止防火墙服务。 2.传输JDK和HADOOP压缩包 Sec...

Ruthless_Childe的博客 3094

Zigbee开发环境搭建:从驱动安装到程序烧录全指南

本文提供了一份详尽的Zigbee开发环境搭建全指南,涵盖从驱动安装到程序烧录的完整流程。重点介绍了使用SmartRF Flash Programmer和仿真器进行程序下载的关键步骤,并详细说明了USB转串口驱动的配置方法,帮助开发者快速构建稳定的Zigbee开发基础。

weixin_29195217的博客 394

【Java基础篇】面向对象(Object Oriented)

面向对象(Object Oriented)1. 面向对象概念1.1 什么事面向对象1.2 理解面向对象1.3 面向对象的特点1.4 面向对象开发设计,特征2. 类与对象2.1 什么是类2.2 类与对象的关系3. 类的定义4. 成员变量与局部变量的区别4.1 成员变量4.2 局部变量4.3 成员变量初始化5. 创建对象,使用对象6. 对象内存结构6.1 对象的产生6.2 对象的生命周期7. 匿名对象 1. 面向对象概念 1.1 什么事面向对象 面向对象(Object Oriented)是一种思想,90年代以

输入技术、输出想法 3900

S32K144-EB tresos GPT驱动模块配置详解

GPT通用计时器,在S32K144这款芯片上,有4个外设模块,最多38各通道可以作为GTP的计时器通道,具体详细的大家可以去看芯片手册。这里咱们只管怎么用EB来配置GPT驱动。

小胡同学的工程师学习之路 3866

面向对象(Object Oriented)

面向对象 面向对象(Object Oriented)是软件开发方法,一种编程范式。面向对象的概念和应用已超越了程序设计和软件开发,扩展到如数据库系统、交互式界面、应用结构、应用平台、分布式系统、网络管理结构、CAD技术、人工智能等领域。面向对象是一种对现实世界理解和抽象的方法,是计算机编程技术发展到一定阶段后的产物。 面向对象是相对于面向过程来讲的,面向对象方法,把相关的数据和方法组织为一个整体来看待,从更高的层次来进行系统建模,更贴近事物的自然运行模式。 package com.xxxx.oop01; /

qiaoge66的博客 798

盲孔、埋孔、通孔、一阶HDI、二阶HDI概念

文章目录1. 盲孔和埋孔2. 一阶、二阶HDI3. PADS软件设置盲埋孔 1. 盲孔和埋孔 HDI板是高密度互连(High Density Interconnector)的缩写,是生产印制板的一种技术,使用微盲埋孔技术的一种线路分布密度比较高的电路板,也被称为盲埋孔板,下图就是一个6层HDI板,其中C和D就是盲孔,B是埋孔,A是通孔。 盲孔(Blind Via)指连接外层到内层的金属化孔,D是V13孔,连接顶层和第3层,C是V56孔,连接第5层和底层。 埋孔(Buried Via)指连接内层到内层的金属

记得诚 3万+

Lammps纳米压痕接触面积—Matlab接触面积计算(两种方法)

Lammps纳米压痕接触面积计算

Rockyoung 5449

面向对象编程(Object-Oriented Programming)

面向对象编程(Object-OrientedProgramming) 基于对现实世界的规律的抽象 (一)基本概念 1.类(class):一类事物的总称 类就是一个模板,用于生成实例的内存空间。 2.实例:类的具体存在 类的实例化中,变量保存在栈内存中,存放堆内存地址 实例化的内容保存在堆内存中 3.属性:用于静态描述一类事物的特征,即类级变量(通常不公开,最好为私有) 4.行为:

Ann的博客 5072

基于 YOLOv26 的金属表面缺陷检测系统:智能视觉质检方案

摘要: 基于YOLOv26的金属表面缺陷检测系统采用深度学习技术,实现对划痕、裂纹、腐蚀等8类常见缺陷的自动化检测。系统通过数据增强预处理和YOLOv26模型的高精度识别能力,具备多类别分类、实时推理和强鲁棒性特点,适用于不同金属材质与光照条件。架构包含数据采集、预处理、YOLOv26检测和后处理模块,代码实现采用PyTorch框架,支持训练数据增强与标准化处理,为工业质检提供高效智能解决方案。

一键难忘的博客 589

面向对象编程(Object Oriented Programming)概念及延伸(二)

    之前我编写了该文章的第一部分,今天接着写第二部分,希望大家能继续支持。3.10 什么是抽象(Abstraction)和泛化(Generalization)?        抽象强调的其实是一种思想和概念,而不依赖于实现的细节。抽象最重要的功能是,可以通过抽象名字去引用对象从而达到隐藏对象中不相关细节的目的。抽象对于建立程序是十分重要的,它说明了一个对象是什么,这个对象能做些什么,而不是解释了这个对象怎么实现了这些内容的,即抽象隐藏了对象实现的具体细节,是对象的代表和说明,因此抽象是管理大型程序复杂性

体会技术牛人的高傲 888

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

面向对象编程(Object Oriented Programming)概念及延伸(三)

    昨天我发布了该系列文章的第二部分,今天我将做第三部分的总结,这也是该系列的最后一个部分,希望能写的更有质量些。3.17 什么是多态(Polymorphisms)?        多态是个专用的术语,它的意思是‘很多样子’(many shapes)。更精确的将,多态是种能力,通过这种能力相同的操作可以广泛地应用于不同类型的事物。       在OOP中,多态是通过很多不同技术实现的,它们分别是方法重载(method overloading)、运算符重载(operator overloading)以及方

体会技术牛人的高傲 1276

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

Return-Oriented Programming (ROP) 攻防实战:从基础到进阶的技术解构

本文系统讲解了ROP(返回导向编程)技术在现代二进制安全中的应用。文章从ROP基础理论入手,解析其核心原理和关键概念,如Gadget、调用约定等。通过ROPEmporium的8个经典挑战实例,详细演示了从基础返回劫持到复杂Gadget组合、栈迁移等进阶技巧。同时探讨了ROP在现代攻防场景中的演进,包括对抗CFG、ASLR等防护措施的绕过策略,并提出防御建议。文章强调ROP作为漏洞利用的核心技术,既展现了二进制安全的攻防艺术,也揭示了构建多层次防护体系的必要性。所有内容仅供学习研究之用。

fearhacker的专栏 1036

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

HIT软件构造学习笔记6- Object-Oriented Programming (OOP)

在真实世界中的对象都有两个基本的属性特征,那就是状态和行为。那我们可以延伸思维,从定义真实世界中的对象的状态和行为开始,慢慢了解面向对象编程的含义。举两个例子:那么我们进行一下归纳总结:一个对象就是一捆状态和行为的集合体。状态,是对象包含数据所在字段;行为,是对象所支持进行的操作。每一个对象有一个类,在类中可以定义对象的方法,方法和变量的字段称为类的成员。类中同时定义了数据类型和实现方法,数据类型说明了对象可以怎么被使用,而实现方法表明了对象怎么做事情。不严格的说,一个类的方法就是他的应用接口,就是我们听过

Zy0712的博客 488

简单总结 Reactive Programming

Reactive Programming 作为观察者模式(Observer)的延伸,不同于传统的命 令编程方式(Imperative Programming)同步拉取数据的方式,如迭代器 (Iterator)。而是采用数据发布者同步或异步推送到数据流(Data Streams)的方 案。当该数据流(Data Streams)订阅者监听到传播变化,立即作出相应。在实现层面 上,Reacti...

m0_37732829的博客 507

程序员思维日志:用Programming.log沉淀可复用的技术认知

编程日志(Programming.log)是一种面向工程师认知演化的轻量级知识管理范式,其核心在于以时间戳为索引、以问题驱动为线索、以可验证代码为证据,实现思考过程的低摩擦记录与高复用回溯。它区别于传统技术博客,不追求传播性,而专注解决‘为什么这样选’‘bug为何难定位’‘概念何时真正理解’三类不可替代的认知资产沉淀。通过纯文本+静态站点的技术栈,天然支持离线编辑、全文搜索与Git版本化演进,成为程序员对抗信息熵增、构建个人技术复利系统的底层基础设施。本文详解其设计哲学、内容结构与工程落地实践。

a6t2007的博客 366

programming.log:程序员的思维操作系统与可执行日志实践

编程日志是一种面向开发者认知规律的知识沉淀范式,其核心在于将思考过程结构化、时间序列化、代码共生化。它基于 Unix 哲学与 Git 工作流,以纯文本为载体,通过语义化命名、YAML 元数据、可执行代码块等设计,实现‘思考即留痕、日志即文档、检索即复现’的技术价值。相比传统博客或知识库,它弱化展示性、强化可追溯性与可执行性,特别适用于需要高频复用诊断路径、沉淀底层原理、支撑技术决策的工程场景。本文深入解析 programming.log 的设计哲学、文件规范、检索体系与团队协作模式。

as2886089的博客 499

programming.log:程序员的时序化编程思维手账

编程日志(programming log)是一种以时间轴为组织核心的技术记录范式,区别于主题驱动的博客或知识库,其本质是捕捉开发者在真实工程场景中的认知演进过程。它基于 Unix 时间戳强制时序归档,融合观察-假设-实验的科学思维链,通过纯文本+Git+符号链接实现极简可靠的知识沉淀。这种模式天然适配调试复盘、Code Review 反思、架构决策回溯等高频工程实践,尤其适合已具备编码能力但面临系统设计模糊、技术选型摇摆、长期演进乏力等挑战的中高级开发者。programming.log 不是输出成果,而是思

a6t2007的博客 413

契约式设计(DbC)实战:programming-scala-book-code-examples 的 BankAccount 与不变式示例

想写出"自带说明书"的可靠代码吗?**契约式设计(Design by Contract,简称 DbC)** 正是这样一种让代码"自我约束、自我验证"的经典方法论。在 O'Reilly 经典书籍《Programming Scala》的官方代码仓库 programming-scala-book-code-examples 中,`BankAccount`(银行账户)示例用短短几十行 Scala 代码,把

gitblog_01165的博客 977
上一篇: .net下邮件发送代码
下一篇: 面向对象编程(Object Oriented Programming)概念及延伸(二)
Csdbfans
博客等级 码龄18年 73粉丝 33原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值