我正在使用Lidgren,并且对于我制作的每种新类型的消息,我最终都编写了相同类型的代码.我正在创建一个实例NetOutgoingMessage,在其上运行各种赋值调用,然后在完成后发送它.创建和发送是一样的,所以我想写一个包装器来为我做这个,但它是一个sealed类,它不是IDisposable.我正在做的是:
NetOutgoingMessage om = server.CreateMessage();
om.Write(messageType);
om.Write(data1);
om.Write(data2);
server.SendMessage(om, server.Connections, NetDeliveryMethod.UnreliableSequenced, 0);
Run Code Online (Sandbox Code Playgroud)
我想做的事情如下:
using(AutoNetOutgoingMessage om(server, messageType, NetDeliveryMethod.UnreliableSequenced))
{
om.Write(data1);
om.Write(data2);
}
Run Code Online (Sandbox Code Playgroud)
显然我不能这样using做是否有另一种常见的方法,如果实现这样的功能?我不是在寻找一个非常复杂的解决方案,因为这只是关于我的可维护性,所以我没有问题为每条消息重复我的代码.但我很好奇是否有一个有趣的C#技巧我不知道为此.
我发现维护性指数(MI)的推荐值如下:
这些价值取决于技术吗?例如,对于大型机来说,70的值是好的,但对于Java来说难以维护吗?
可以使用独立于技术的相同尺度吗?
我在工作中使用Resharper.我的一些同事没有.
当我打开一些已写入的代码而不是其他代码时,我的屏幕上的橙色数量就会立即显而易见.
我不确定的是,我应该在多大程度上自由地整理那些在不知不觉中留下的混乱.对于我所看到的大部分内容,它是草率但无害的,如果我从未使用过Resharper,就不会真的跳出来.
我想我大致看到了我的选择
1)源代码更改的历史记录对于维护至关重要.尽可能少地改变,或者下一个人不希望弄清楚改变了什么.谁关心无法访问的代码,无论如何都不必要地使用.ToString()等.
2)更改无意义的东西,如包括,修复方法文档注释和类似的东西.写它的人喜欢他的代码看起来像这样,所以把它留在他不会抱怨的状态,但摆脱一些不必要的橙色
3)橙色只是红色但更轻.F12然后Alt + Enter直到绿色.
4)忘记橙色,看看怪物700线功能.这是什么1997年?是时候忙碌......如果你有时间,请把你的同事介绍给我们的好朋友和导师福勒先生.
我倾向于在选项之间进行过滤,具体取决于我有多少时间,我现在负责代码的程度,以及代码看起来有多复杂(这通常可以让我选择1或4).
看起来四个选项中的一个应该是我正在努力的那个,但我不知道哪一个
所以,在Python中(虽然我认为它可以应用于许多语言),我经常发现自己有这样的事情:
the_input = raw_input("what to print?\n")
while the_input != "quit":
print the_input
the_input = raw_input("what to print?\n")
Run Code Online (Sandbox Code Playgroud)
也许我太挑剔了,但我不喜欢这条线有多the_input = raw_input("what to print?\n")重复.它降低了可维护性和组织性.但是我没有看到任何避免重复代码的变通方法而不会进一步恶化问题.在某些语言中,我可以这样写:
while ((the_input=raw_input("what to print?\n")) != "quit") {
print the_input
}
Run Code Online (Sandbox Code Playgroud)
这绝对不是 Pythonic,Python甚至不允许在循环条件AFAIK中进行赋值.
这个有效的代码修复了冗余,
while 1:
the_input = raw_input("what to print?\n")
if the_input == "quit":
break
print the_input
Run Code Online (Sandbox Code Playgroud)
但是也感觉不对.将while 1意味着这个循环将永远运行下去; 我正在使用一个循环,但给它一个假的条件并将真正的条件放入其中.
我太挑剔了吗?有一个更好的方法吗?也许有一些我不知道的为此设计的语言结构?
在JS代码中使用命名IIFE来描述和分组相关代码的利弊是什么?
我一直在使用这个"模式"来为我的更多程序代码提供结构,这些代码只能在一个地方执行.
(function hideStuffOnInstantiaton(){
$('oneThing').hide().removeClass();
$('#somethign_else').slideUp();
$('.foo').fadeOut();
}());
Run Code Online (Sandbox Code Playgroud)
我觉得这比两者都好:
// hide Stuff on Instantiaton
$('oneThing').hide().removeClass();
$('#somethign_else').slideUp();
$('.foo').fadeOut();
Run Code Online (Sandbox Code Playgroud)
因为随着时间的推移,评论可能会与代码分开,而且评论所适用的行不是很明显
并:
function hideStuffOnInstantiaton(){
$('oneThing').hide().removeClass();
$('#somethign_else').slideUp();
$('.foo').fadeOut();
};
hideStuffOnInstantiaton();
Run Code Online (Sandbox Code Playgroud)
因为如果它只在一个地方执行,为什么要分开函数及其执行?
使用此模式时是否存在任何性能,可维护性,可测试性或跨浏览器注意事项?我不相信我已经看到很多人在野外使用它但我觉得它可能非常有用
假设您有一个当前以预期方式运行的程序.该应用程序背后的代码非常糟糕,占用大量内存,不可扩展,并且需要进行大量重写才能实现功能上的任何更改.
在什么时候重构变得不那么合乎逻辑了?
作为一个喜欢遵循最佳实践的人,
如果我运行代码指标(右键单击解决方案资源管理器中的项目名称并选择"计算代码指标" - Visual Studio 2010):
public static string GetFormFactor(int number)
{
string formFactor = string.Empty;
switch (number)
{
case 1:
formFactor = "Other";
break;
case 2:
formFactor = "SIP";
break;
case 3:
formFactor = "DIP";
break;
case 4:
formFactor = "ZIP";
break;
case 5:
formFactor = "SOJ";
break;
}
return formFactor;
}
Run Code Online (Sandbox Code Playgroud)
它给了我一个61的可维护性指数
(当然,如果你只有这个,这是微不足道的,但是如果你使用像哲学这样的类这样的实用程序,你的实用程序类将具有最差的可维护性指数..)
这是什么解决方案?
我看到了这个问题,它让我想起了旧DataGrid中的AutoGenerateColumns.我几次使用它们,我最终支持它,因为我需要数据格式化超过标准"吐出数据源列".同样,通过切换,听起来可以节省时间,但最终需要跟踪状态或其他内容,并相应地重写代码.
有没有你最终使用的东西,认为它会节省你的时间,但最终退出,因为它不能满足你的需要?
我发现我的自我重写Equals()并GetHashCode()经常实现具有相同属性值的业务对象相等的语义.这会导致代码重复写入并且易于维护(属性被添加,并且一个/两个覆盖都不会更新).
代码最终看起来像这样(欢迎对实现的评论):
public override bool Equals(object obj)
{
if (object.ReferenceEquals(this, obj)) return true;
MyDerived other = obj as MyDerived;
if (other == null) return false;
bool baseEquals = base.Equals((MyBase)other);
return (baseEquals &&
this.MyIntProp == other.MyIntProp &&
this.MyStringProp == other.MyStringProp &&
this.MyCollectionProp.IsEquivalentTo(other.MyCollectionProp) && // See http://stackoverflow.com/a/9658866/141172
this.MyContainedClass.Equals(other.MyContainedClass));
}
public override int GetHashCode()
{
int hashOfMyCollectionProp = 0;
// http://computinglife.wordpress.com/2008/11/20/why-do-hash-functions-use-prime-numbers/
// BUT... is it worth the extra math given that elem.GetHashCode() should be well-distributed?
int bitSpreader = 31; …Run Code Online (Sandbox Code Playgroud) 我的 Python 项目很大程度上依赖于 PyPi 包。
我想确保:在未来的任何时候:我的应用程序所需的包将始终在 PyPi 上在线可用。
例如:-
我在 Github 上发现了一个需要 PyQt4 的项目。
当我尝试在我的 Linux 机器上运行它时,
它在启动时崩溃,因为它在 PyPi 上找不到 PyQt4 包。
注意:我知道 PyQt4 已被弃用
我进行了大量搜索以找到仍然包含 PyQt4 包的 PyPi 存档,但我在任何地方都找不到它们。
所以我必须重写该应用程序才能使其在 PyQt5 上运行。
我只更改了与UI相关的代码(即:PyQt4)。
其他功能仍在运行。
所以该应用程序的唯一问题是 PyQt4 包已从 PyPi 中删除。
maintainability ×10
c# ×2
python ×2
refactoring ×2
.net ×1
code-metrics ×1
comments ×1
equals ×1
hashcode ×1
iife ×1
indexing ×1
javascript ×1
organization ×1
pypi ×1
rebuild ×1
redundancy ×1
resharper ×1
scalability ×1
using ×1