• 关于

    程序理解是什么

    的搜索结果

回答

1.1、IoC是什么  Ioc—Inversion of Control,即“控制反转”,不是什么技术,而是一种设计思想。在Java开发中,Ioc意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制。如何理解好Ioc呢?理解好Ioc的关键是要明确“谁控制谁,控制什么,为何是反转(有反转就应该有正转了),哪些方面反转了”,那我们来深入分析一下:  ●谁控制谁,控制什么:传统Java SE程序设计,我们直接在对象内部通过new进行创建对象,是程序主动去创建依赖对象;而IoC是有专门一个容器来创建这些对象,即由Ioc容器来控制对 象的创建;谁控制谁?当然是IoC 容器控制了对象;控制什么?那就是主要控制了外部资源获取(不只是对象包括比如文件等)。  ●为何是反转,哪些方面反转了:有反转就有正转,传统应用程序是由我们自己在对象中主动控制去直接获取依赖对象,也就是正转;而反转则是由容器来帮忙创建及注入依赖对象;为何是反转?因为由容器帮我们查找及注入依赖对象,对象只是被动的接受依赖对象,所以是反转;哪些方面反转了?依赖对象的获取被反转了。  用图例说明一下,传统程序设计如图2-1,都是主动去创建相关对象然后再组合起来:图1-1 传统应用程序示意图  当有了IoC/DI的容器后,在客户端类中不再主动去创建这些对象了,如图2-2所示:图1-2有IoC/DI容器后程序结构示意图1.2、IoC能做什么  IoC 不是一种技术,只是一种思想,一个重要的面向对象编程的法则,它能指导我们如何设计出松耦合、更优良的程序。传统应用程序都是由我们在类内部主动创建依赖对象,从而导致类与类之间高耦合,难于测试;有了IoC容器后,把创建和查找依赖对象的控制权交给了容器,由容器进行注入组合对象,所以对象与对象之间是 松散耦合,这样也方便测试,利于功能复用,更重要的是使得程序的整个体系结构变得非常灵活。  其实IoC对编程带来的最大改变不是从代码上,而是从思想上,发生了“主从换位”的变化。应用程序原本是老大,要获取什么资源都是主动出击,但是在IoC/DI思想中,应用程序就变成被动的了,被动的等待IoC容器来创建并注入它所需要的资源了。  IoC很好的体现了面向对象设计法则之一—— 好莱坞法则:“别找我们,我们找你”;即由IoC容器帮对象找相应的依赖对象并注入,而不是由对象主动去找。1.3、IoC和DI  DI—Dependency Injection,即“依赖注入”:组件之间依赖关系由容器在运行期决定,形象的说,即由容器动态的将某个依赖关系注入到组件之中。依赖注入的目的并非为软件系统带来更多功能,而是为了提升组件重用的频率,并为系统搭建一个灵活、可扩展的平台。通过依赖注入机制,我们只需要通过简单的配置,而无需任何代码就可指定目标需要的资源,完成自身的业务逻辑,而不需要关心具体的资源来自何处,由谁实现。  理解DI的关键是:“谁依赖谁,为什么需要依赖,谁注入谁,注入了什么”,那我们来深入分析一下:  ●谁依赖于谁:当然是应用程序依赖于IoC容器;  ●为什么需要依赖:应用程序需要IoC容器来提供对象需要的外部资源;  ●谁注入谁:很明显是IoC容器注入应用程序某个对象,应用程序依赖的对象;  ●注入了什么:就是注入某个对象所需要的外部资源(包括对象、资源、常量数据)。  IoC和DI由什么关系呢?其实它们是同一个概念的不同角度描述,由于控制反转概念比较含糊(可能只是理解为容器控制对象这一个层面,很难让人想到谁来维护对象关系),所以2004年大师级人物Martin Fowler又给出了一个新的名字:“依赖注入”,相对IoC 而言,“依赖注入”明确描述了“被注入对象依赖IoC容器配置依赖对象”。  看过很多对Spring的Ioc理解的文章,好多人对Ioc和DI的解释都晦涩难懂,反正就是一种说不清,道不明的感觉,读完之后依然是一头雾水,感觉就是开涛这位技术牛人写得特别通俗易懂,他清楚地解释了IoC(控制反转) 和DI(依赖注入)中的每一个字,读完之后给人一种豁然开朗的感觉。我相信对于初学Spring框架的人对Ioc的理解应该是有很大帮助的。

wangccsy 2019-12-02 01:49:09 0 浏览量 回答数 0

回答

要搞清楚这个问题,必须搞清楚什么叫等价。看这样两个程序(伪代码):var i = input.read output.write(i)程序1 var x = input.read output.write(x)程序2这两个程序是等价的,换一句话说,将程序视作一个黑盒(并且计算机是理想的,速度无限快,存储无限大),你不能从输入和输出区分出计算机执行的是哪个程序。我们继续看var i = input.read j = 1 + 1 output.write(i)程序3这个程序和上面的程序等价么?仍然是等价的。因为虽然内部多了一个操作,j = 1 + 1,但是输出的结果不变,给定的输入有给定的输出,前面我说了,这就是等价。再看一个程序var i = input.read i = 1 + 1 output.write(i)程序4这个程序和之前的程序等价么?显然不等价了,因为多出来的一行改变了程序的结果。如果把程序1和程序4放在计算机中运行,如果输入n,输出n,就是程序1,如果总是输出2,就是程序4我们知道,程序4表示如果不管输入什么,输出总是2,那么根据这个,我们不管程序四是怎么写的,都可以写出它的等价形式output.write(2)程序5这个程序和程序4是等价的。我之所以啰里啰唆地说了半天,就是让你明白,什么叫等价,这是理解这个问题的关键。

蛮大人123 2019-12-02 01:50:18 0 浏览量 回答数 0

问题

程序=算法+数据结构+程序设计方法+语言工具和环境中的语言工具和环境是什么

知与谁同 2019-12-01 20:14:45 506 浏览量 回答数 2

阿里云试用中心,为您提供0门槛上云实践机会!

0元试用32+款产品,最高免费12个月!拨打95187-1,咨询专业上云建议!

回答

这几个问题回答起来没什么意思,我主要分析分析面试官为什么问你这几个问题。问题 1 主要应该是想了解你对调用其他程序或接口时出现的异常情况是如何处理的,毕竟程序的运行并不总是一帆风顺,如果由于其他的接口出现了问题,而你没有处理好这些问题继而引发你写的程序出错或崩溃,那确实不是一个优秀的程序员所做的。程序员不仅应该了解用户按常理出牌,按既定路线完成程序的情况,还应该做好发生各种异常情况的处理。问题 2 主要应该是想了解你是怎样评估你写的程序的,是通过怎样的手段了解的程序的运行情况,是如何优化你的程序的。实现功能并不是程序员的唯一目标,在实现功能的情况下做一个优秀的、高效的程序也是一项艰巨的工程。问题 3 主要应该是想了解你对程序体系结构,或者说是架构的理解,程序不是简单的代码堆积,是有思想线路支撑,有模块协作分工的。作为程序员,虽然可能不会去实际写某一块的东西,但是至少应该了解这些模块的功能以及所有模块之间的联系和他们是如何协作工作的。就好比实现一个接口,你需要处理输入,进行逻辑判断,数据库操作,遇到错误的响应,返回结果等等,这里每一块都是相当细致的。

a123456678 2019-12-02 03:03:23 0 浏览量 回答数 0

问题

字节数组是什么意思?

保持可爱mmm 2020-02-08 11:51:08 0 浏览量 回答数 1

问题

有了CGI为什么还需要Nginx?

西秦说云 2019-12-01 19:40:03 1275 浏览量 回答数 1

回答

学习是一个由浅入深的过程,可以先看看别人怎么写代码的,看看网络上的视频,然后跟着视频边看边写,当对一门语言有一段时间的认知后,发现编写使不上力的时候,就到了瓶颈期,这时候就需要系统化的思维来学习了。1.如何做事?要想写清楚一个程序,则需要想清楚程序要解决一个问题?或者实现一个什么价值?然后才是如何解决问题或者实现价值?2.如何编程?知道了如何解决问题,按照对应编程语言的语法把理解的思想写下来即可。总结:要想做事则需要知道自己要做什么,用什么去做?则需要理解计算机如何工作? 然后才是如何去编程,编程语言怎么工作的?才能更好的使用编程语言

海贼王fans 2019-12-02 00:59:13 0 浏览量 回答数 0

问题

如何理解JavaScript访问变量有按值和按引用两种方式 这句话

a123456678 2019-12-01 20:16:03 741 浏览量 回答数 1

问题

如何理解JavaScript访问变量有按值和按引用两种方式 这句话

a123456678 2019-12-01 20:16:01 862 浏览量 回答数 1

问题

java包访问控制权限和公有静态成员变量该怎么理解?

蛮大人123 2019-12-01 20:02:57 1118 浏览量 回答数 1

回答

这里有两个问题。一个是什么是路径,为什么需要它,另一个是为什么pylint不起作用,尽管有联系,他们有不同的答案。这两个我都会解释。 首先你要理解路径的概念。当您在Windows的cmd中或在MacOS或Linux OS的终端中键入命令(假设您键入了命令)时,您实际上是在用name命令执行程序。 现在操作系统不可能查看所有的辅助存储设备来找到同名的程序。这将花费很长时间,而且可能有多个同名程序。它有一个目录列表,它在其中寻找那个程序。此目录列表称为路径。 如果您正在执行pylint命令,那么您是在告诉Windows运行一个名为pylint的程序,该程序存在于路径中的一个目录中。Windows试图这样做,但在它的路径目录列表中找不到任何与该名称相关的内容。它给出了误差。您可以看到您的windows路径,如这里所示。 所有python模块都添加到路径中应该存在的相同目录中。所以pylint命令不能工作的原因可能是其他原因。 另一个问题是为什么pylint不起作用。我认为原因是你应该执行 pip 而不是 pip

kun坤 2019-12-26 10:47:22 0 浏览量 回答数 0

问题

Hibernate什么时候用openSession,什么时候用getCurrentSession() ?

a123456678 2019-12-01 20:21:51 1239 浏览量 回答数 1

回答

我不确定我为什么理解您的需求。听起来更像是您希望在应用程序更改之间保存状态(您的应用程序将进入后台)。 在Android上,基本上没有两个程序同时运行(有服务,但有区别)。用户返回主屏幕后,如果他们再次“启动”应用程序,它将进入已定义的第一个活动,除非您重写某些功能以恢复应用程序的先前状态。

LiuWH 2020-01-23 13:13:25 0 浏览量 回答数 0

问题

了解一点点阿里云是什么

蓝沁慧智 2019-12-01 20:23:28 888 浏览量 回答数 2

回答

不推荐买系统盘存放数据。先理解系统盘和数据盘的区别:在盘的介质,制作工艺,容量等一样的前提下,物理盘一样。区别在于上面存放了什么数据,运行了什么程序。系统盘:运行操作系统(windows,linux)数据盘:一般存放数据,也可以运行程序;所以:系统盘是运行操作系统的盘,不要用来存放数据。

1987318114167812 2019-12-02 01:29:48 0 浏览量 回答数 0

问题

在我的例子里,Linux的kernel与user space如何进行通信才好?

杨冬芳 2019-12-01 20:21:09 1022 浏览量 回答数 2

问题

shell中的jobs和process有什么区别?

a123456678 2019-12-01 20:08:58 817 浏览量 回答数 1

回答

本人乃一个数据痴迷者,在计算机的道路上,也是一个数据结构的痴迷者,现在大学里面和同学搞开发也痴迷于数据库,我就我个人的理解给你谈一谈: 首先,数据结构是一门计算机语言学的基础学科,它不属于任何一门语言,其体现的是几乎所有标准语言的算法的思想。 上面的概念有一些模糊,我们现在来具体说一说,相信你门的数据结构使用的是一门具体的语言比如C/C++语言来说明,那是为了辅助的学习数据结构,而数据结构本身不属于任何语言(相信你把书上的程序敲到电脑里面是不能通过的吧,其只是描述了过程,要调试程序,还需要修改和增加一些东西)。你们的书上开始应该在讲究数据的物理存储结构/逻辑存储结构等概念,说明数据结构首先就是“数据的结构”,在内存上的存储方式,就是物理的存储结构,在程序使用人员的思想上它是逻辑的,比如: 你们在C/C++中学习到链表,那么链表是什么一个概念,你们使用指针制向下一个结点的首地址,让他们串联起来,形成一个接一个的结点,就像显示生活中的火车一样。而这只是对于程序员的概念,但是在内存中存储的方式是怎样的那。对于你程序员来说这是“透明”的,其内部分配空间在那里,都是随机的,而内存中也没有一个又一根的线将他们串联起来,所以,这是一个物理与逻辑的概念,对于我们程序员只需要知道这些就可以了,而我们主要要研究的是“逻辑结构”。 我可以给你一个我自己总结的一个概念:所有的算法必须基于数据结构生存。也就是说,我们对于任何算法的编写,必须依赖一个已经存在的数据结构来对它进行操作,数据结构成为算法的操作对象,这也是为什么算法和数据结构两门分类不分家的概念,算法在没有数据结构的情况下,没有任何存在的意义;而数据结构没有算法就等于是一个尸体而没有灵魂。估计这个对于算法的初学者可能有点晕,我们在具体的说一些东西吧: 我们在数据结构中最简单的是什么:我个人把书籍中线性表更加细化一层(这里是为了便于理解在这样说的):单个元素,比如:int i;这个i就是一个数据结构,它是一个什么样的数据结构,就是一个类型为int的变量,我们可以对它进行加法/减法/乘法/除法/自加等等一系列操作,当然对于单个元素我们对它的数据结构和算法的研究没有什么意义,因为它本来就是原子的,某些具体运算上可能算法存在比较小的差异;而提升一个层次:就是我们的线性表(一般包含有:顺序表/链表)那么我们研究这样两种数据结构主要就是要研究它的什么东西那。一般我们主要研究他们以结构为单位(就是结点)的增加/删除/修改/检索(查询)四个操作(为什么有这样的操作,我在下面说到),我们一般把“增加/删除/修改”都把它称为更新,对于一个结点,若要进行更新一类的操作比如:删除,对于顺序表来说是使用下标访问方式,那么我们在删除了一个元素后需要将这个元素后的所有元素后的所有元素全部向前移动,这个时间是对于越长的顺序表,时间越长的,而对于链表,没有顺序的概念,其删除元素只需要将前一个结点的指针指向被删除点的下一个结点,将空间使用free()函数进行释放,还原给操作系统。当执行检索操作的时候,由于顺序表直接使用下标进行随机访问,而链表需要从头开始访问一一匹配才可以得到使用的元素,这个时间也是和链表的结点个数成正比的。所以我们每一种数据结构对于不同的算法会产生不同的效果,各自没有绝对的好,也没有绝对的不好,他们都有自己的应用价值和方式;这样我们就可以在实际的项目开发中,对于内部的算法时间和空间以及项目所能提供的硬件能力进行综合评估,以让自己的算法能够更加好。 (在这里只提到了基于数据结构的一个方面就是:速度,其实算法的要素还应该包括:稳定性、健壮性、正确性、有穷性、可理解性、有输入和输出等等) 为什么要以结点方式进行这些乱七八糟的操作那。首先明确一个概念就是:对于过程化程序设计语言所提供的都是一些基础第一信息,比如一些关键字/保留字/运算符/分界符。而我们需要用程序解决现实生活中的问题,比如我们要程序记录某公司人员的情况变化,那么人员这个数据类型,在程序设计语言中是没有的,那么我们需要对人员的内部信息定义(不可能完全,只是我们需要那些就定义那些),比如:年龄/性别/姓名/出生日期/民族/工作单位/职称/职务/工资状态等,那么就可以用一些C/C++语言描述了,如年龄我们就可以进行如下定义: int age;/*age变量,表示人员公司人员的年龄*/ 同理进行其他的定义,我们用结构体或类把他们封装成自定义数据类型或类的形式,这样用他们定义的就是一个人的对象的了,它内部包含了很多的模板数据了。 我就我个人的经历估计的代码量应该10000以内的(我个人的经理:只是建议,从你的第一行代码开始算,不论程序正确与否,不论那一门语言,作为一个标准程序员需要十万行的代码的功底(这个是我在大学二年级感觉有一定时候的大致数据,不一定适合其他人),而十万行代码功底一般需要四门基础远支撑,若老师没有教,可以自学一些语言)。

马铭芳 2019-12-02 01:22:06 0 浏览量 回答数 0

问题

关于设置用户ID的疑问

a123456678 2019-12-01 20:01:49 1247 浏览量 回答数 1

问题

【精品问答】前端开发必懂之HTML技术五十问

问问小秘 2019-12-01 21:59:10 5607 浏览量 回答数 2

问题

scanf中%s输入字符串,不理解字符数组名+1的操作

a123456678 2019-12-01 19:46:13 1618 浏览量 回答数 1

问题

主程序中没有引用类,在程序运行时却显示错误出现在类文件中

杨冬芳 2019-12-01 20:12:14 880 浏览量 回答数 1

回答

很难理解对于初学者来说,C语言能“学完“。学习任何东西,都有一个门槛,也就是说学习到一定程度才能入门,才能发挥这种技能的作用。开发程序也是一样,学习一个星期或者一个月,抑或跟着老师上课随便学学,这些都不足以使你入门,即便你学了一点东西,但是量变还不够质变的程序,所以感觉和没学一个样。就如同你自己说的你学的东西”对编程毫无头绪,无法编出实实在在的程序“。如果你真的打算学下去,起码要学习2年、编写10万行以上的代码才能突破这个门槛——至于学什么倒是无关紧要,没有这样的积累,学什么都不行。

a123456678 2019-12-02 02:15:03 0 浏览量 回答数 0

回答

printf("aaa\n");这不是在打印a字符吗?,而且,只有段越界才会引起进程的段错误信号,你访问的地址仍然在进程的合法空间范围内,当然空指针这类地址基本不合法。回复 @xxdd:看看gdb进程的infoprocmappings或者去cat/proc/$pid/maps,崩溃指的是程序read,write,execute了一个virtualaddress,这个address不在操作系统给其进程分配的虚拟地址段之内,称其为段错误回复 @xxdd:我的理解是,只有当指针指向只读区域时,你更改才会报错。想想八门神器,一个程序都可以改别的程序里的内存值,这不就很好的解释了你的疑问了吗?您好,我指的是fun()函数里面的n[111],已经越界了,为什么程序可以正常运行,而不是崩溃? 因为根本报不了错。 编译器,编译器怎么判断数组下标的范围?没有任何一种万无一失的方法,最多用静态检查工具,处理掉一些错误。 运行期,程序持有的信息更少,数组元素的访问就是数组其实元素的地址+偏移量计算出地址。这个时候就是对地址的直接访问,运行期是不会记录类型信息的,根本不知道这个数组设定的大小。这个时候程序是否崩溃就要看人品了,只有操作系统发现你访问了不该访问的内存区域,程序才会崩溃。谢谢,应该是这样的。c++本来就不会检查边界的,所以遇到数组参数的时候,一般会加一个长度,而java是基于这个问题做了优化编译器不检查,但是为什么运行的时候,也不报错? 数组下标越界是undefinedbehavior. 结果是未定义的知道什么意思吧 两种写法程序都可以正常运行,为啥?明明操作了非法的地址。越界是 undefinedbehavior。所谓 undefinedbehavior就是怎样都行,可以崩溃、可以什么都不干。你如果非要问为什么C++这样规定,那是因为检查这些错误代价实在太大了。您好,我想知道的是,为什么这个程序可以正常运行?数组已经指向了非法的地址。数组传递变成指针,他允许你进行修改,改的对不对成了问题 你把堆改成栈再试试回复 @xxdd:堆所分配的是系统中剩余的可用内存。new出来的内存指针所指向的地址,在你指定的大小之后,仍然可能有很大一块可用内存,不报错是有可能的。inta[2];fun(a);这个就是栈吧?这应该和系统内存分配有关系吧,报错应该是系统认为地址非法给你报错,系统肯定是认为你这个地址不非法呗,所以不报错newint[2]是从堆上分配的,数组越界是未定义行为,可能是没有进程默认堆大,没有非法访问,所以没有coredump掉。你越界大一些看看好像是这个原因,那栈上那个为什么也不报错? 楼主听说过“缓冲区溢出”的说法吧 我个人理解一个指针本来就能在自己的地盘里指来指去,想要指到哪里是程序员的自由,编译器不做这方面的任何限制与检查。 Linux上检查缓冲区溢出跟内存泄露可以试试valgrind还有电网electric-fence

爱吃鱼的程序员 2020-06-12 14:05:26 0 浏览量 回答数 0

回答

这个的确是个奇怪的东西,通常的理解是这样的,对于int p表示申请了一个变量p,并且规定p的类型是int,既然*p的类型是int,从而反推出p的类型是int指针;这样的理解有点违反直觉,但是很有助于理解C的指针,比如申请一个函数指针void (*f)(int)表示申请了一个名为f的,指向一个无返回值,带一个int参数的函数的指针;另外例如数组指针,譬如int (*a)5是指向一个三维数组的某两维的指针,必须使用如上的方式理解;另外还有就是int a,b表示a和b都是int类型的,即申请了两个指针,而在int a,b中表示a和b是int类型,所以b是int而非指针;那么在C语言中,变量的定义是用类型名 变量名来定义的,在int p的定义中,既然变量名是p,那么其类型就自然是int 咯不过编译器并不在意空格什么的东西,对于编译器来说,int p和int p完全是一码事,所以采用哪种写法其实对于程序执行是无所谓的,但是你必须要知道这样的写法是怎么来的,而且如果你能够理解的话,就会习惯写成int *p的样子了

a123456678 2019-12-02 02:40:19 0 浏览量 回答数 0

问题

【精品问答】Java经典问答之SpringBoot 100问

问问小秘 2019-12-01 22:00:40 1176 浏览量 回答数 0

回答

1.什么是锁?锁的核心是对资源进行独占,如cpu,io,内存,数据库中某个记录等等。在单机里面,锁的概念非常好理解,学校只有一个电话,很多人需要打电话,那怎么办呢?得有个管理员来负责安排谁可以打电话,至于优先顺序可以由管理员来定,如先到先打,或者时间短的先打,也可以事情重要的先打。在编程里面就是单机程序来控制谁来使用某个或者某些资源。2.什么是分布式锁单机里面锁很好理解,但是放到了多台机器的话,那么谁来控制使用资源呢,当然是需要一个第三方的协调着来记录当前某个资源是不是被某台机器的某个进程在使用中。这里分布式锁可以是数据库,可以是缓存,甚至zookeeper

lubby 2019-12-02 01:50:36 0 浏览量 回答数 0

问题

关于BLE4.0蓝牙透传问题 CC2540模块

爵霸 2019-12-01 20:11:57 1063 浏览量 回答数 2

问题

【精品问答】Java微服务架构之Spring Boot核心知识 100问(附源码)

游客pklijor6gytpx 2019-12-01 22:04:21 850 浏览量 回答数 0

回答

为什么要学数据结构和算法首先要知道他们的作用: 算法就是计算机处理解决问题的计算机能理解的方法。 比如算一个阶乘 , 计算机的算法就是写一个循环,从高到底, 一直乘下去,直到 1 为止。 复杂的算法比如一个强连通带权网络,求两点间的最短路径,这个很有用啊....比如采用广度优先算法,或深度优先算法。 数据结构指数据在计算机中存储存在的方式。 比如文件在硬盘中,有二进制,文本等形式存放, 程序中的一组数字可能放在数组里面,也可能在栈里面,也肯能在链表里面。 这样从上面知道了。 程序要运行,算法算得上是程序运行方法,数据结构就算是程序运行后储存下来。 所有计算机专业学习算法和数据结构就显得尤为重要了。

游客886 2019-12-02 01:23:07 0 浏览量 回答数 0
阿里云大学 云服务器ECS com域名 网站域名whois查询 开发者平台 小程序定制 小程序开发 国内短信套餐包 开发者技术与产品 云数据库 图像识别 开发者问答 阿里云建站 阿里云备案 云市场 万网 阿里云帮助文档 免费套餐 开发者工具 企业信息查询 小程序开发制作 视频内容分析 企业网站制作 视频集锦 代理记账服务 企业建站模板