设计代码说明什么是多态性?如何实现多态?(代码中要写注释解释)_狗屎一样的代码!快,重构我...

8848b74e1be77888b55f231ea4800eb7.png

dc235a0770960d22a5b1079dd5677b83.png

关注后你就是我的人了

重构不止是代码整理,它提供了一种高效且受控的代码整理技术。

(一)重构原则

1、何谓重构

对软件内部结构的一种调整,目的是在不改变软件可观察行为的前提下,提高其可理解性,降低其修改成本。

另一种解释是:使用一系列重构手法,在不改变软件可观察行为的前提下,调整其结构。

2、为何重构

改进软件设计:如果没有重构,程序的设计会逐渐变质,重构很像是在整理代码,你所做的就是让所有的东西回到应处的位置上。

帮助找到bug:对代码进行重构,可以深入理解代码的作为,在搞清楚程序结构的同时,想不把bug揪出来都难。

提高编程速度:良好的设计是快速开发的根本,改善设计、提高可读性,减少错误,这些都是提高质量。

3、何时重构

任何情况下我都反对专门拨出时间进行重构。重构本来就不是一件应该特别拨出时间做的事情,重构应该随时随地的进行。

ff48ca726b93f7bab8ac448660de6f61.png

狗屎一样的代码!快,重构我

三次法则

第一次做某件事情是只管去做;第二次做类似的事情会产生反感;第三次再做类似的事,你就应该重构

最常见的重构时机是想给软件添加新特性的时候;

重构的另个一原动力是:代码的设计无法帮助我轻松的添加所需要的特性

修改错误的时候,review代码的时重构

间接层和重构

计算机科学是这样一门科学:它相信所有的问题都可以通过增加一个间接层来解决。

大多数重构都为程序引入了更多的间接层,重构往往把大型的对象拆成多个小型的对象,把大型的函数拆成多个小型的函数。但是,间接层是一把双刃剑。每次把一个东西分成两份,你就需要多管理一个东西。如果某个对象委托另一个对象,后者又委托另一个对象,程序会愈加难以阅读。推荐阅读:44个Java代码性能优化总结。

何时不该重构:有时候既有代码实在太混乱,重构它还不如重新写一个来得简单。

重写而非重构的一个清楚讯号是:现有代码根本不能正常运作。

(二)代码的坏味道

1、重复代码

如果你在一个以上的地点看到相同的程序结构,那么可以肯定:设法将它们合二为一,程序会变得更好 。

同一个类中有相同的表达式:提炼出重复的代码,然后让两个地方都调用被提炼出来的那一段代码;

两个互为兄弟的子类内含有相同的表达式:提炼出相同代码,将它推入超类内;

两个毫不相干的类中出现:将重复的代码提炼到一个独立的类中。

9e007c76c8c89028588ce81eb2958797.png

狗屎一样的代码!快,重构我

2、过长的类

拥有短函数的对象活得比较好、比较长。间接层所能带来的全部利益——解释能力、共享能力、选择能力——都是由小型函数支持的。

每当感觉需要以注释来说明点什么的时候,我们就把需要说明的东西写进一个独立的函数中。

如何确定提炼哪一段代码?寻找注释是一个很好的技巧。它们通常能指出代码用途和实现手法之间的语义距离。如果代码前方有一行注释,就是提醒你:可以将这段代码替换成一个函数。

条件表达式和循环常常也是提炼的信号。

3、过大的类

如果想利用单个类做太多的事情,其内往往就会出现太多实力变量。

类内如果有太多代码,也是代码重复、混乱病最终走向死亡的源头。

4、过长参数列

太长的参数列难以理解,太多的参数会造成前后不一致、不容易使用,而且一旦你需要更多数据,就不得不修改它。如果将对象传递给函数,大多数修改都将没有必要。

5、发散式变化

如果某个类经常因为不同的原因在不同的方向上发生变化,那么此时也许将这个对象分成两个会更好,这么一来每个对象就可以只因为一种变化而需要修改。

9fc49aacaa662ea551f017ce852a65b3.png

狗屎一样的代码!快,重构我

6、散弹式修改

如果没遇到某种变化,你都必须在许多不同的类内做出许多小修改,你所面临的坏味道就是散弹式修改。如果需要修改的代码散布四处,你不但很难找到它们,也很容易忘记某个重要的修改。

把所有需要修改的代码放进同一个类中,如果眼下没有合适的类可以安置这些代码就创造一个。

7、依恋情结

对象技术的要点在于:将数据和对数据的操作行为包装在一起.有一种经典的气味是:函数对某个类的兴趣高过对自己所处类的兴趣。某个函数为了计算某个值,从另一个对象那调用几乎半打的取值函数。

一个函数往往会用到几个类的功能,那么它该置于何处?我们的原则是:判断哪个类拥有最大被此函数使用的数据,然后就把这个函数和那些数据放在一起。

8、数据泥团

很多地方看到相同的三四项数据一起出现。这些总是绑在一起出现的数据应该拥有属于他们自己的对象。

首先找到这些数据以字段形式出现的地方,将它们提炼到一个独立的对象中。这么做的直接好处是可以将很多参数列缩短简化函数调用。

ab512ab1fdd20c54580eb322f55731dd.png

狗屎一样的代码!快,重构我

9、基本类型偏执

对象的一个极大价值在于:它们模糊了横旦与基本数据和体积较大的类之间的界限

对象技术的新手通常不愿意在小任务上运用小对象——结合数值和比重的money类、有一个起始值和一个结束值组成的range类。将原本单独存在的数值替换成对象,从而走出传统的洞窟,进入炙手可热的对象世界。

10、switch惊悚现身

面向对象的一个最明显的特征是:少用switch语句一看到switch语句,就应该考虑以多态来替换它。推荐阅读:switch支持的 6 种数据类型!

如果只是在单一函数中有些选择实例,且并不想改动它们,那么多态就有点杀鸡用牛刀了。

11、平行集成体系

每当你为某个类增加一个子类,必须也为另一个类相应增加一个子类。

消除这种重复性的一般策略是:让一个继承体系的实例引用另一个继承体系的实例。

12、冗余类

某个类原本对得起自己的身价,但重构使它身形缩水,不再做那么多工作,这个时候请让这个类庄严赴义吧。

13、夸夸其谈未来性

企图以各种各样的钩子和特殊情况来处理一些非必要的事情,这种怀味道就出现了。如果用到了那就值得去做,如果用不到那就不值得,只会挡你的路,所以把它挪开吧。

如果你的某个抽象类其实没有起到太大的作用,函数上的某些参数未被使用…可以移除它们了。

2d08c35bdaf6aa037c0589d07232a452.png

狗屎一样的代码!快,重构我

14、令人迷惑的暂时字段

某个实例变量仅为某种特定的情况而设。这样的代码让人不易理解。在变量未被使用的情况下猜测当初其设置目的,会让你发疯的。

15、过度耦合消息链

如果你看到用户向一个对象请求另一个对象,然后再向后者请求另一个对象,然后再请求另个一对象……..这就是消息链。采用这种方式,意味着客户代码将与查找过程中的导航结构紧密耦合。一旦对象间的关系发生任何变化,客户端就不得不做出相应的修改。

16、中间人

封装往往伴随着委托。你也许会看到某个类接口有一半的函数都委托给其他类,这样就是过度运用。

17、狎昵关系

有时会看到两个类过于亲密,话费太多的时间去探究彼此的private成分。过分狎昵的类必须拆散,帮它们划清界线,从而减少狎昵行径。

继承往往造成过度亲密,因为子类对超类的了解总是超过后者的主观愿望。如果你觉得该让孩子独立生活了,让他离开继承。

18、异曲同工的类

两个函数做同一件事,却有着不同的签名。

e19c3953d364330b2762ce692f9b6a5a.png

狗屎一样的代码!快,重构我

19、不完美的类库

类库函数构造的不够好,又不能修改它们:

如果只想修改类的一两个函数,可以引入外加函数。如果想要添加一大堆额外行为,建立一个新类包含这些额外行为,让其成为子类。

20、纯稚的数据类

纯稚的数据类是指:它们拥有一些字段,以及用于访问(读写)这些字段的函数,除此之外一无长物。

21、被拒绝的遗赠

子类只运用了父类的一部分函数和数据。为子类建立一个兄弟类,将所有用不到的字段/函数下移至兄弟类,保证超类的纯粹;

22、过多的注释

注释之所以存在是因为代码很糟糕 。注释的最高境界——代码即注释。

当你感觉需要撰写注释时,请先尝试重构,试着让所有的注释都变得多余。

e7abefdea5c1750878004ea35b6e0151.png

狗屎一样的代码!快,重构我

(三)重新组织函数

1、提炼函数

动机:看到一个过长的函数或者一段需要注释才能让人理解用途的代码,将这段代码放一个独立的函数中;

做法:

创造一个新函数,根据这个函数的意图来命名它;

只要新函数的名称能够以更好的方式昭示代码意图,你也应该提炼它。但如果想不到一个更有意义的名称就别动

将提炼的代码从原函数复制到新建的目标函数中;

将被提炼代码段中需要读取的局部变量,当作参数传递给目标函数;

在源函数中,将被提炼代码段替换为目标函数调用。

2、内联函数

一个函数的本体与名称同样清楚易懂。在函数调用点插入函数本体,然后移除该函数。

动机:

一群组织不甚合理的函数。你可以将它们都内联到一个大函数中,再从中提炼出组织合理的小型函数。

使用的太多的间接层,使得系统中的所有函数都似乎只是对另一个函数的简单委托,造成在委托动作之间晕头转向。

528088c4653d43c779c8606a41681c6a.png

狗屎一样的代码!快,重构我

做法:

1、检查函数,确定不具备多态;

如果子类继承了这个函数,就不要将此函数内联,因为子类无法复写一个根本不存在的函数。

2、找出这个函数的所有调用点;

3、将这个函数的所有调用点都替换成函数本体。

3、内联临时变量

有一个临时变量,只被一个简单的表达是赋值一次,而它妨碍了其他重构手法。将所有对该变量的引用动作,替换为对它赋值的那个表达式自身

double basePrice = anOrder.basePrice();

return (base > 10000 );

替换为:

return (anOrder.basePrice > 1000);

4、以查询取代临时变量

你的程序以一个临时变量保存某一表达式的运算结果。将这个表达式提炼到一个独立的函数中。将这个临时变量的所有引用点替换为对新函数的调用。此后,新函数就可被其他函数使用。

替换为:

临时变量只在所属的函数中可见,如果把临时变量替换为一个查询,那么同一个类中的所有函数都将可以获得这个份信息,这将带给你极大的帮助,使你能够为这个类编写更清晰的代码。

5、引入注释性变量

你有一个复杂的表达式。将该复杂表达式(或其中一部分)的结果放进一个临时变量,以此变量名称来解释表达式用途。

替换为:

表达式有可能非常复杂难以理解。这种情况下,临时变量可以帮助你将表达式分解为比较容易管理的形式。

在条件逻辑中,你可以用这项重构将每个条件子句提炼出来,以一个良好命名的临时变量来解释对应条件子句的意义。另一种情况是:在较长的算法中,可以运用临时变量来解释每一步运算的意义。

4499e3afe48b4993e038cbdaae1b0277.png

狗屎一样的代码!快,重构我

6、分解临时变量

你的程序有某个临时变量被赋值超过一次,它既不是循环变量,也不被用于收集计算结果。针对每次赋值,创造一个独立、对应的临时变量。

替换为:

如果临时变量被赋值超过一次,就意味着它们在函数中承担了一个以上的责任。如果临时变量承担多个责任,它就应该被替换为多个临时变量。每个变量只承担一个责任,同一个临时变量承担两件不同的事情会令代码阅读者糊涂

7、移除对参数的赋值

代码对一个参数进行复制。以一个临时变量取代该参数的位置。

替换为:

如果代码的语义是按引用传递的,请在调用段检查调用后是否还使用了这个参数。

8、替换算法

想要把某个算法替换为另一个更清晰的算法。将函数本体替换成为另一个算法。

替换为:

1885e70435cd75b4f009b56125f6ce02.png

狗屎一样的代码!快,重构我

(四)在对象之间搬移特性

在对象设计过程中,决定把责任放在哪儿是即使不是最重要的事,也是最重要的事之一。

常常只使用搬移函数和搬移字段简单地移动对象行为,就可以解决这些问题。如果这两个重构手法都需要用到,我会首先使用搬移字段,再使用搬移方法。

如果一个类承担了太多责任而变得臃肿不堪,这种情况下会使用提炼类将一部分责任分离出去。如果一个类变得太不负责任,使用将类内联化将它融入到另一个类中。

1、搬移函数

你的程序中,有个函数与其所驻类之外的另个一类进行跟过的交流:调用后者或被后者调用。在该函数最长引用的类中建立一个有着类似行为的新函数。将旧函数变成一个单纯的委托函数,或者将旧函数完全移除。

如果一个类有太多行为,或如果一个类与另一个类有太多合作而高度耦合,就需要搬移函数。可以是系统中的类更简单

2、搬移字段

程序中,某个字段被其所驻类之外的另一个类更多的用到。在目标类新建一个字段,修改原字段的所有用户,令他们改用新字段

3、提炼类

某个类做了应该由两个类做的事。建立一个新类,将相关字段和函数从就类搬到新类。

4、将类内联化

某个类没有做太多的事情,不在承担足够责任,不再有的那单独存在的理由。将这个类的所有特性搬移到另一个类中,然后移除原类。

15f2923394671b4863b083a0e5bbcba5.png

狗屎一样的代码!快,重构我

5、隐藏“委托关系”

客户通过一个委托类来调用另一个对象。在服务类上建立客户所需要的所有函数,用来隐藏委托关系。

封装意味每个对象都应该少了解系统的其他部分。一旦发生变化,需要了解这一变化的对象就会比较少。

如果某个客户先通过服务对象的字段得到另一个对象,然后调用后者的函数。那么客户就必须知晓这一层委托关系。万一委托关系变化,客户也要相应变化。

6、移除中间人

某个类做了过多的简单委托。让客户直接调用委托类。

每当客户要使用手委托类的新特性时,你就必须在服务端添加一个简单委托函数。随着受委托类的特性越来越多,这一过程会让你很痛苦。

7、引入外加函数

你需要为提供服务的类增加一个函数,但你无法修改这个类。在客户类中建立一个函数,并以第一参数形式传入一个服务类实例。

替换为:

如果可以修改源码,你可以自行添加一个新函数;如果不能,你就得在客户端编码,补足你要的那个函数

ec37d2040fa0e53f2d0812a2daeddcb2.png

狗屎一样的代码!快,重构我

8、引入本地扩展

你需要为服务类踢狗一些额外函数,但你无法修改这个类。建立一个新类,使它包含这些额外函数。让这个扩展品成为源类的子类或包装类。推荐阅读:44个Java代码性能优化总结。

(五)重新组织数据

1、自封装字段

直接访问一个字段。为这个字段建立取值/设值函数,并且只以这些函数来访问字段。

替换为:

在“字段访问方式”这个问题上,存在两种截然不同的观点:

2、以对象取代数据值

你有一个数据项,需要与其他数据和行为一起使用才有意义。将数据项变为对象。

一开始你肯能会用一个字符串来表示“电话号码”概念,但是随后你会发现,电话号码需要“格式化”、“区号”之类的行为。这时候就需要为带替换的数值新建一个类。

3、将值对象改为引用对象

你从一个类衍生出许多彼此相等的实例,希望将它们替换为同一个对象。将这个值对象变成引用对象。

4、将引用对象改为值对象

你有一个引用对象,很小且不可改变,而且不易管理。将它变成一个值对象。

5、以对象取代数组

你有一个数组,其中的元素各自代表不同的东西。以对象替换数组。对于数组中的每个元素,以一个字段来表示

a4250d2a7bf5241cb35c56d0662e02fc.png

狗屎一样的代码!快,重构我

6、复制“被监视数据”

你有一些领域数据置身GUI控件中,而领域函数需要访问这些数据。将该数据复制到一个领域对象中。建立一个Observer模式,用以同步领域对象和GUI对象内的重复数据。

7、将单向关联改为双向关联

两个类都需要使用对方特性,但其间只有一条单向连接。添加一个反向指针,并使修改函数能够同时更新两条连接。

8、将双向关联改为单向关联

两个类之间有双向关联,但其中一个类如今不再需要另一个类的特性。去除不必要的关联。

9、以字面常量取代魔数

你有一个字面数值,带有特别含义。创造一个常量,根据其意义为它命名,并将上述的字面数值替换为常量。

10、封装字段

你的类中存在一个public字段。将它声明为private,并提供相应的访问函数。

11、封装集合

有个函数返回一个集合。让这个函数返回该集合的一个只读副本,并在这个类中提供添加/移除集合元素的函数。

ab512ab1fdd20c54580eb322f55731dd.png

狗屎一样的代码!快,重构我

(六)简化条件表达式

1、分解条件表达式

有一复杂的条件语句。从if、then、else三个段落中分别提炼出独立函数。

2、合并表达式

你有一系列条件测试,都得到相同结果。将这些测试合并为一个条件表达式,并将这个条件表达式提炼成一个独立函数。

3、合并重复的条件代码

在表达式的每个分支上都执行了相同的一段代码。将这段重复代码搬移到条件表达式之外。

4、移除控制标记

在一系列布尔表达式中,某个变量带有”控制标记”的作用。以break/return语句取代控制标记。

5、以多态取代条件表达式

有个条件表达式根据对象类型的不同而选择不同的行为。将这个条件表达式的每个分支放进一个子类内的覆写函数中,然后将原始函数声明为抽象函数

b4c994a5c077df6cb7d6f55e2fa49c74.png

狗屎一样的代码!快,重构我

(七)简化函数调用

1、函数改名

函数的名称未能揭示其用途。修改函数名称。

2、添加参数

某个函数需要从调用端得到更多信息。为此函数添加一个对象参数,让该对象带仅函数所需信息。

3、移除参数

函数本体不再需要某个参数。去除参数。

4、分离查询函数和修改函数

某个函数既返回对象状态值,又修改对象值。建立两个不同函数,其中一个负责查询,另一个负责修改。

5、令函数携带参数

若干函数做了类似的工作,但在函数本体中包含了不同的值。建立单一函数,以参数表达那些不同的值。

有这样两个函数:它们做着类似的工作,但因少数几个值致使行为略有不同。在这种情况下,你可以将这些各自分离的函数同一起来,并通过参数来处理那些变化情况,用以简化问题。

83d4194669100cc599d1e17dafc460a9.png

狗屎一样的代码!快,重构我

6、以明确函数取代参数

你有一个函数,其中完全取决于参数值而采用不同行为。针对该参数的每一个可能值,建立一个独立函数。

如果某个参数有多种可能的值,而函数内又以条件表达式检查这些参数值,并根据不同参数值做出不同的行为,那么就应该使用本项重构。

7、保持对象完整

从某个对象中取出若干值,将它们作为某一次函数调用时的参数。改为传递整个对象。

8、以函数取代参数

对象调用某个函数,并将所得结果作为参数,传递给另一函数,而接受该参数的函数本身也能够调用前一个函数。让参数接受者去除该参数,直接调用前一个函数。

9、引入参数对象

某些参数总是很自然的同时出现。以一个对象取代这些参数。

10、移除设值函数

类中某个字段在对象创建时被设值,然后不再改变。去掉该字段的所有设值函数。

11、隐藏函数

某个函数,从来没有被其他任何类用到 。将函数修改为private。

12 、以工厂函数取代构造函数

希望在创建对象时不仅仅是做简单的建构动作 。将构造函数替换为工厂函数。

(八)处理概括关系

1、字段上移

两个子类拥有相同的字段。将该字段移至超类。

2 、函数上移

有些函数在各子类中产生完全相同的结果。将该函数移至超类。

3 、构造函数本体上移

各个子类中有一些构造函数本体几乎完全一致 。在超类中新建一个构造函数,并在子类构造函数中调用它。

4、函数下移

超类中的某个函数只与部分(而非全部)子类用到。将函数移到相关的子类中。

5、字段下移

超类中的某个字段只被部分(而非全部)子类用到。将字段移到需要它的子类中。

6、提炼子类

类中的某些特性只被某些(而非全部)实例用到。新建一个子类,将上述部分的特性移到子类中。

7、提炼超类

两个类有相似特性。为这两个类建立一个超类,将相同特性移至超类。

8、提炼接口

若干客户使用类接口中的同一子集,或两个类的接口有部分相同。将相同的子集提炼到一个独立接口中。

9、折叠继承体系

超类和子类之间无太大区别。将它们合为一体。

10、塑造模板函数

子类中某些函数以相同顺序执行类似操作,但各操作细节略有不同。将操作放进独立函数(保持签名相同),然后将它们移至超类。

11、以委托取代继承

某个子类只使用超类接口中的一部分或根本不需要继承而来的数据。子类新建字段保存超类,调整子类函数为委托超类,取消继承关系。

12、以继承取代委托

你在两个类中使用委托关系,并经常为整个接口编写许多极简单的委托函数。`让委托类继承受托类。

37368930c04b774dae70abbd99aea16a.png

以上就是小编为大家分享的所有内容,有想了解更多资讯或相关知识,可以关注公众号;程序员大咖(CodePush)

技术文章原创,最新视频分享等等,一大批干货正在路上,想看的朋友记得点关注哦!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/490384.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

影响国家安全的四项新兴技术

来源:《Technology and National Security: Maintaining Americas Edge》The Aspen Institute (2019年1月31日)本文节选自专著《Technology and National Security: Maintaining Americas Edge》,本文部分讨论了四种新兴技术:生物技术、小型卫…

找到一个或多个多重定义的符号_初中数学之相反数,总结规律,学会多重符号的化简...

今天继续和大家一起来学习初中数学,初一的相关知识,在前面已经介绍了正数和负数,对于有理数也有了清楚的认识,今天我们来学习相反数,相反数的概念和表示是中考命题的热点之一,经常结合其他知识点一起考察&a…

分类分布(categorical分布)

解释: 假设X有3种状态,分别为x_1,x_2,x_3,这三种状态的概率分别为0.1,0.7,0.2(分别对应θ_1,θ_2,θ_3) 例如现在要求x_2这种状态的概率,则x_10,x_21,x_30 代入公式: θ_1^x_1θ_1^01; θ_…

【人工智能】人工智能时代的道路选择 | 焦点评论

‍‍‍来源:产业智能官对话嘉宾朱松纯(Song-Chun Zhu)教授马尔奖、赫尔姆霍茨奖获得者、UCLA教授、IEEE Fellow、暗物智能科技创始人沈向洋(Harry Shum)博士微软全球执行副总裁、美国国家工程院外籍院士、英国皇家工程…

怎么把php查询到的值显示到下拉框中_RazorSQL for Mac(数据库工具查询) v8.5.0

RazorSQL Mac是一款专门为mac用户推出的数据库管理软件,允许您从一个数据库工具查询,更新,导航和管理所有主要数据库,RazorSQL Mac功能强大还支持SQL的编辑、数据库管理工具,支持多种数据库!razorsql mac版使用方法Raz…

5分钟,看尽芯片和摩尔定律“你追我赶”的抗衡50年

来源:大数据文摘“摩尔定律过去是每5年增长10倍,每10年增长100倍。而如今,摩尔定律每年只能增长几个百分点,每10年可能只有2倍。因此,摩尔定律结束了。”今年一月份,英伟达(Nvidia)CEO黄仁勋在CES 2019展会…

Android Context 上下文 你必须知道的一切

今天被问到了关于Context的一些问题。发现自己关于这部分还是不是很清晰,然后发现洋神博客里有一篇讲的很好 很详细。我反正是看懂了,我觉得我再写 也不会比这个更清楚了,所以转过来。 http://blog.csdn.net/lmj623565791/article/details/40…

g++编译多个文件

假设现在有一个add.cpp,add.h,main.cpp这三个文件,文件内容如下: add.cpp: add.h: main.cpp: 我需要将add.cpp和main.cpp这两个文件进行编译,有以下两种方法: g -c add.cpp g -c main.cpp g main.o add.o -o test ./test 第二种…

【数字孪生】工业互联网和数字孪生

来源:产业智能官《崛起的超级智能》一书主要阐述当今天人类为人工智能的春天到来而兴奋,为人工智能是否超越人类而恐慌的时候,一个更为庞大、远超人类预期的智能形态正在崛起,种种迹象表明50年来,互联网正在从网状结构…

javascript数组扁平化处理

最近看jQuery源码$.map方法的实现,返回值利用了一个扁平化处理 return ret.concat.apply( [], ret ) 这有个疑问,不知道为什么不直接返回ret 根据这个返回值处理,推测ret可能不是一阶数组,例如[1,2,[3,4]]这样的; var ret [1,2,[…

k折交叉验证法python实现_Jason Brownlee专栏| 如何解决不平衡分类的k折交叉验证-不平衡分类系列教程(十)...

作者:Jason Brownlee编译:Florence Wong – AICUG本文系AICUG翻译原创,如需转载请联系(微信号:834436689)以获得授权在对不可见示例进行预测时,模型评估涉及使用可用的数据集来拟合模型,并评估其表现性能。…

AI“换脸”打开潘多拉魔盒,如何应对?

来源:科学网近日,一款名为“ZAO”的换脸APP引发舆论关注。用户上传照片,就可以把影视剧主角的脸替换成用户自己的脸。在过把“明星瘾”的同时,也让大众关注到“换脸”带来的个人信息泄露风险。信息时代,“脸面”不仅仅…

stm32超声波测距代码_超声波模块另类用法,悬浮,你也能做到

今天,给大家介绍一个「超酷的DIY声波悬浮」研究项目。虽然超声波悬浮,不能像磁悬浮那样悬浮比较重的物品。不过能把小泡沫球、水滴或者蚂蚁这样的小物体悬浮起来也是很有意思的。制作这样一个简易的超声波悬浮器并不需要多少成本,而且材料很容…

【AI战略】2019年美国国家人工智能战略报告(中文翻译版)

来源:AI城市智库人工智能(AI)拥有巨大的希望,几乎可以使社会的各个方面受益,包括经济,医疗保健, 安全,法律,运输,甚至技术本身。2019年2月11日,总统签署了行政命令13859…

函数对象

若一个类重载了运算符“&#xff08;&#xff09;”&#xff0c;则该类的对象就成为函数对象。函数对象可以用于标准库算法。函数对象和函数指针很相似&#xff0c;但也有区别。当函数对象使用模板时可以赋值给函数指针。 #include <iostream #include <vector> #incl…

拍下首张黑洞照片的团队获300万美元奖金:2020年科学突破奖揭晓

来源&#xff1a;科学突破奖科学突破奖2019 年 9 月 5 日&#xff0c;2020 年度突破奖&#xff08;Breakthrough Prize&#xff09;揭晓。突破奖&#xff0c;又被誉为“科学界的奥斯卡”&#xff0c;现已经入第八个年头。突破奖每年都会表彰在生命科学&#xff0c;基础物理学和…

C#获取ip的示例

界面 using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Text;using System.Windows.Forms; namespace TestIP{ public partial class Form1 : Form { public Form1() { InitializeComponent()…

硬盘序列号查询软件_【西数硬盘购买指南】干货——西数移动硬从购买到验证体会心得...

玩摄影有两年多了&#xff0c;所以照片和视频越来越多。上个月618活动&#xff0c;有入手了一块移动硬盘。买多是&#xff1a;西部数据My Passport Ultra移动硬盘4T下面从购买到验证全过程来说图片来源网络图片来源网络一、天猫截图上一篇文章&#xff1a;【希捷硬盘购买指南】…

多角度解析特斯拉电动车技术到底领先了多少?|厚势

来源&#xff1a;Astroys厚势按&#xff1a;不管是豪华车、传统车还是新造车势力造的电动车&#xff0c;都以对标特斯拉为荣。是什么让特斯拉成为电动车的图腾&#xff1f;特斯拉的电动车技术到底领先多少&#xff1f;本文 8000 余字&#xff0c;多个角度进行分析解读。在人们的…

Logistic回归的牛顿法及DFP、BFGS拟牛顿法求解

牛顿法 1 # coding:utf-82 import matplotlib.pyplot as plt3 import numpy as np4 5 def dataN(length):#生成数据6 x np.ones(shape (length,3))7 y np.zeros(length)8 for i in np.arange(0,length/100,0.02):9 x[100*i][0]110 x[100*i][1]…