精华内容
下载资源
问答
  • 但你仔细看那些文章的讲解,其实说的都只是“自顶下”。 为了说清楚“自底向上”编程,首先赘述一下什么叫做“自顶下”编程。 自顶下编程 自顶下编程一般会好理解一点。首先从整体分析一个比较复杂的大...

    在国内的网站上搜索什么叫“自底向上”编程,给人的感受似乎是同一个问题有两种解决思路,一个是“自顶向下”,一个是“自底向上”。但你仔细看那些文章的讲解,其实说的都只是“自顶向下”。

    为了说清楚“自底向上”编程,首先赘述一下什么叫做“自顶向下”编程。

     

    自顶向下编程

    自顶向下编程一般会好理解一点。首先从整体分析一个比较复杂的大问题。为了解决这一问题,必须把它拆分来看,应当解决哪几个小问题,然后再逐步细分到更小的问题,直到每个问题对我们来说,都已经很简单。解决了所有的小问题,逐步向上汇总,就完成了最初的复杂问题。值得强调的是:从小问题汇总到最后的复杂问题,这是“自顶向下”编程的一个过程,这不叫“自底向上”编程。

     

    它的本质是什么

    “自顶向下”编程是典型的工程师思维方式,一事一议地解决问题。大问题分解为小问题的具体方法,视实际操作者水平高低,会有很大的差异。但即使是一个新手,也有办法入手。这种解决问题的方式,效率是比较高的,但可重复性很低。下次遇到一个即使是类似的问题,我们会发现,分析方法或许是可以重用的,但具体的代码和工作量往往难以重用。

     

    自底向上编程

    自底向上编程,是这样一种操作过程:先描述,后编程。当我们面对一个复杂的大问题的时候,我们首先把它泛化为一大类问题,用一些基本概念对所有这些问题进行描述。然后逐步增加那些必不可少的概念,直到我们能够完整而细致地把这些问题描绘清楚。这一过程有点像构建一个公理体系。我们逐渐增加公理的数量,直到整个体系中的所有感兴趣的命题都可以用这些公理推导出来。

    又像构建一种语言(DSL),这种语言比我们所使用的编程语言的粒度大很大,提供了描述问题时所用的大块抽象积木。同时它比我们描述问题所用的自然语言更加清晰准确,因为它是可以由计算机理解的语言。

    在这样的描述工作完成之后,我们开始编程。首先实现的是这些公理体系,或者说是这些DSL的基本概念。这是整个复杂问题的底部。在此之上,我们继续添加定义和定理,或者说添加DSL中的高阶概念。这些逐步构建起来的更加复杂的模块,让我们距离最初的复杂问题越来越近。直到最初的问题被证明,或者说被DSL中的高阶概念表达,也即被解决。这就是“自底向上”的编程过程。

     

    它的本质又是什么

    自底向上”的编程过程,远比“自顶向下”编程复杂得多。它的目标不是解决一个具体的问题,而是解决一类具有普遍性问题。它的着眼点不仅仅是眼前问题的解决,而是程序在需求改变下的健壮性。

     

    两种编程方式举例

    我们从一个具体的例子,来看两者的不同。

    比如现在我们的需求是:求一个数字列表的每个数的平方和。

    自顶向下的编程思路是这样:

    1. 首先设一个累加器并预设初始值为0
    2. 然后遍历整个列表,
    3. 取出列表中的每个数字,
    4. 计算平方,
    5. 并且累加。

    思路很简单,具体代码如下:

    
    a=[1,2, 3, 4,5]
    
    def calc(lst):
        sum= 0
        for i in lst:
            sum+= i**2
        return sum
    
    squareSum= calc(a)
    print(squareSum)
    

    它的特点是思路直接,效率高。这是一个紧密耦合的高度定制化的功能,除了解决这个问题之外,不会再有什么其他的用处。如果需求发生了某种变化,只能重建一个新的函数来实现。虽然代码的基本思路是可以重用的,但给人以某种一事一议的特殊感。

    自底向上的编程思路是这样:

    1. 首先这个问题的本质是:对一个列表中的每个数字做某种处理后再进行某种形式的合并。
    2. 第一个某种处理:是在进行平方处理,我们应当有一个平方的概念(函数)。
    3. 第二个某种形式的合并,是在累加,我们应当有一个累加的概念(函数)。
    4. 再然我们实现一个先处理后合并的机制。
    5. 将这三者组合起来,解决问题。

    代码如下:

    from functools import reduce
    
    a=[1,2, 3, 4,5]
    
    def sum(a, b):
        return a+b
    def sqare(a):
        return a**2
    def reduceMap(mapFunc, redFunc, lst):
        return reduce(redFunc, map(mapFunc, lst))
    
    squareSum= reduceMap(sqare, sum, a)
    print(squareSum)
    

    它的特点是思考方式不那么直接,开发效率和运行效率可能都会略低一些。但这种解决问题的方法似乎在某种角度来看“更接近问题的本质”,它是试图解决一大类问题,这类问题的需求由三个独立的函数来描述,如果三处的具体需求发生改变,我们只须修改一个函数即可。

    如果需求从此不变,当然第一种方法是简单的。但需求是必然变化的。

     

    如果需求发生了改变

    比如,我们改一下需求:在有些情况下只对列表中的奇数求平方和。

    自顶向下的编程思路就不展开了,增加一个函数即可。复制粘贴后略做修改:

    
    a=[1,2, 3, 4,5]
    
    def calc(lst):
        sum= 0
        for i in lst:
            sum+= i**2
        return sum
    
    def calc2(lst):
        sum= 0
        for i in lst:
            if i%2==1:
                sum+= i**2
        return sum
    
    # squareSum= calc(a)
    squareSum= calc2(a)
    print(squareSum)
    

    这两个函数看起来就多少感觉有些别扭了,不但重复了相似的逻辑结构,而且都相当特殊,几乎不会有复用的机会。可以预见到如果继续增加需求,还会继续增加函数。

    自底向上的编程思路是这样:

    1. 新的需求增加了判断奇偶数的概念,增加一个函数。
    2. 新的需求增加了从列表种进行挑选的概念,增加一个函数。
    3. 同时新的函数可以覆盖原来的函数,旧的函数可以做修改(可选优化)

    代码如下:

    from functools import reduce
    
    a=[1,2, 3, 4,5]
    
    def sum(a, b):
        return a+b
    def sqare(a):
        return a**2
    def isOdd(a):
        return a%2==1
    def reduceMapFilter(mapFunc, redFunc, fltFunc, lst):
        return reduce(redFunc, map(mapFunc, filter(fltFunc, lst)))
    def reduceMap(mapFunc, redFunc, lst):
        # return reduce(redFunc, map(mapFunc, lst))
        return reduceMapFilter(mapFunc, redFunc, lambda x:x, lst)
    
    # squareSum= reduceMap(sqare, sum, a)
    squareSum= reduceMapFilter(sqare, sum, isOdd, a)
    print(squareSum)
    

    虽然这个思路对于一个需求的改动,增加了两个函数,但函数的功能非常基础,且逻辑结构不重复。随着需求的继续增加,可以预见,这些函数会有更多复用的机会(实际上,考虑到旧函数的修改,新函数已经开始复用了)。如果我们能够预见到整个软件的需求会向这个方向发展,我们会考虑按这个思路来实现代码。

    总结一下

    自顶向下的编程思路适合规模较小、需求高度稳定、短期项目。思路的重点的问题分解。简单直接好理解,上手速度快,代码运行效率高。如果你给别人做外包开发,相信这种编程思路是最佳选择。

    自底向上的编程思路是否规模较大、需求变化较多、长期项目。思路的重点是设计描述语言。思维过程复杂,运行效率略低。初期上手速度慢,后期随着复用程度的提高,开发会有加速效应。如果你做一个自己的研究项目,应当尝试这种编程思路。

     

    展开全文
  • 构建之法 学习笔记01

    2017-04-08 21:33:00
    起初我只是在专业要求的硬性规定下去接触了这本《构建之法》,然后仔细下来之后确实让我受益匪浅,让我更切实的了解了这个行业。这本书对我来书最实用的地方在于,在高大上的理论之后会有具体的实例来帮助理解。...

    起初我只是在专业要求的硬性规定下去接触了这本《构建之法》,然后仔细的看下来之后确实让我受益匪浅,让我更切实的了解了这个行业。这本书对我来书最实用的地方在于,在高大上的理论之后会有具体的实例来帮助理解。在介绍方法论的同时,会介绍方法论不适用的场景,介绍方法论在现实中是怎样跑偏——什么叫宏观视角?什么叫最佳实践?什么叫算无遗策?就像画一棵决策树,向哪个分支走,结果会怎么样,清清楚楚,明明白白,让人信服。能让学生了解到工作中接触的种种角色及其想法、诉求,避免“以程序为中心”思考问题,而懂得以人为中心来思考,毕竟程序要解决的,是人的事情。这个思想的转变,对程序员来说,至关重要。

    这本书几乎涵盖了现代软件工程的全部。

    第一章写的是软件工程的发展史,从开始到应用,所经历的过各种变化;

    第二章编程代码要要懂得团体的力量,合作取得双赢,向我们讲诉的单元测试,回归测试,效能分析工具。但是读第二章是很多内容对我来说有些晦涩难懂,好多都要靠百度的帮助才能理解;

    第三章提到了成为软件工程师所要具备的条件,分别是:1.积累软件开发相关知识,提升技能技术。2.积累问题领域的知识和经验。3.对通用的软件设计思想和软件工程的理解;

    第四章讲“这样走,之后的发展会怎样怎样,所以不行”,怎样做会对,怎样做会错——什么叫宏观视角?什么叫最佳实践?什么叫算无遗策?就像画一棵决策树,向哪个分支走,结果会怎么样,清清楚楚,明明白白,让人信服。整体力量是无穷的;

    第五章为我们介绍了团队合作的几种模式,以及团队中的几种开发流程。让我明白从现在开始就应该着重培养自己的团队合作意识。

    希望在之后的阅读中能进一步完善自己的知识,从中得到更多。

     

    转载于:https://www.cnblogs.com/ly1128/p/6683139.html

    展开全文
  • 都说万事开头难,要找女生聊天不知道怎么开头最难受了,聊天开场白话术900...在刚开始的时候有木有发“您好,你叫什么?在干什么这类的”。通常女孩见到你发的那样开场白,和你再次闲聊就非常少了,更不必说还想和...

    都说万事开头难,向要找女生聊天不知道怎么开头最难受了,聊天开场白话术900句让你轻松开始和女生聊天。都有哪些开场白会引起女生的注意呢?下面就和恋爱聊天话术网一起看看聊天开场白话术900句都有哪些吧!

    a499c40d29951a4d96cd37b1b5f92ec8.png

      1、神秘开场白

      仔细回想一下你自个是如何和女生聊天开场白的?在刚开始的时候有木有发“您好,你叫什么?在干什么这类的”。通常女孩见到你发的那样开场白,和你再次闲聊就非常少了,更不必说还想和你发生点事情了。和女生聊天神秘聊天开场白是可以吸引住另一方可以积极了解你。比如:

      男生:刚刚我好像在路边看到和你头像很像的人,说,是不是你!

      女生:在哪?穿啥衣服的?

      一旦女生主动询问,证明你至少引起她的好奇心,接下来,你就可以自由发挥了。

      2、自问自答开场白

      什么是自问自答开场白呢?这里不是教你自己一个人神神叨叨说半天,而是当你向女生提问后,给出自己的答案,贡献自己的语言价值。比如:

      男生:你知道世界最甜的东西是什么?

      女生:(思考中)…

      男生:你的答案是不是糖?

      女生:难道不是吗???

      男生:其实最甜的是人的嘴。

      女:啊,你说的是你自己吗?

      在和女生聊天开场白的时候,永远不要存着等对方回答的心里,最好的当然是对方等着你了。

    c7084995580bec39125f86efe7051844.png

      3、开放式开场

      如何才能追到女生?最重要的是不要过多暴露你的需求感,顺其自然就在一起了。很多时候,我们和女生聊天开场白,不是为了得到女生的答案,而是为了彼此能够互动。说到这里,向女生提问题的时候,千万不要给她两个答案,不然有可能她只有沉默了。

      男生:你喜欢什么样的小动物呀?

      女生:猫狗都还行,不过我最喜欢的宠物是仓鼠(额外信息)。

      开放式提问还能得到一些你不知道的女生信息。

      4、逗比开场白

      一个幽默逗比的开场白,容易受到女生青睐,也给女生透露出一个信息,就是你比较幽默,这样的男生一开始就获得了女生的好感。而且,如果你什么都以玩笑的口吻说,那么女生也不会对你的情话

      有太大的压力,你也可以试探出对方的态度。

      男生:如果我爱你,你会怎么办?

      女生:……

      男生:要是我的话,我会说,我爱逗比。

    ca13bcb0e87308fc9d82def9af09af90.png

      像这种情话套路,用逗比的形式说出来,可能一次两次女生会拒绝,但是随着你们的接触,慢慢的女生就接受了你的这种方式了。当然,你在具体的环境,具体的女生中,要灵活运用。有的女人不喜欢严肃,你就幽默。有的女生喜欢文字,你就陪她看完一本小说。有的女生喜欢旅行,你就和她一起游山玩水。

      第一次和女生聊天开场白怎么聊?最重要的是要合乎女生的心意,那么要怎么才能知道女生的喜好呢?如果有共同朋友,可以先通过第三方先了解她。如果没有共同朋友,可以通过观察朋友圈、说说一类观察,再不济,那就在聊天过程中观察吧!

        以上内容选自月老恋爱学,里面包含10万恋爱话术和上百聊天实战案例,可以帮您形象塑造,打造微信朋友圈,提高情商,以及上千撩妹套路,一定可以帮您抱得美人归!

    【安卓版】下载地址:http://ylx521.com(打开链接,找到【软件下载】下载)

    下面,我给大家介绍一下软件的页面:

    7d917befea54df976e10a943def5bfd2.png

    苹果版使用方法:

    打开你的手机本身自带浏览器,进入月老恋爱学网页版:http://ylx521.com, 选项, 添加到桌面, 桌面就有了软件

    c858e816d5fc3637c6669293c1dfc0d8.png

    下面我给大家演示一下软件怎么使用!

    当你像一个女生表白时,她问你”你喜欢我什么“

    这个时候 ,你把她说的话-----你喜欢我什么,复制进去,系统就会出来多种答案

    ea813fba63d95c6cb51a42e676718dcd.png

    看到这么多答案,是不是感觉特别神奇,那就赶快去下载吧!

    软件下载地址:http://ylx521.com(打开链接,找到【软件下载】下载)

    展开全文
  • 21.看得懂的书,请仔细看;看不懂的书,请硬着头皮看; 22.别指望看第一遍书就能记住和掌握什么——请看第二遍、第三遍; 23.请看《Effective C++》和《More Effective C++》以及《Exceptional C++》; 新:23....
  • 他们把礼物又拿出来仔细一遍。有一个基尔斯汀的园丁和一个奥勒的园丁,他们是一对夫妇。他们在地主庄园里锄草锄地,所以有住处和每日的面包。每年圣诞节他们都得到很好的礼物。他们有五个孩子,五个孩子穿的...
  • 计算机实习日记

    2011-11-26 12:22:41
    今天技术部有经验的同事给我仔细讲解了公司软件产品安装和维护中的每一款注意事项,还现场演示了公司的一款“商业银行综合柜面业务实训教学软件”的软件产品的安装流程以及操作系统、软件系统的配置。 下午我公司...
  • java 面试题 总结

    2009-09-16 08:45:34
    通常性能上较ArrayList差,而LinkedList使用双向链表实现存储,按序号索引数据需要进行前或后遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快。 8、EJB是基于哪些技术实现的?并说出Session...
  • 网络上没有什么比较容易简单的文档让你去熟悉Apps DBA,所以我建议去帮助。 2.在你没有经过多次测试并且得到客户认可的时候不要去打补丁,并且你要确信这个补丁解决了现有的问题,而且没有带来其它新的问题。 3...
  • 并利用具体的例子来全面介绍每个特性,不仅讨论了各个特性是什么,还说明了它是如何工作的,如何使用这个特性来开发软件,以及有关的常见陷阱。  本书面向所有oracle 数据库应用开发人员和dba。 作译者 作者  ...
  • 1-8 什么叫二进制?使用二进制有何优点和缺点? 解: 二进制是基数为2,每位的权是以2 为底的幂的进制,遵循逢二进一原则,基本符号为0和1。采用二进制码表示信息,有如下几个优点:1.易于物理实现;2.二进制数运算...
  • 但是文档中没有实战用例,没有告诉我们哪些可行或者哪些不可行,什么情况下可行或者什么情况下不可行,为什么可行或者为什么不可行,它只是“公事公办”为你呈上厚厚的一摞文字,告诉你情况就是这样,你自己看着办吧...
  • c#学习笔记.txt

    热门讨论 2008-12-15 14:01:21
    我觉得这样做未免有些太霸道了,如果你说这偏执狂我也不反对,虽然我是狮子座,可也不想被人这样。 在C#刚刚推出的时候,大多数的程序员都不免吼上两句——不是因为高兴,而是因为又多了一种语言。他们觉得现在...
  • 接下来会仔细地对上面每一个部分进行解释。完本文,就应该能理解上图中的各部件之间的交互流程。 前端架构 把上图的前端部分单独抽出来进行研究: <p><img alt="simple-front" src=...
  • 返回名字 home 的视图给用户。这个视图文件在哪里呢?在 <code>learnlaravel5/resources/views/home.blade.php</code>,blade 是 Laravel 视图系统的名字。 <h3>blade 浅析 <p>blade 会对视图文件进行...
  • 软件工程教程

    热门讨论 2012-07-06 23:10:29
    找电杆撞下,是否用面向对象方法 用 类图 的危险! 类图用滥了,建狗屋画了10页类图 类图没分清粗细层次: 概念类图 规约类图 实现类图 鸟类图 鸟类图 鸟类图 实例:监听器类图 使用类图的建议 不要试图使用...
  • 大话数据结构

    2019-01-10 16:35:22
    感情上发生了问题,为了女友解释一下,我准备发一条短信,一共打了75个字。最后八个字是“我恨你是不可能的”,点发送。后来得知对方收到的,只有70个字,短信结尾是“……我恨你”。 5.5.1串的顺序存储结构 129 ...
  • 大话数据结构 程杰

    2018-09-01 10:06:43
    感情上发生了问题,为了女友解释一下,我准备发一条短信,一共打了75个字。最后八个字是“我恨你是不可能的”,点发送。后来得知对方收到的,只有70个字,短信结尾是“……我恨你”。 5.5.1串的顺序存储结构 129 ...
  • 软件测试规范

    2018-04-23 09:16:12
    1.什么是软件测试 .................................................................................................................................. 2 2.软件测试的目标 ....................................
  • 5.3 串的比较 126 5.4 串的抽象数据类型 127 5.5 串的存储结构 128 感情上发生了问题,为了女友解释一下,我准备发一条短信,一共打了75个字。最后八个字是"我恨你是不可能的",点发送。后来得知对方收到的,只有...
  • 大话数据结构-程杰

    2014-07-13 23:45:52
    感情上发生了问题,为了女友解释一下,我准备发一条短信,一共打了75个字。最后八个字是"我恨你是不可能的",点发送。后来得知对方收到的,只有70个字,短信结尾是"……我恨你"。 5.5.1 串的顺序存储结构 129 ...
  • 感情上发生了问题,为了女友解释一下,我准备发一条短信,一共打了75个字。最后八个字是“我恨你是不可能的”,点发送。后来得知对方收到的,只有70个字,短信结尾是“……我恨你”。 5.5.1串的顺序存储结构 129 ...
  • 感情上发生了问题,为了女友解释一下,我准备发一条短信,一共打了75个字。最后八个字是“我恨你是不可能的”,点发送。后来得知对方收到的,只有70个字,短信结尾是“……我恨你”。 5.5.1串的顺序存储结构 129 ...

空空如也

空空如也

1 2
收藏数 22
精华内容 8
关键字:

向仔细看叫什么