用脚本构建的程序是怎么保持后期重构的健壮性的?
我一般使用的是强类型语言,比如java或者c++。但是我知道很多系统是用弱类型的脚本语言,比如豆瓣。
我尝试过弱类型开发,但是后期很难维护,具体表现是几乎无法重构。
是不是会有别的什么办法可以避免这个问题,或者可以支持到健壮的重构?
我一直对动态语言构建系统的维护方式比较好奇,求大神赐教!
——————————
看到很多大神都提到单元测试,确实是可以保证系统重构之后的稳定性
但是我写程序喜欢一边写一边微调程序结构(微重构),几乎很少单元测试,所以需要类型安全来做随时错误检测。 不知道这个是不是什么好习惯?
回复内容:
动态类型一时爽,项目大了人多了,维护起来都要命,别说重构了。一个API看起来会返回一个A,没人敢保证不会有1%的机会返回个null,再有0.01%的机会返回个B。一个小改动要往下看n层代码才放心,结果commit上去还是挂了。
Facebook就知道错了,搞了个Hack抢救一下…… 不管是什么语言,重构要保持健壮性靠的都是大量的单元测试。这不是脚本独有的问题。 无他,大量可回归的单元测试,集成测试。 多回复一点,其实 @vczh前面说的没错,但是却是个悖论.因为很多时候,人们用脚本语言就是图的开发速度,现在为了让它健壮还得尽可能的单元测试覆盖,老实说,脚本多用在业务逻辑多且变化频率大的领域,单元测试写起来实在蛋疼.
这就好比,本身你用A是为了好处B,但是为了弥补A的缺陷又不得不做一些事情要牺牲好处B.
所以说,个人认为单元测试覆盖对脚本语言开发的项目是个悖论.
我的想法是自己权衡吧,想快赶紧上的时候就脚本,后面不行了再慢慢改回编译型.
鱼和熊掌,不可兼得也. 脚本就是这样啊, 火葬场了之后爬出来, 赶快来个热更新就是了.
上帝给你堵住了一扇门, 还会给你开一道窗子 系统的健壮性更多的时候取决于其架构,如何隔离错误。比如 Chrome 用多进程架构避免渲染引擎和插件的崩溃,Python Web Server 利用异常捕捉隔离独立 HTTP 请求的业务错误。
系统的可维护性取决于如何设计系统的模块划分,如何规范模块的外部接口和模块间的通讯,如何降低模块间的耦合度,以使重构影响更少的模块。
设计实践是编译器检查不出来的。 首先,看起来你想说的是静态/动态语言而不是强弱类型的问题,类型强弱跟是否编译语言没有绝对关系,也跟是动态还是静态语言是两回事儿。其次,我其实是 @vczh 这个萝莉控的敌对阵营,但是为啥老是想给他点赞呢? 前期设计再棒也是无法抵消后期代码熵增的。
java 这样的强类型语言,只能说在IDE的帮助下进行变量/方法重命名,方法提取……等基础重构策略时,比较容易操作。
我们可以把类型检查视为它的内建约束。这些内建约束只能缓解一部分问题。许多需要大规模重构的场景,强类型语言和弱类型语言面临的问题没有差异。
反而是许多弱类型语言,以 ruby 为例,在 ducktype 机制的作用下,逻辑编写十分灵活,许多场景下代码反而是更易维护。
综合来说,解决之道唯有进行严格的测试驱动开发。
测试是很好的手段,能按照自己的想法在各个层面去为代码添加约束。而不是仅仅依赖所谓的类型检查。
测试驱动开发,而不是开发完了再去用所谓单元测试检查扫尾。
这是完全不一样的两种开发思路。
前者会导致代码设计的持续改进。是后者不能比拟的。
用测试去尽可能覆盖需求。进行bugfix时也使用测试驱动。
在持续的代码提交中,逐步提高测试覆盖率。
架设CI服务,如果是github上的项目可以用 https://travis-ci.org/
掌握撰写测试的方法,形成写测试的思想,在此基础上花时间积极重构。
别无他法。 测试脚本:单元测试、接受性测试、压力测试,如果想东西靠谱,一个都不能少。TDD、BDD之说有效的。至于覆盖率的问题,可以后续完善,但必须要由,测试脚本和财富一样是需要积累的。
CI:前面 @宋亮 提到持续集成,这个是也必须的。重复的事情必须要交给机器,人负责创造性的东西。
前提:业务不能重构,否则测试用例和脚本就得重来。
盲区:前端自动自动化测试,主要是浏览器渲染走样的问题。貌似stackoverflow上有人提过原型图片像素比对的方式做断言,但没实践过。 最初设计的时候应该也是分了模块的,接口也应该设计好了的
重构的使用范围应该限定在模块内部的实现,而即使模块内部的改动即使对模块来说也应该不是太大的吧。

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

Java 8引入了Stream API,提供了一種強大且表達力豐富的處理數據集合的方式。然而,使用Stream時,一個常見問題是:如何從forEach操作中中斷或返回? 傳統循環允許提前中斷或返回,但Stream的forEach方法並不直接支持這種方式。本文將解釋原因,並探討在Stream處理系統中實現提前終止的替代方法。 延伸閱讀: Java Stream API改進 理解Stream forEach forEach方法是一個終端操作,它對Stream中的每個元素執行一個操作。它的設計意圖是處

PHP是一種廣泛應用於服務器端的腳本語言,特別適合web開發。 1.PHP可以嵌入HTML,處理HTTP請求和響應,支持多種數據庫。 2.PHP用於生成動態網頁內容,處理表單數據,訪問數據庫等,具有強大的社區支持和開源資源。 3.PHP是解釋型語言,執行過程包括詞法分析、語法分析、編譯和執行。 4.PHP可以與MySQL結合用於用戶註冊系統等高級應用。 5.調試PHP時,可使用error_reporting()和var_dump()等函數。 6.優化PHP代碼可通過緩存機制、優化數據庫查詢和使用內置函數。 7

PHP和Python各有優勢,選擇應基於項目需求。 1.PHP適合web開發,語法簡單,執行效率高。 2.Python適用於數據科學和機器學習,語法簡潔,庫豐富。

PHP適合web開發,特別是在快速開發和處理動態內容方面表現出色,但不擅長數據科學和企業級應用。與Python相比,PHP在web開發中更具優勢,但在數據科學領域不如Python;與Java相比,PHP在企業級應用中表現較差,但在web開發中更靈活;與JavaScript相比,PHP在後端開發中更簡潔,但在前端開發中不如JavaScript。

PHP和Python各有優勢,適合不同場景。 1.PHP適用於web開發,提供內置web服務器和豐富函數庫。 2.Python適合數據科學和機器學習,語法簡潔且有強大標準庫。選擇時應根據項目需求決定。

PHPhassignificantlyimpactedwebdevelopmentandextendsbeyondit.1)ItpowersmajorplatformslikeWordPressandexcelsindatabaseinteractions.2)PHP'sadaptabilityallowsittoscaleforlargeapplicationsusingframeworkslikeLaravel.3)Beyondweb,PHPisusedincommand-linescrip

PHP成為許多網站首選技術棧的原因包括其易用性、強大社區支持和廣泛應用。 1)易於學習和使用,適合初學者。 2)擁有龐大的開發者社區,資源豐富。 3)廣泛應用於WordPress、Drupal等平台。 4)與Web服務器緊密集成,簡化開發部署。

PHP適用於Web開發和內容管理系統,Python適合數據科學、機器學習和自動化腳本。 1.PHP在構建快速、可擴展的網站和應用程序方面表現出色,常用於WordPress等CMS。 2.Python在數據科學和機器學習領域表現卓越,擁有豐富的庫如NumPy和TensorFlow。
