我已经在我的第一个编程工作大约8个月了,到目前为止我已经学到了不可思议的数量.
不幸的是,我是一家内部应用程序的小型初创公司的唯一开发人员.
有史以来第一次,当我离开这份工作时,我会把我的一些项目交给其他人.我已经彻底记录了我的所有项目(至少我是这么认为的),但我仍然对其他人阅读我的代码感到紧张.
例如,我总是做这种事情.
for (int i = 0; i < blah.length; i++)
{
//Do stuff
}
Run Code Online (Sandbox Code Playgroud)
我应该将'i'命名为描述性的吗?它只是一个临时变量,并且只存在于该循环中,并且看起来循环对"i"的作用非常明显.
这只是一个例子.另一个是我以不同的方式命名变量...除了使用下划线启动所有私有成员之外,我并不真正符合命名标准.
是否有任何资源可以告诉我如何让下一个开发人员更容易?这种类型的东西有标准吗?
在我看过的大部分代码中(在SO上,我都会在我自己的代码中使用codeproject.com),我已经看到为一个类包含的每个私有字段创建公共属性,即使它们是最多的基本类型get; set;:
private int myInt;
public int MyInt
{
get { return myInt; }
set { myInt = value }
}
Run Code Online (Sandbox Code Playgroud)
我的问题是:这与以下方面有何不同:
public int MyInt;
Run Code Online (Sandbox Code Playgroud)
如果我们应该使用属性而不是公共字段,为什么我们应该在这种特定情况下使用它们呢?(我不是在讨论更复杂的例子,其中getter和setter实际上做了一些特殊的事情,或者只有一个get或set(只读/写)而不是只返回/设置私有字段的值).它似乎没有添加任何额外的封装,只在IntelliSense中提供一个漂亮的图标,并放在类图中的特殊部分!
我以前在变量名称中避免使用下划线,这可能是我大学Java时代的延续.因此,当我在Objective C中定义一个属性时,这就是我自然而然的事情.
// In the header
@interface Whatever
{
NSString *myStringProperty
}
@property (nonatomic, copy) NSString *myStringProperty;
// In the implementation
@synthesize myStringProperty;
Run Code Online (Sandbox Code Playgroud)
但在几乎所有的例子中都是如此
// In the header
@interface Whatever
{
NSString *_myStringProperty
}
@property (nonatomic, copy) NSString *myStringProperty;
// In the implementation
@synthesize myStringProperty = _myStringProperty;
Run Code Online (Sandbox Code Playgroud)
我应该克服对下划线的厌恶,因为这是应该做的一种方式,这种风格是否是一个很好的理由?
更新:现在使用自动属性合成你可以省略@synthesize,结果和你使用的一样
@synthesize myStringProperty = _myStringProperty;
Run Code Online (Sandbox Code Playgroud)
这清楚地表明了Apple的偏好.我已经学会了停止担忧并且喜欢下划线.
我遇到了这段代码......
if(isset($string[255])) {
// too long
}
Run Code Online (Sandbox Code Playgroud)
isset()比6到40快
if(strlen($string) > 255) {
// too long
}
Run Code Online (Sandbox Code Playgroud)
isset()的唯一缺点是代码不清楚 - 我们无法立即知道正在做什么(参见pekka的回答).我们可以在一个函数中包装isset(),即strlt($ string,255),但我们会失去isset()的速度优势.
我们如何在保留代码可读性的同时使用更快的isset()函数?
编辑:测试显示速度http://codepad.org/ztYF0bE3
strlen() over 1000000 iterations 7.5193998813629
isset() over 1000000 iterations 0.29940009117126
Run Code Online (Sandbox Code Playgroud)
EDIT2:这就是为什么isset()更快
$string = 'abcdefg';
var_dump($string[2]);
Output: string(1) “c”
$string = 'abcdefg';
if (isset($string[7])){
echo $string[7].' found!';
}else{
echo 'No character found at position 7!';
}
Run Code Online (Sandbox Code Playgroud)
这比使用strlen()更快,因为"...调用函数比使用语言结构更昂贵." http://www.phpreferencebook.com/tips/use-isset-instead-of-strlen/
EDIT3:我总是被教导对mirco-optimization感兴趣.可能是因为我在计算机上的资源很少的时候被教过.我对这个可能并不重要的观点持开放态度,在答案中有一些好的论据反对它.我已经开始探索这个问题... /sf/ask/488824591/
我最近学到了c#,所以当我学会写属性时,我被教会这样做:
public string Name { get; set; }
Run Code Online (Sandbox Code Playgroud)
汽车房产很棒!但是现在我正在尝试做一些更复杂的事情,所以我需要编写一对自定义访问器.
private string _Name;
public string Name {
get { return _Name; }
set { _Name = value }
}
Run Code Online (Sandbox Code Playgroud)
我知道当一个人使用autos时,编译器会将私有实例变量放在它的黑暗深处,但是我被宠坏了并且不希望那个私有变量看起来毫无意义.
有没有办法在没有私有变量的情况下使用自定义访问器?
在我上一份工作中,我们开发了一个数据库非常繁重的应用程序,并且我开发了一些格式化标准,以便我们都可以使用通用布局编写SQL.我们还开发了编码标准,但这些标准更具有平台特性,所以我不会在这里讨论它们.
我很想知道其他人使用什么SQL格式标准.与大多数其他编码环境不同,我没有在网上找到很多共识.
要涵盖主要查询类型:
select
ST.ColumnName1,
JT.ColumnName2,
SJT.ColumnName3
from
SourceTable ST
inner join JoinTable JT
on JT.SourceTableID = ST.SourceTableID
inner join SecondJoinTable SJT
on ST.SourceTableID = SJT.SourceTableID
and JT.Column3 = SJT.Column4
where
ST.SourceTableID = X
and JT.ColumnName3 = Y
Run Code Online (Sandbox Code Playgroud)
有一些分歧关于行后饲料select,from和where.选择行的意图是允许其他运算符,例如"top X"而不改变布局.接下来,只需在关键查询元素之后保持一致的换行符,就可以获得良好的可读性.
滴药后换行from,并where会是一个可以理解的版本.但是,在update下面的查询中,我们看到后面的换行为where我们提供了良好的列对齐.同样,换行后group by或order by保持我们的列布局清晰易读.
update
TargetTable
set
ColumnName1 = @value,
ColumnName2 = @value2
where
Condition1 = @test
Run Code Online (Sandbox Code Playgroud)
最后,一个insert:
insert into TargetTable …Run Code Online (Sandbox Code Playgroud) 我已经看到有和没有句号的两个异常消息.而且我可以想到为什么两者都可能是好的一些原因.
你推荐哪一个?
也可能是本地化资源字符串中的问题.显然你不能在一切之后放一段时间(在按钮和菜单项等文本之后的句点看起来很奇怪).但是,你是否应该把时间从一切都保持一致,然后在有用的地方添加它?或者你宁愿把它看作适合的时期吗?例如,在所有资源字符串和异常消息之后是句子,而不是在那些字之后.但那么,非常短的句子怎么样?比如"创建新文件".也许可以省去被认为是行动的字符串...(只是在我在这里打字的时候想...
我知道,这不是世界上最重要的事情.但像这样的小事情会在一段时间后给我带来麻烦.我喜欢一致性,知道为什么我会这样做.问题是我不确定应该选择哪一个:p
我们有一个返回城市/州元组的对象方法,即('Boston', 'MA').在某些有效情况下,没有有效的城市/州返回.在风格上,返回更有意义None,还是(None, None)在这种情况下包含两元素元组?
如果它很短,我会保持单线.最近我一直在使用这种风格用于更长或嵌套的三元运算符表达式.一个人为的例子:
$value = ( $a == $b )
? 'true value # 1'
: ( $a == $c )
? 'true value # 2'
: 'false value';
Run Code Online (Sandbox Code Playgroud)
个人你使用哪种风格,或找到最可读的?
编辑:( 何时使用三元运算符)
我通常避免使用超过2级深度三元运算符.当我在PHP模板脚本中回显变量时,我倾向于更喜欢2级深度三元运算符而不是2级.
我的教授真的强调通过始终使用访问器和更改器访问私有实例变量来防止隐私泄露; 但是,我是否必须使用类中的类的getter/setter?
例如,如果我有以下类:
public class Person
{
private String name;
private int age;
}
Run Code Online (Sandbox Code Playgroud)
我想为它编写一个toString()方法.我可以写一下:
public String toString()
{
return name + " " + age;
}
Run Code Online (Sandbox Code Playgroud)
或者我需要做这样的事情:
public String toString()
{
return this.getName() + " " + this.getAge();
}
Run Code Online (Sandbox Code Playgroud) coding-style ×10
c# ×4
php ×2
.net ×1
accessor ×1
exception ×1
formatting ×1
iphone ×1
java ×1
messages ×1
objective-c ×1
properties ×1
python ×1
python-3.x ×1
readability ×1
sql ×1
sql-server ×1
standards ×1