我的组织目前提供主要基于 SQL Server 2005/2008 后端、Java 模型/ Controller 框架和基于 ColdFusion 的 View 的 Web 应用程序。我们决定过渡到更新的框架,经过内部探索和小型项目,我们将选择范围缩小到 Python 和 C#/.NET 之间。
首先让我说 我意识到任何一种技术都会很好用,我正在寻找关键的差异化因素(以及相关的优缺点)这些语言有很多共同点,也有很多没有——我正在寻找您对它们主要差异的看法。
我正在寻找的示例权衡/差异化因素:
虽然看起来你可以用更少的代码完成更多的工作,并且使用 Python 更有创意,但由于 .NET 更加结构化,接管理解和修改其他人编写的代码可能更容易。
一些可能有用的额外信息:
我们的工程团队大约有 20 人,我们在 5-7 人的小团队中工作,其中我们经常轮换人员。我们处理别人编写的代码和我们编写新代码一样多。
对于 Python,我们将采用 Django 路线,而对于 .NET,我们将采用 MVC2。我们的服务器是运行 IIS 的 Windows 服务器。
我们喜欢 ColdFusion 的一些方面包括它非常容易处理查询,并且我们可以“热部署”修复我们的网络服务器,而无需重新启动它们或中断任何人。
我已经阅读了一些涉及这两种语言的其他 X 与 Y 线程,发现它们非常有用,但我想直接将 Python 与 .Net 进行正面交锋。在此先感谢您让我利用您的经验解决这个难题!
最佳答案
“.NET”不是一种语言。也许是 Python 与 C# 或 Python/Django 与 C#/ASP.NET(或选择您想要的任何“网络工作”;Python 和“.NET”有许多不同的解决方案,选择 Django 或 MVC2 的 bat 可能严重限制了更好的可行选择)。作为对 Python 与“.NET”的反击:有 IronPython (Python“在.NET中”)
我会考虑:开发人员对一种语言的舒适度,如果它们在 Python 和“.NET”中相等,那么我会考虑开发周转时间并选择最小化这种语言/“网络工作”(同样,它不必是以前的)约束)。
虽然单元/集成测试对于任何 [sizable] 项目都是必须的,但我发现静态类型语言 (C#/F#) 可以大大减少与类型相关的“愚蠢错误”的数量。
打开比赛 field :-)
编辑评论:
那么你只是在比较语言。
在这种情况下,C# 是一种非常无聊的命令式静态类型语言,具有基于单继承/接口(interface)类的 OO(但比 Java 有一些更巧妙的技巧,Java 只是彻头彻尾的石器时代)。这是与 Python 相同的基本面向对象类型,不包括静态/动态位,两种语言都是强类型的(机制不同,但最终结果在语言范围内非常相似)。实际上,python 有 MI,但在 python 中似乎不太被接受,因为它使用了 'lambda' 关键字,并且由于 python 是动态类型的,因此没有编译时支持确定接口(interface)/类型契约(但是,有一些模块可以尝试提供这个)。
如果你可以学习/了解Python,那么你就可以学习/了解C#。 这不是范式转变。这里有一些关键字,那里有大括号,需要说明你在那里指的是什么类型,不同的基础库......不同的环境(你必须争取一些才能获得 REPL,但它在 VS 中是可行的。)开发人员如何喜欢/学习/使用它是另一回事。虽然我之前确实将 C# 称为命令式,但很高兴看到添加了一些“类似函数”的特性,例如 LINQ/IEnumerable 扩展和没有委托(delegate)的闭包,即使基本的 C# 语法非常程序化——再一次,很漂亮很像 python(for 表达式、嵌套函数、语句/表达式除法)。
虽然新的“动态”确实模糊了界线(很少有很好的用途——在几乎所有相同的地方,人们可能不得不退回到以前的 C# 版本中的反射——这不是真的,但是关键是它通常是“错误的方式”,除了在少数情况下它恰好是“最好/唯一的方式”),“var”不是。也就是说,“var”变量的类型在编译时是已知的,与动态类型无关;这都是类型推断。某些语言(如 F#/SML 和 Haskell)具有更强大的类型推断,无需“所有那些丑陋的类型声明”(尽管显式注释允许的类型或类型集可以使意图更加清晰),同时保留静态类型。
就个人而言,撇开其他一切不谈,我会使用静态类型语言。我不是在说 C#(我绝对不是在说 Java!),而是 静态类型语言可以将类型错误推到顶部并需要预先明确的契约(Contract) (这对我来说是一个很大的胜利)。虽然您确实错过了一些巧妙的动态技巧,但几乎总有一种更好的方法可以用目标语言执行相同的操作——您只需要考虑该语言,然后用 Screwdriver 拧螺丝,用锤子拧螺丝钉子。例如。不要期望将依赖于(ab)使用 local() 或 global() 的 Python 代码按原样引入 C#。
在“不利方面”,大多数静态类型语言(此处为 C#)需要显式的编译优先(但这并没有那么糟糕,因为它可以生成漂亮的程序集)并且诸如“REPL”之类的工具不被视为第一-类公民(它是 F#/VS2010 中的一等公民)。此外,如果您有 Python/C# 的基本库(并且在其他语言中不可用),这可能是决定为什么选择一种语言而不是另一种语言的决定性因素。
关于.net - Python vs C#/.NET——使用 Python 开发大型 Web 应用程序需要考虑的主要区别是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3420594/
作为我的Rails应用程序的一部分,我编写了一个小导入程序,它从我们的LDAP系统中吸取数据并将其塞入一个用户表中。不幸的是,与LDAP相关的代码在遍历我们的32K用户时泄漏了大量内存,我一直无法弄清楚如何解决这个问题。这个问题似乎在某种程度上与LDAP库有关,因为当我删除对LDAP内容的调用时,内存使用情况会很好地稳定下来。此外,不断增加的对象是Net::BER::BerIdentifiedString和Net::BER::BerIdentifiedArray,它们都是LDAP库的一部分。当我运行导入时,内存使用量最终达到超过1GB的峰值。如果问题存在,我需要找到一些方法来更正我的代
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
当我使用Bundler时,是否需要在我的Gemfile中将其列为依赖项?毕竟,我的代码中有些地方需要它。例如,当我进行Bundler设置时:require"bundler/setup" 最佳答案 没有。您可以尝试,但首先您必须用鞋带将自己抬离地面。 关于ruby-我需要将Bundler本身添加到Gemfile中吗?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/4758609/
是的,我知道最好使用webmock,但我想知道如何在RSpec中模拟此方法:defmethod_to_testurl=URI.parseurireq=Net::HTTP::Post.newurl.pathres=Net::HTTP.start(url.host,url.port)do|http|http.requestreq,foo:1endresend这是RSpec:let(:uri){'http://example.com'}specify'HTTPcall'dohttp=mock:httpNet::HTTP.stub!(:start).and_yieldhttphttp.shou
我注意到像bundler这样的项目在每个specfile中执行requirespec_helper我还注意到rspec使用选项--require,它允许您在引导rspec时要求一个文件。您还可以将其添加到.rspec文件中,因此只要您运行不带参数的rspec就会添加它。使用上述方法有什么缺点可以解释为什么像bundler这样的项目选择在每个规范文件中都需要spec_helper吗? 最佳答案 我不在Bundler上工作,所以我不能直接谈论他们的做法。并非所有项目都checkin.rspec文件。原因是这个文件,通常按照当前的惯例,只
我实际上是在尝试使用RVM在我的OSX10.7.5上更新ruby,并在输入以下命令后:rvminstallruby我得到了以下回复:Searchingforbinaryrubies,thismighttakesometime.Checkingrequirementsforosx.Installingrequirementsforosx.Updatingsystem.......Errorrunning'requirements_osx_brew_update_systemruby-2.0.0-p247',pleaseread/Users/username/.rvm/log/138121
我目前正在使用以下方法获取页面的源代码:Net::HTTP.get(URI.parse(page.url))我还想获取HTTP状态,而无需发出第二个请求。有没有办法用另一种方法做到这一点?我一直在查看文档,但似乎找不到我要找的东西。 最佳答案 在我看来,除非您需要一些真正的低级访问或控制,否则最好使用Ruby的内置Open::URI模块:require'open-uri'io=open('http://www.example.org/')#=>#body=io.read[0,50]#=>"["200","OK"]io.base_ur
这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Pythonconditionalassignmentoperator对于这样一个简单的问题表示歉意,但是谷歌搜索||=并不是很有帮助;)Python中是否有与Ruby和Perl中的||=语句等效的语句?例如:foo="hey"foo||="what"#assignfooifit'sundefined#fooisstill"hey"bar||="yeah"#baris"yeah"另外,类似这样的东西的通用术语是什么?条件分配是我的第一个猜测,但Wikipediapage跟我想的不太一样。
这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Rubysyntaxquestion:Rational(a,b)andRational.new!(a,b)我正在阅读ruby镐书,我对创建有理数的语法感到困惑。Rational(3,4)*Rational(1,2)产生=>3/8为什么Rational不需要new方法(我还注意到例如我可以在没有new方法的情况下创建字符串)?
什么是ruby的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht