精华内容
下载资源
问答
  • in nek:状态机退出方法​zhuanlan.zhihu.comin nek:不为天下先2​zhuanlan.zhihu.com目的基于这两个文档的一些场景,进一步讨论一下什么样的逻辑属于设计文档,什么样的逻辑属于代码逻辑。我以前就写过一些讨论...

    本文是对这两个文档的总结:

    in nek:状态机退出方法zhuanlan.zhihu.com
    in nek:不为天下先2zhuanlan.zhihu.com

    目的是基于这两个文档的一些场景,进一步讨论一下什么样的逻辑属于设计文档,什么样的逻辑属于代码逻辑。

    我以前就写过一些讨论,谈到“代码不能代替设计文档”,或者“这样的逻辑不属于设计文档,它应该属于编码”。但我没有更好的逻辑来更直接地说明这两个结论的原因。但有了这两个推演,我想我有更好的逻辑来描述这两个问题了。

    在上面这个状态机退出方法的讨论中,我给出了三个独立的逻辑:

    1. 状态机
    2. 把刺激通道化,排队化(比如通过锁或者排队设计)
    3. 状态退出过程保护

    我认为,这些东西,就是“设计逻辑”。比如你定义系统有5个状态,在每个情形下做什么,然后看有没有状态的处理是不对的。

    这种东西靠看代码是看不出来的(除非你对着代码重新画一次),在代码升级、修改的时候不看着这个状态机,你代码写得对不对,你也是不能肯定的,它非常烧脑。

    这种逻辑就属于设计文档。

    反之,如果你写,在abc_op1()的时候,先上A锁,然后修改x变量,然后给T发一个信号,然后修改状态到sx2,然后解A锁。这个就不属于设计文档的逻辑了,因为这种东西和代码的逻辑是重叠的,在设计文档中写好了,搬到代码去都一样,拿个Word,Latex之类的东西写出来,还不如直接写到代码中呢,你写成文档,还需要同步,这完全吃饱了撑的,这就属于浪费时间了。

    同样的,你写对刺激排队的策略,你说你把什么行为看做是对状态机的刺激,他们有哪些线程(包括中断等)可以把刺激送进来,你用什么锁来保证进去以后相关的执行过程可以排队。这个逻辑就属于文档。但你讨论每个刺激函数怎么写,这个就不是设计了。这是编码,就算不写在.c,.go中,它们依然是代码。

    就算你进行抽象,比如abc_op[1..3]()的行为是这样这样……,abc_op[4..5]()的行为是那样那样。这仍属于编码。因为他们并不是独立于代码的建模。关键是这些逻辑写在文档中,没有一个明确的逻辑链可以验证它对不对。你既没有说这些opX是你的操作的全集,也没有说他们属于哪个线程,也没有和状态机的维护关联在一起。这里就没有独立的逻辑链可以建。这个逻辑独立到文档中的意义在哪里?它的逻辑对还是不对?不看代码都不会知道。既然如此,把它写出来,作为代码之外的独立推演,有什么用?

    其他的,我们总共有多少模块,模块间关系是什么。有多少版本,版本间什么关系。整个API系列是怎么样的,能否通过全部列出来,进行一个全局Review,看看是不是丢了一个维护接口导致API空间不自恰(比如有创建没有释放,有保存没有恢复等)……这些逻辑,都属于设计文档。有时,流程确实也可以属于文档,只是那个流程非常关键,需要被独立抽取出来,避免和代码中其他逻辑混在一起无法辨认,等等。

    设计文档是补充编码之外的独立逻辑,常常还是在更高一层抽象,判断全局的东西是否发生的缺失,不自恰,这一类问题的。

    正如我们在《不为天下先2》中提到的,架构(高层)设计的目的不是下层设计的预演,它工作在另一层逻辑上,它是预期下一层设计是要加入新的逻辑的,但它为下一层设计设定另一层逻辑的限制,保证下一层设计可以聚焦,我们推演完了状态机。下一层只要考虑我现在是从什么跳到什么上,不需要再担心这样跳法会不会出什么问题。推演完锁的原则,下一层设计只需要考虑设定的锁的原则,什么情况用什么锁,就可以保证不会发生死锁,或者不会在某个流程中少用了锁。每个逻辑属于什么层次的设计,其实大部分时候是有明显的分界的,它们通常通过逻辑链的关联度进行分层隔离,比如某个逻辑要素不在和任何人相关,它就会被独立出来,它就会属于那一层,这样代码才有立体一说。否则就又都压平了。


    补充:提供一个例子:Linux内核mm/filemap.c最前面,有一大段关于锁的策略的描述。这就是设计逻辑——如果代码就可以表示所有逻辑,这里这个注释是为了干什么?

    展开全文
  • 根据错误信息,你能够了解究竟是什么情况引发了什么样的错误。同样地,黑客也能够通过错误信息,推断出你的后台代码逻辑。那么,黑客究竟是怎么做的呢?接下来,我们就一起看一下这个过程。 为什么错误信息会泄露...

    在这里插入图片描述

    你平时在 Debug 的时候,一定首先会去查看错误信息。根据错误信息,你能够了解究竟是什么情况引发了什么样的错误。同样地,黑客也能够通过错误信息,推断出你的后台代码逻辑。那么,黑客究竟是怎么做的呢?接下来,我们就一起看一下这个过程。

    为什么错误信息会泄露代码逻辑?

    当黑客在登录某个页面时,在用户名位置输入一个单引号,在密码位置输入一个“g”之后,就会出现如下的错误信息。

    An Error Has Occurred.
    Error Message:
    System.Data.OleDb.OleDbException: Syntax error(missing operator) in query expression 'username = ''' and password = 'g''. at
    System.Data.OleDb.OleDbCommand.ExecuteCommandTextErrorHandling ( Int32 hr) at
    System.Data.OleDb.OleDbCommand.ExecuteCommandTextForSingleResult ( tagDBPARAMS dbParams, Object& executeResult) at
    

    从这个错误信息中,我们可以看到,网页最终执行了一个 SQL 语句,这个 SQL 语句的部分内容为username = ‘’’ and password = ‘g’。因此,后台的大致逻辑应该是下面这样的。

    第一,错误信息反馈的是 Syntax error,即语法错误。在密码位置输入单个字母“g”肯定不会引起错误,所以,这个 SQL 语句是因为多了一个单引号导致的报错。而如果使用了 PreparedStatement 等方法,是不会产生这个错误的。因此,后台的 SQL 查询应该是直接采用的字符串拼接,且没有过滤单引号。

    第二,错误信息中显示了部分的 WHERE 条件是username = ‘’ and password = ‘’。这又是一个登录的逻辑,所以,只要用户名和密码正确,这个 SQL 语句会返回黑客需要的用户信息。因此,后台的 SQL 语句应该是形如 select from where 的格式。

    根据这些信息,黑客很容易就可以发起 SQL 注入攻击了。

    那错误信息中包含的敏感信息这么多,怎么避免被直接展示到前端呢?我们可以通过正确地配置文件,来进行合适的错误处理。比如,在 PHP 中,我们可以进行如下配置:

    error_reporting = E_ALL ;向PHP报告发生的每个错误
    display_errors = Off ;不显示满足上条指令所定义规则的所有错误报告
    log_errors = On ;决定日志语句记录的位置
    log_errors_max_len = 1024 ;设置每个日志项的最大长度
    error_log = /var/log/php_error.log ;指定产生的错误报告写入的日志文件位置
    在 Java Spring 中,我们也可以通过配置ExceptionHandler等来进行处理。
    

    避免错误信息泄露代码逻辑,一方面是要通过正确地配置文件,避免错误信息被展示到前端;另一方面是要对错误信息进行检测,这里就需要用到“黑盒”检测了。

    所谓“黑盒(Black Box Testing,功能测试)”,就是在不获取代码的情况下,直接运行应用,然后对应用的请求和响应进行扫描。比如,在错误信息泄露的场景中,“黑盒”检测可以向应用发起一些必然会导致错误的请求(比如上述例子中的单引号),然后观察应用是返回完整的错误日志,还是返回某些经过处理的页面。

    好了,现在你应该明白了,为啥错误信息会泄露代码逻辑。实际上,错误信息泄露属于一种间接的信息泄露方式。间接的信息泄露方式主要是通过拼凑各种零散信息,还原出代码整体的面貌,然后有针对性地发起攻击。所以我们常说,黑客的攻击本身就是一个“聚沙成塔”的过程。

    除了错误信息,还有什么地方会泄露代码逻辑?

    除了错误信息之外,间接的信息泄露方式还有两种:返回信息泄露和注释信息泄露。

    注释信息你应该很熟悉。因为所有的前端代码基本都不需要编译就可以展示在浏览器中,所以黑客很容易就可以看到前端代码中的注释信息。但是,如果这些注释信息中出现服务器 IP、数据库地址和认证密码这样的关键信息。一旦这些关键信息被泄露,将会造成十分严重的后果。

    那该如何避免关键的注释信息出现在线上的代码中呢?我们经常会使用一种叫作“白盒”的代码检测方法。

    所谓“白盒(White Box Testing,结构测试)”,即直接获取到线上的源代码,然后对它进行扫描。“白盒”扫描注释信息的原理比较简单,因为每一种语言的注释都会带有特殊的标记(比如 Java 和 PHP 中的 /* 等),可以比较准确地被识别出来。除此之外,“白盒”检测通常还会被用来做一些检测代码漏洞或者逻辑漏洞的工作,这一块比较复杂,现在你只需要有一个大概印象即可,我们会在后续的课程中专门来讲。

    简单了解了注释信息泄露,我们下面重点来看返回信息泄露。

    你可以回忆一下,在前面讲SSRF攻击的时候,我们模拟过这样一个场景:服务端在请求一个图片地址的时候,会根据地址的“存活”情况和返回数据的类型,分别返回三种结果:“图片不存在”“格式错误”以及图片正常显示。而黑客正是通过服务端返回信息的逻辑,利用一个请求图片的 SSRF,摸清整个后端服务的“存活情况”。

    类似的多种返回状态的场景还有很多,你可以想想自己平时工作中有没有遇到过。这里我再说一个常见的。当你在登录应用的时候,应用的返回逻辑可能是这样的:如果输入的用户名和密码正确,则登录成功;如果应用没有这个用户,则返回“用户名不存在”;如果输入的用户名和密码不匹配,则返回“密码错误”。

    尽管这样清晰的登录提示对于用户体验来说,确实是一个较优解,但这个逻辑同样也暴露了过多的信息给黑客。黑客只需要不断地发起登录请求,就能够知道应用中存在的用户名,然后通过遍历常见的弱密码进行尝试,很容易就能够猜对密码。这样一来,猜对密码的成功率就比尝试同时猜测用户名和密码要高很多。

    实际上,返回信息过于明确不算是代码层面的漏洞,更多的是产品层面的漏洞。因此,理论上没有任何技术手段能够对这种漏洞进行检测,只能依靠人为的分析审计来避免。解决方案也比较简单,直接将返回信息模糊化、统一化即可。比如,在上述登录的场景中,我们可以将两种登录失败的返回信息,统一修改为“用户名不存在或密码错误”。这样一来,既避免了用户体验受到太大影响,又消除了关键信息被黑客获取的隐患。

    有哪些常见的直接泄露方式?

    在间接的泄露方式中,黑客可以通过“蛛丝马迹”,推断出服务代码的逻辑。但是信息泄露最普遍的方式还是直接泄露 。这里我会讲两种常见的直接泄露方式。

    第一种泄露方式与版本管理工具中的隐藏文件有关。

    在开发应用的过程中,你一定使用过版本管理工具(比如 SVN 和 Git),通过这些工具,你能够很方便地进行代码回滚、备份等操作。那你有没有想过,版本管理工具为什么这么方便呢?它的工作原理又是怎么样的呢?我们以 SVN 为例来说一说。

    SVN 会在项目目录中创建一个.svn 文件夹,里面保存了应用每一个版本的源文件信息,这也是 SVN 实现代码回滚的数据基础。如果 SVN 可以通过.svn 中的数据提取应用任意版本的代码,那黑客也可以。只要你没有在上线代码的时候删除其中的.svn 目录,那就代表黑客可以通过.svn 中的 URL 访问里面的所有文件。接下来,只需要通过执行简单的脚本,黑客就可以回溯出一个完整版本的代码了。

    对于这种因为目录中额外内容(.svn/.git)导致的源码泄露,我们一方面需要对线上代码进行人工的代码审查,确保无关的文件和文件夹被正确地清除;另一方面,我们也可以在 HTTP 服务中对部分敏感的路径进行限制。比如,在 Apache httpd 中配置下面的内容,来禁止黑客对.svn 和.git 目录的访问。

    <DirectoryMatch \.(svn|git)>
      Order allow,deny
      Deny from all
    </DirectoryMatch>
    

    除此之外,还有一种最常见、也最不容易注意的泄露方式,那就是上传代码到 GitHub 上。

    我们知道,Git 除了是一个版本管理工具之外,还是一个很流行的代码管理工具。除了前面讲过的隐藏文件漏洞之外(Git 会生成.git,同样包含应用各种版本的文件信息),Git 还存在将代码上传到公开平台的问题。但是,使用 GitHub 上传代码通常属于个人行为,所以,我们很难从技术层面上进行预防。

    那我们有没有一些有效的防护措施,可以尽可能地提高安全性呢?

    我个人认为,公司应该从加强员工安全意识的培训、强化公司管理制度入手,避免员工私自上传代码。除此之外,公司还可以对 GitHub 发起巡检(比较知名的工具有Hawkeye),通过定期检索公司代码的关键字(比如常用的包名、域名等)来进行检测。通过这些方式匹配到的结果,很可能就是员工私自公开的代码。确认之后,我们就可以联系上传的人员进行删除了。

    总结

    好了,今天的内容讲完了。我们来一起总结回顾一下,你需要掌握的重点内容。

    信息泄露这类漏洞很容易理解,但它能够造成的危害却不容小觑。基本上,所有攻击的第一步都是从信息泄露开始的。而且黑客没有办法攻击一个未知的系统,所以黑客会通过这些泄露的信息,去推断出应用的整体架构和逻辑。

    信息泄露的方式和原因有很多,这其中,除了黑客主动发起攻击导致的信息泄露之外,有很多非技术原因导致的信息泄露。所以,相应的防护手段也比较零散。不过总体来说,我们可以从以下几个方面进行防护:

    • 屏蔽信息:通过技术手段,将不该被访问的资源进行屏蔽,从而避免信息泄露的产生;
    • 代码检测:从“白盒”和“黑盒”两个方向,对代码、应用等进行检测,对可能的泄露进行预警;
    • 人工审计:对于非技术原因造成的泄露,加强人工审计的工作。同时从公司制度上,去提高员工的安全意识。

    今天的内容虽然比较简单,但是为了方便你记忆,我还是总结了一张知识脑图,你可以利用它来查缺补漏,加深记忆。
    在这里插入图片描述

    思考题

    最后给你留一个思考题。

    通过今天的讲解,你可以回忆一下,你的公司或者你负责的应用当中,是否发生过类似的信息泄露事件呢?如果发生过,对你的公司或者应用都造成了什么影响呢?最后又是如何解决的呢?

    欢迎留言和我分享你的思考和疑惑,也欢迎你把文章分享给你的朋友。我们下一讲再见!

    下一讲

    插件漏洞:我的代码看起来很安全,为什么还会出现漏洞?

    展开全文
  • 业务逻辑是什么

    2018-12-12 14:37:52
    本篇分享的是:业务逻辑是什么? 不同的项目有不同的功能,不同的功能需要不同的实现,实现这些核心功能的代码就叫业务逻辑。 就像你家的规矩–“吃饭前必须洗手”“有客人来要起立”“睡觉前各自说晚安”-就是...

    这里是修真院前端小课堂,每篇分享文从

    【背景介绍】【知识剖析】【常见问题】【解决方案】【编码实战】【扩展思考】【更多讨论】【参考文献】

    八个方面深度解析前端知识/技能。

    本篇分享的是:业务逻辑是什么?

     

    不同的项目有不同的功能,不同的功能需要不同的实现,实现这些核心功能的代码就叫业务逻辑。 就像你家的规矩–“吃饭前必须洗手”“有客人来要起立”“睡觉前各自说晚安”-就是业务逻辑的生活化实例。

     

    (2)知识剖析:

     

    在软件系统架构中,软件一般分为三个层次:表示层、业务逻辑层和数据访问层:

    表示层:负责界面和交互; 业务逻辑层:负责定义业务逻辑(规则、工作流、数据完整性等),接收来自表示层的数据请求,逻辑判断后,向数据访问层提交请求,并传递数据访问结果,业务逻辑层实际上是一个中间件,起着承上启下的重要作用; 数据访问层:负责数据读取。

     

    (3)常见问题:

     

    如何理解业务逻辑

     

    (4)解决方案:

    以大毛网购裤子为例 领域实体:大毛、资金账户、订单、裤子、发货单 业务规则:大毛点击购买就会生成订单,但必须付了钱,才会发货,生成发货单。 数据完整性:淘宝网下订单必须登录账号,没有账号就不能成功购买。 工作流:搜索裤子-找到合意裤子-下单购买-付账-收货。 业务逻辑:搜索“裤子”-找到合意裤子-下单-必须登录账号-结算-付账-收货。

    5.编码实战

    DEMO

    杀人和投票页面

    首先你要制定规则,如何才是死亡,死亡的人不能被点击,杀手杀人规则,杀手如何胜利,投票规则,投票是如何投票, 如果平票应当如何,胜利的条件是什么。

     

    (6)拓展思考:

    业务流程和业务逻辑的区别

    逻辑更多的是页面之间的层级关系、承载信息和功能模块之间的关系的逻辑说明; 流程更多的是从用户视角的完整场景操作流程、交互流程、页面路径、更注重功能顺序步骤,职能划分和基本结构等; 简单来说,用户看到的叫流程,看不到的叫逻辑。通过业务逻辑来调动业务流程

    (7)参考文献:

    https://blog.csdn.net/qq_35038153/article/details/78951206

    (8)更多讨论:

     

    1,你对业务逻辑理解,

    不同的项目有不同的功能,不同的功能需要不同的实现

     

     

    2业务逻辑在项目上面

     

    你做项目之前,要分清楚逻辑,先去做什么后做什么,自己的逻辑要了解明白

     

    3杀人投票

     

    杀人投票的话不仅值不同,规则也不相同,多少有很多相似的地方。

     

    PPT链接 视频链接

     

    今天的分享就到这里啦,欢迎大家点赞、转发、留言、拍砖~

    ------------------------------------------------------------------------------------------------------------
    “我们相信人人都可以成为一个工程师,现在开始,找个师兄,带你入门,学习的路上不再迷茫。

    技能树.IT修真院

    展开全文
  • 最近时长在烦什么是业务逻辑,看了这一篇文章就大致了解了。 例子如下: 模拟组装2台电脑。 -----抽象层: 有显卡Card方法display,有内存Memory方法storage,有处理器CPU方法calculate -----实现层: 有intel...

    (面向对象)业务的分层架构处理,看了这一篇文章就大致了解了。

     

    例子如下:

    模拟组装2台电脑。

    -----抽象层:   有显卡Card方法display,有内存Memory方法storage,有处理器CPU方法calculate

    -----实现层:   有intel因特尔公司,产品有(显卡、内存、cpu),有Kingston公司,产品有(内存3),有NVIDIA公司,产品有(显卡)

    -----逻辑层:    1.组装一台intel系列的电脑,并运行。   2组装一台intel cpu Kingston内存NVIDIA显卡的电脑,并运行

    /*
        模拟组装2台电脑
        --- 抽象层 ---
        有显卡Card  方法display
        有内存Memory 方法storage
        有处理器CPU   方法calculate
    
        --- 实现层层 ---
        有 Intel因特尔公司 、产品有(显卡、内存、CPU)
        有 Kingston 公司, 产品有(内存3)
        有 NVIDIA 公司, 产品有(显卡)
    
        --- 逻辑层 ---
        1. 组装一台Intel系列的电脑,并运行
        2. 组装一台 Intel CPU  Kingston内存 NVIDIA显卡的电脑,并运行
    */
    package main
    
    import "fmt"
    
    //------  抽象层 -----
    type Card interface{
        Display()
    }
    
    type Memory interface {
        Storage()
    }
    
    type CPU interface {
        Calculate()
    }
    
    type Computer struct {
        cpu CPU
        mem Memory
        card Card
    }
    
    func NewComputer(cpu CPU, mem Memory, card Card) *Computer{
        return &Computer{
            cpu:cpu,
            mem:mem,
            card:card,
        }
    }
    
    func (this *Computer) DoWork() {
        this.cpu.Calculate()
        this.mem.Storage()
        this.card.Display()
    }
    
    //------  实现层 -----
    //intel
    type IntelCPU struct {
        CPU 
    }
    
    func (this *IntelCPU) Calculate() {
        fmt.Println("Intel CPU 开始计算了...")
    }
    
    type IntelMemory struct {
        Memory
    }
    
    func (this *IntelMemory) Storage() {
        fmt.Println("Intel Memory 开始存储了...")
    }
    
    type IntelCard struct {
        Card
    }
    
    func (this *IntelCard) Display() {
        fmt.Println("Intel Card 开始显示了...")
    }
    
    //kingston
    type KingstonMemory struct {
        Memory
    }
    
    func (this *KingstonMemory) Storage() {
        fmt.Println("Kingston memory storage...")
    }
    
    //nvidia
    type NvidiaCard struct {
        Card
    }
    
    func (this *NvidiaCard) Display() {
        fmt.Println("Nvidia card display...")
    }
    
    
    
    //------  业务逻辑层 -----
    func main() {
        //intel系列的电脑
        com1 := NewComputer(&IntelCPU{}, &IntelMemory{}, &IntelCard{})
        com1.DoWork()
    
        //杂牌子
        com2 := NewComputer(&IntelCPU{}, &KingstonMemory{}, &NvidiaCard{})
        com2.DoWork()
    }

    如果这个不行,那就在来一个例子:

    package main
    
    import "fmt"
    
    // ===== >   抽象层  < ========
    type Car interface {
        Run()
    }
    
    type Driver interface {
        Drive(car Car)
    }
    
    // ===== >   实现层  < ========
    type BenZ struct {
        //...
    }
    
    func (benz * BenZ) Run() {
        fmt.Println("Benz is running...")
    }
    
    type Bmw struct {
        //...
    }
    
    func (bmw * Bmw) Run() {
        fmt.Println("Bmw is running...")
    }
    
    type Zhang_3 struct {
        //...
    }
    
    func (zhang3 *Zhang_3) Drive(car Car) {
        fmt.Println("Zhang3 drive car")
        car.Run()
    }
    
    type Li_4 struct {
        //...
    }
    
    func (li4 *Li_4) Drive(car Car) {
        fmt.Println("li4 drive car")
        car.Run()
    }
    
    
    // ===== >   业务逻辑层  < ========
    func main() {
        //张3 开 宝马
        var bmw Car
        bmw = &Bmw{}
    
        var zhang3 Driver
        zhang3 = &Zhang_3{}
    
        zhang3.Drive(bmw)
    
        //李4 开 奔驰
        var benz Car
        benz = &BenZ{}
    
        var li4 Driver
        li4 = &Li_4{}
    
        li4.Drive(benz)
    }

    上面讲的的业务接口的一个设计,下面开始讲(小白的)业务逻辑是什么:

    业务逻辑就是每个公司都有自己的处理业务的一个思维;比如说:我买一辆车,买宝马,是不是先去数据库中查询一下这辆车是否存在,如果存在就把价格,生产日期什么的都给查询出来,在进行支付,在扣除钱款,在把车辆库存给扣除一辆,在进行一张表买车人的信息登记关联到已经卖过这辆车的那张表。  (这个简单的例子就是买车的业务逻辑啊,所以说需求不一样,业务逻辑就不一样,有的公司有流程图你看一下就明白了,剩下的就是增删改查了)

    展开全文
  • 比如我目前做的一个关闭订单的功能,传入的参数订单id, ...为什么代码里面第一行还是获取到订单,然后判断状态是否已关闭, 按理来说不应该只有未关闭的订单才会进来吗,这一步不是多余的吗。
  • 程序代码: #include #include #include using namespace std; clase U{ public: long id; long generation; static long total_copies; U():id(0){} U(long n):id(n),generation(0){} U(const U& z): i
  • ** //支付接口 public boolean pay() throws IllegalAccessException { PayWayRecord payWayRecord = psyService.getPayWay(PayWayEnum.TONGTONG.getCode()); Map, String> ... 代码已经贴上望大神指点
  • 禅道的代码是什么名字 在代码审查中 ,开发人员需要从两个不同角度查看代码: 正确性。 该代码逻辑上是否正确,是否按照预期的方式工作? 它会在现实世界中保持吗? 安全吗? 它可以处理错误和异常吗? 是否...
  • 就我看来,一段程序,最该关注的逻辑表现”,次要的“性能”等问题的优化。当然,肯定也会有需要追求性能的场景,不过这并不“追求”出来的,而是在大量经验累计情况下做出的正确决策。就算在那种情况下,...
  • 用scrapy爬取中华英才网,抓取完毕发现职位数量和实际职位数量不一致,检查了代码逻辑应该不会出错,不知道是什么原因,能够证明解决吗?或者用scrapy-redis能够解决数据缺失的问题吗?求大神解答,拜托了!!
  • 什么是逻辑回归《机器学习实战》一书中提到:利用逻辑回归进行分类的主要思想:根据现有数据对分类边界线建立回归公式,以此进行分类(主要用于解决二分类问题)。由以上描述我们大概可以想到,对于使用逻辑回归...
  • 前言之前我们写的代码可能发现了,我们所写的...就显示学生信息页面结果如下可能结果并没有什么错误,结果也我们想要的结果不过大家看源代码就发现了我们页面代码和业务逻辑代码高度耦合在一起这就会让我们的代码...
  • 什么是业务逻辑

    万次阅读 多人点赞 2018-09-04 20:32:07
    不同的项目有不同的功能,不同的功能需要不同的实现,实现这些核心功能的代码就叫业务逻辑 比如让你实现一个功能,给你两个数,让你获取它的和,你所写的如何才能获得任意给定的两个数的和,...逻辑是指根据已有的信...
  • 最近看Python代码 按照一个函数递进的看下去,最后发现,遇到很多源码什么逻辑都没写,仅仅以一个pass 结尾  但却能得到应该得到的结果,这点真的很奇怪,上网查找后 觉得下面的说法还挺符合我的想法  在这里粘贴...
  • 什么是业务逻辑

    2019-09-30 13:00:25
    一般后台代码也分三层 action(controller) service DAO (这里的三层不是MVC)比如 我得到用户名 但是在存入数据库的时候 用户名字段应该前台的用户名加上当前日期拼成的字符串action或者controller层第一层 ...
  • 5 2 4 7 ... ... 两列数字, 左边全部数量 右边已发货的数量, 现在右边的2先和5匹配,还剩3个没发货的, 然后5变成3,右边的7再和3匹配 ,多余出4...最好用PLSQL语言来写,也可以用Java代码也行,拜托了!不管怎样先谢谢!
  • 什么样的代码好代码?... 代码逻辑清晰透明,层次分明 代码格式公整美观 性能效率高 安全性高 注释规范(传参说明(传参类型、参数作用)、时间、修改或添加时间备注、作者等信息) ...
  • 场景一:我想了个牛X的算法,我来实现一下,码代码ing…基础逻辑二十行,解决!等等,怎么报错了?啊,这里数据要转一下…啊,这个函数功能和想的不一样,我来自己写一个新的…顺利跑起来了!(一百行)我要把这个算法...
  • 我很佩服我们头,他在不看代码的情况下,就靠分析程序运行时的输入和输出,就能够知道那段代码是什么意思。这是值得我们学习的。实际上程序的输入和输出就是为了业务处理,要弄清楚代码逻辑,从分析输入和输出开始...
  • 什么是好的代码

    2017-10-18 21:14:41
    1.有简洁明了的注解 2.合理的封装 3.如果三层架构,那controller中就不要有代码逻辑 4.提供给前端人员的接口,注意思考,合理的封装可以极大的减少前端发送请求的次数
  • 两天前看测试环境报错还没在意,因为什么代码也没改而且正式系统上也没问题,再加上公司权限系统切换有问题,大家什么异常第一个就想到权限系统。今天发现正式库上也报错了,一直报超时。于是查问题,最终结果交接...
  • 什么是整洁代码

    2018-08-13 16:29:48
    代码逻辑应当直截了当,叫缺陷难以隐藏;尽量减少依赖关系,使之便于维护;依据某种分层战略完善错误处理代码;性能调至最优,省的别人做没规矩的优化,搞出一堆混乱来。整洁的代码只做好一件事。 —–Bjarne ...
  • 什么不在后面的Service层校验呢?原因:Service通用的,而调用方Controller有多个,每一个Controller代表一个业务,这些业务需要校验的数据又很难统一,所以,每一个Controller自己校验比较合适,Service只做...
  • 什么是逻辑删除?逻辑删除的本质修改操作,所谓的逻辑删除其实并不是真正的删除,而是在表中将对应的是否删除标识(deleted)或者说状态字段(status)做修改操作。比如0未删除,1删除。在逻辑上数据被删除的...
  • 什么是业务逻辑?

    千次阅读 2011-11-04 09:37:10
    但是什么样的算是业务逻辑如:上传一个文件,上传代码算是一个业务逻辑吗? 数据库操作增加时需要判断,和一些其它这算业务逻辑吗?(我觉得算) 但是hibernate又提供了一个离线查询对象(DetachedCriter),提供这...
  • 01 生活中,我们经常遇到以下问题如何预测一个用户是否购买某件商品?如何预测用户流失概率?如何判断用户的性别?如何预测用户是否点击某商品?如何判断一天评论正面还是负面?...
  • 代码是什么样的?

    2019-05-22 11:12:00
    简评: 好代码是什么样的?相信不同的人会有不同的看法,正如「一千个读者,就有一千个哈姆雷特」,关键在于你有没有自己的标准。 这篇文章是我个人很喜欢的一家公司 -Atomic Spin的 blog。其中的一位主管分享的...
  • 在Python中:1.任何非零数字或非空对象都为真2....布尔and和or运算符会返回真或假的操作对象Python中有三种布尔表达式运算符:1.X and Y2.X or Y3.not X代码示例:1、值比较会返回True或False作为其真值结果...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 17,400
精华内容 6,960
关键字:

代码逻辑是什么