我有兴趣了解Python中的大规模开发,尤其是如何维护大型代码库?
当您对方法的签名进行不兼容更改时,如何找到调用该方法的所有位置.在C++/Java中,编译器会为您找到它,您如何在Python中完成它?
当您在代码内部进行更改时,如何找出实例提供的操作,因为您没有要查找的静态类型?
你如何处理/防止打字错误(错别字)?
UnitTest是否用作静态类型检查的替代?
您可以猜到我几乎只使用静态类型语言(C++/Java),但我想尝试使用Python来处理更大的程序.但很久以前,我使用限幅器(dBase)语言进行了非常糟糕的体验,这种语言也是动态输入的.
Python不是静态类型语言,所以不要试图以这种方式使用它.
使用特定工具时,可以将其用于构建的工具.对于Python,它意味着:
鸭子打字:没有类型检查.只有行为很重要.因此,您的代码必须设计为使用此功能.一个好的设计意味着通用签名,组件之间没有依赖关系,高抽象级别.所以如果你改变任何东西,你就不必改变其余的代码.Python也不会抱怨它是为它构建的.类型不是问题.
巨大的标准库.如果您使用自己未编码的标准功能,则无需更改程序中的所有呼叫.而且Python附带电池.我每天都在发现它们.我不知道我开始时可以使用的模块数量,并试图像每个人一样重写现有的东西.没关系,你从一开始就做不到.
你不用同样的方式编写Java,C++,Python,PHP,Erlang等等.它们是为什么有这么多不同语言的空间的好理由,它们不会做同样的事情.
必须使用任何语言执行单元测试.最着名的单元测试库(JUnit)来自Java世界!
这与类型无关.你再次检查行为.你可以避免回归问题.您确保您的客户在轨道上.
语言,图书馆和框架无法扩展.架构呢.
如果你设计一个坚固的架构,如果你能够让它快速发展,那么它将会扩展.单元测试也有帮助,自动代码检查也是如此.但它们只是安全网.小的.
Python特别适用于大型项目,因为它强制执行一些良好实践,并且内置了许多常用的设计模式.但同样,不要将它用于未设计的内容.例如:Python不是用于CPU密集型任务的技术.
在一个庞大的项目中,无论如何你很可能会使用几种不同的技术.作为SGBD(DBMS的法语)和模板语言,或者.Python也不例外.
您可能希望将C/C++用于需要快速执行的代码部分.或者Java适合Tomcat环境.不知道,不在乎.Python可以很好地适应这些.
我的回答可能有点粗鲁,但不要误会我的意思:这是一个非常好的问题.
很多人带着旧习惯来到Python.我试图像Python一样编写Java代码.你可以,但永远不会得到最好的.
如果您已经玩过/想玩Python,那就太棒了!这是一个很棒的工具.但真的只是一个工具.
我有一些修改"Frets On Fire"的经验,这是一个开源python"吉他英雄"克隆.
正如我所看到的,python并不适合真正的大型项目.
我发现自己花费了很大一部分开发时间来调试与不兼容类型的分配相关的问题,静态类型的语言将在编译时毫不费力地显示出来.此外,由于类型是在运行时确定的,因此尝试理解现有代码会变得更难,因为您不知道您当前正在查看的参数类型是什么.
除此之外,使用带有__getattr__
内置函数的名称字符串调用函数通常在Python中比在其他编程语言中更常见,因此将调用图调到某个函数有点困难(尽管可以在某些函数中调用函数名称)静态类型语言).
我认为Python真的很适合小规模软件,快速原型开发,并将现有程序粘合在一起,但我不会将它用于大型软件项目,因为在这些类型的程序中,可维护性成为真正的问题,在我看来python那里相对较弱.
由于没有人指出pychecker,pylint和类似的工具,我将:pychecker和pylint是可以帮助你找到不正确的假设(关于函数签名,对象属性等)的工具.他们不会找到编译器可能在静态类型语言 - 但他们可以发现这些语言的编译器也找不到的问题.
Python(以及任何动态类型语言)在您可能导致的错误以及如何检测和修复它们方面存在根本的不同.它有明显的缺点和好处,但很多人(包括我)会认为在Python的情况下,编写代码的容易程度(以及在结构上听起来很容易)以及在不破坏API兼容性的情况下修改代码(添加新的可选参数) ,提供具有相同方法和属性集的不同对象)使其适用于大型代码库.
我的0.10欧元:
我在'生产'状态下有几个python应用程序.我们公司使用java,c ++和python.我们用eclipse ide开发(python的pydev)
单元测试是解决问题的关键.(也适用于c ++和java)
不太安全的"动态打字"世界会让你不那么粗心对你的代码质量
按方式:
大规模开发并不意味着,你使用一种语言!
大规模开发通常使用少数特定于该问题的语言.
所以我同意锤子问题 :-)
PS:静态输入和python
以下是一些帮助我在python中维护一个相当大的系统的项目.
在层中构建代码.即单独的业务逻辑,表示逻辑和持久层.投入一些时间来定义这些层并确保项目中的每个人都被引入.对于大型系统来说,创建一个强制您进入某种开发方式的框架也是关键.
测试是关键,如果没有单元测试,您可能会比其他语言快几倍地使用无法管理的代码库.请记住,单元测试通常是不够的,请确保在进行任何重大更改后可以快速运行多个集成/验收测试.
使用Fail Fast原则.为您认为代码可能容易受到攻击的案例添加断言.
具有标准的日志记录/错误处理,可帮助您快速导航到该问题
使用IDE(pyDev适用于我)提供类型提前,pyLint/Checker集成,以帮助您立即检测常见错别字并提升一些编码标准
仔细考虑你的进口,永远不要从x import*或不使用的相关进口.
做重构,使用正则表达式的搜索/替换工具通常都需要移动方法/类类型重构.
对方法签名的不兼容更改.这在Python中并不像在Java和C++中那样发生.
Python具有可选参数,默认值以及定义方法签名的灵活性.另外,鸭子打字意味着 - 例如 - 作为重大软件更改的一部分,您不必从某个类切换到接口.事情并不复杂.
你如何找到调用该方法的所有地方? grep适用于动态语言.如果你需要知道每个地方使用一个方法,grep(或等效的IDE支持的搜索)效果很好.
如何查找实例提供的操作,因为您没有要查找的静态类型?
一个.看看来源.您没有对象库和jar文件的Java/C++问题.您不需要这些语言所需的所有精心设计的工具和工具.
湾 IDE可以在许多常见情况下提供签名信息.您可以轻松地击败IDE的推理能力.当发生这种情况时,你应该回顾一下你正在做的事情以确保它有意义.如果您的IDE无法推断出您的类型信息,那么它可能过于动态了.
C.在Python中,您经常使用交互式解释器.与Java和C++不同,您可以直接和交互式地探索实例.您不需要复杂的IDE.
例:
>>> x= SomeClass() >>> dir(x)
你如何处理/防止输入错误? 与静态语言相同:您不会阻止它们.你找到并纠正它们.Java只能找到某类错别字.如果你有两个相似的类或变量名,那么即使使用静态类型检查,你也会陷入深深的麻烦.
例:
class MyClass { } class MyClassx extends MyClass { }
具有这两个类名的拼写错误可能会造成严重破坏."但我不会把自己置于Java的那个位置,"人们说.同意.我也不会把自己置于Python的那个位置; 你制作了截然不同的课程,如果被滥用,就会提前失败.
UnitTest是否用作静态类型检查的替代? 这是另一个观点:静态类型检查是清晰,简单设计的替代品.
我和那些不确定应用程序工作原理的程序员一起工作过.他们无法弄清楚为什么事情没有编译; 我不知道抽象超类和接口之间的区别,并且无法弄清楚为什么在一个单独的JAR文件崩溃中使一些其他模块发生变化.静态类型检查使他们对有缺陷的设计产生了错误的信心.
动态语言使程序变得简单.简单性是静态类型检查的替代品.清晰度是静态类型检查的替代品.