在其他语言中,有助于生成更好代码的一般准则总是尽可能隐藏所有内容.如果对变量是私有还是受保护存在疑问,最好与私有变量一起使用.
对Python来说也是如此吗?我应该首先在所有内容上使用两个前导下划线,并且只在我需要时将它们隐藏起来(只有一个下划线)吗?
如果惯例只使用一个下划线,我也想知道其基本原理.
这是我在JBernardo的回答中留下的评论.它解释了为什么我问这个问题,以及为什么我想知道为什么Python与其他语言不同:
我来自语言,训练你认为一切都应该只是公开的,而不是更多.原因是这将减少依赖性并使代码更安全.反向做事的Python方式 - 从公共开始到隐藏 - 对我来说很奇怪.
我刚才考虑过这个问题,最近我的商店正在制作它的第一个真正的Java网络应用程序.
作为介绍,我看到两个主要的包命名策略.(要清楚,我不是指整个'domain.company.project'的一部分,我在谈论它下面的包约定.)无论如何,我看到的包命名约定如下:
功能:根据业务领域,根据其功能在架构上命名您的包,而不是其身份. 另一个术语可能是根据'layer'命名.所以,你有一个*.ui包和一个*.domain包和一个*.orm包.您的包是水平切片而不是垂直切片.
这是多比逻辑命名更常见.事实上,我不相信我曾经见过或听说过这样做的项目.这当然让我很害羞(有点像认为你已经提出解决NP问题的方法),因为我不是非常聪明,我认为每个人都必须有充分的理由按照他们的方式去做.在另一方面,我不反对人们只是缺少在房间里的大象和我从来没有听说过的实际参数为做包命名这种方式.它似乎是事实上的标准.
逻辑:根据业务域标识命名您的包,并将与该垂直功能片有关的每个类放入该包中.
正如我之前提到的,我从未见过或听说过这一点,但这对我来说很有意义.
我倾向于垂直而不是水平地接近系统.我想进入并开发订单处理系统,而不是数据访问层.显然,我很有可能在该系统的开发中触及数据访问层,但重点是我不这么认为.当然,这意味着当我收到变更单或想要实现一些新功能时,不必为了找到所有相关的类而不必去一堆包中钓鱼.相反,我只是查看X包,因为我正在做的与X有关.
从开发的角度来看,我认为让您的软件包记录您的业务领域而不是您的架构是一项重大胜利.我觉得这个领域几乎总是系统的一部分,因为系统的体系结构,特别是在这一点上,它的实现几乎变得平凡,因此很难理解.事实上,我可以通过这种类型的命名约定进入系统,并立即从包的命名知道它处理订单,客户,企业,产品等,这似乎非常方便.
看起来这样可以让你更好地利用Java的访问修饰符.这使您可以更清晰地将接口定义到子系统中,而不是定义到系统的各个层中.因此,如果你有一个你想要透明持久的订单子系统,理论上你永远不会让任何其他东西知道它是持久的,因为不必在dao层中为其持久性类创建公共接口,而是将dao类包装在只有它处理的类.显然,如果您想公开此功能,可以为其提供界面或将其公开.通过将系统功能的垂直切片分成多个包,您似乎失去了很多.
我认为我可以看到的一个缺点是,它确实使得剥离层更加困难.您必须进入并更改所有软件包中的所有类,而不是仅删除或重命名软件包,然后使用备用技术删除新软件包.但是,我不认为这是一个大问题.这可能源于缺乏经验,但我必须想象,与您进入和编辑系统中的垂直特征切片的次数相比,您更换技术的次数相形见绌.
所以我想那个问题会告诉你,你如何命名你的包裹以及为什么?请理解我并不一定认为我偶然发现了金鹅或其他东西.我对这一切都很陌生,主要是学术经验.但是,我无法发现我的推理中的漏洞,所以我希望你们都能这样,以便继续前进.
我喜欢在其他语言的方法/函数名称末尾使用问号.Java不允许我这样做.作为一种解决方法,我如何在Java中命名布尔返回方法?使用is,has,should,can在方法的前声好一些情况.有没有更好的方法来命名这样的方法?
例如createFreshSnapshot?
我仍然习惯于使用python约定并使用它pylint来使我的代码更加pythonic,但我对pylint不喜欢单个字符变量名这一事实感到困惑.我有几个像这样的循环:
for x in x_values:
my_list.append(x)
Run Code Online (Sandbox Code Playgroud)
当我跑pylint,我得到Invalid name "x" for type variable (should match [a-z_][a-z0-9_]{2,30}- 这表明有效的变量名称必须在3到31个字符之间,但我已经查看了PEP8命名约定,我没有看到关于单个小写字母的任何明确的,我确实看到很多使用它们的例子.
PEP8中是否存在我缺少的东西,或者这是pylint独有的标准?
我正在生成大量的ASP.NET MVC脚手架代码.所有生成的文件都是使用标准命名约定的部分类.例如,我的员工控制器文件名为EmployeeController.cs.如果我希望使用自定义的非生成逻辑扩展EmployeeController,我将创建一个名为EmployeeControllerCustom.cs的第二个部分类文件.我将自定义和生成的逻辑分成两个不同的文件,因此下次生成EmployeeController时,我的自定义更改不会被覆盖.将"自定义"后缀添加到文件名对我来说似乎是合理的,但是我是否应该遵循更成熟的部分类文件命名约定?
我知道Java中用于布尔getter的约定包括前缀"is".
isEnabled
isStoreOpen
Run Code Online (Sandbox Code Playgroud)
但如果主题是复数呢?也就是说,如果不想知道商店是否开放,我想知道所有商店是否开放?
isStoresOpen() 用英语没有意义.
我很想写下这样的吸气剂:
areStoresOpen
areDogsCute
areCatsFuzzy
Run Code Online (Sandbox Code Playgroud)
我认为,这将是有意义的,但我已经被别人认为我应该只吸了起来,抛弃主题动词协议,并使用告诉isStoresOpen,isDogsCute,isCatsFuzzy.
无论如何,我应该怎么做对多个主题进行操作的布尔getter?
我可以在Go中找到命名包的约定:单词之间没有下划线,一切都是小写的.
此约定是否也适用于文件名?
您是否也将一个结构放在一个文件中,就像您为一个java类所做的那样,然后在结构后面命名该文件?
目前,如果我有一个struct WebServer,我将它放在web_server.go文件中.
如果你有一个API,并且你是一个拥有高度国际受众的英国开发人员,那么你的API应该是
setColour()
Run Code Online (Sandbox Code Playgroud)
要么
setColor()
Run Code Online (Sandbox Code Playgroud)
(用一个词作为一个简单的例子.)
英国工程师通常对他们的"正确"拼写非常防守,但可以说美国拼写在国际市场上更"标准".
我想这个问题是否重要?其他语言环境中的开发人员是否在使用GB拼写,或者通常很明显是什么意思?
应该都是美国英语吗?
我工作的质量检查经理告诉我,我的桌面应用程序中存在一个错误,因为当应该是"操作员ID"时,登录提示为"操作员ID".她的论点是"Id"指弗洛伊德的"通灵器具"的自我部分,并且在语义上不正确.
现在我是一名肛门工程师(AE),我当然不得不去查找Id vs ID和我的粗略调查(google),看起来ID似乎与弗洛伊德的自我一样常用.
所以我的理由是,Id是"标识符"的缩短版本,并且比ID更正确或至少更常用,这通常表示两个单词的缩写.
我可以改变用户界面,但后来我不会把我的职业作为一个AE,所以我想知道是否有任何最佳实践或参考资料可用于支持我的论点?请记住,这个问题与用户界面有关,而不是源代码,其中缩写和套管是哲学的完整不同分支.
当我为业务逻辑对象编写一些扩展方法时,我遇到了重命名转换方法的问题.someObject.ToAnotherObject()广泛使用会很好object.ToString().
但是,例如,LINQ混合了两种变体,我找不到它们之间的区别.ToDictionary(),ToList(),AsParallel(),AsQueryable(),...
这两个命名约定之间有什么区别,我应该知道如何决定是否使用我自己的类?