我知道魔术数字是坏的,但我仍然遇到它们似乎不可避免的时代.我创造了一个例子,我喜欢有人向我展示如何重构和消除神奇的数字.
希望这将有助于我对将来消除它们有不同的看法.
我在CodePen上的例子:http://codepen.io/kevinsperrine/pen/LiGlb
编辑:css文件的第51行包含"幻数".
top: -42px;
Run Code Online (Sandbox Code Playgroud)
编辑2:试图澄清我在问什么:WordPress的风格指南定义了一个CSS幻数作为一次性使用的数字来"修复"(读取:创可贴)一个问题.我要求更多关于如何更改HTML和CSS甚至不需要使用-42px.根据我的经验,似乎这些类型的问题经常出现在Web开发中,所以我以这个案例为例,希望比我更有经验的人可以重构代码,这样就不需要"神奇的数字"了.
我正在查看我在GDB中调试的程序的以下回溯:
Thread 7 (Thread 3983):
#0 0xf7737430 in __kernel_vsyscall ()
#1 0x41b85412 in __lll_lock_wait () at ../nptl/sysdeps/unix/sysv/linux/i386/i486/lowlevellock.S:142
#2 0x41b80d6d in _L_lock_686 () from libpthread.so.0
#3 0xfbad8001 in ?? ()
#4 0x080eac80 in ?? ()
Backtrace stopped: previous frame inner to this frame (corrupt stack?)
Run Code Online (Sandbox Code Playgroud)
特别是我对0xfbad8001的帧地址及其含义感兴趣.
该平台基于x86,因此该未对齐地址无效.鉴于"坏"被编码为十六进制值,我猜这是一个神奇的数字,但到目前为止,我还无法确定是谁设置了这个值或为什么.我试图在谷歌和在线LXR数据库中搜索内核和glibc,但是没有发现任何实际设置此值的代码行.
如果我谷歌搜索"fbad8001",那么有许多点击在回溯和内存转储中显示此地址.所以这个特殊值似乎有一些意义,我假设它是某个地方的神奇数字,但到目前为止我还没能找到设置它的代码.
谁设定了这个值,它意味着什么?
内核基于Linux 3.4.10,glibc为2.15.
除了内核和glibc源代码外,我还通过gcc,gdb和binutils源代码,但仍然没有看到任何吸烟枪.我不知道还能在哪里看.
我正在构建一个从第三方检索并提交给第三方的服务.第三方提供了一个复杂的数据模型,其中包括三种不同的状态类型,所有这些类型的整数都有一个模糊的数字序列.下面提供了一个示例(键:值):
HandlerStatus CustomerStatus ArchiveStatus --- --- --- activeUnallocated:40 draftOpen:0 openOpen:0 activeAllocated:26 submitted:2 closed:1 activePromoted:102 approved:100 Declined:2 declined:1 ... ...
只有有限数量的组合,每个组合都有一个术语(提交,委托给另一个用户,等待确认等).例如:
Combination called "Submitted": HandlerStatus has to be "activeUnallocated" (40) CustomerStatus has to be "submitted" (2) ArchiveStatus has to be "openOpen" (0)
我们可以期待添加其他值,并且用户友好名称可能会随时间而变化.
此外,还有一些操作,例如提交和委托给不需要用户选择新值的其他用户,这意味着服务需要知道在这些操作发生时必须设置的一组组合.
我想到了三种不同的解决方案,各有利弊.
优点:
缺点:
优点:
缺点:
优点:
缺点:
我已经尝试研究最佳实践和模式,以确定哪种解决方案最适合,可维护性和良好的代码设计,但我没有得到任何地方(同时我在开发过程中严重依赖魔术字符串和数字) ).
我正在使用checkstyle来获取有关我的源代码的报告.这个问题是关于MagicNumberCheck的.
我Date/(org.joda.)DateTime在我的源代码中使用如下:
DateTime dateTime = new DateTime(2013, 2, 27, 23, 0):
dateTime.plusHours(57);
Run Code Online (Sandbox Code Playgroud)
如果幻数在Date或DateTime内,有没有办法抑制MagicNumberCheck通知?
我最近在很多代码中都注意到,人们在类/方法的深处放置了硬编码配置(如端口号等),这使得很难找到,也无法配置.
这违反了SOLID原则吗?如果没有,是否还有另一个"原则",我可以向我的团队成员介绍为什么这不是一个好主意?我不想只说"这很糟糕,因为我不喜欢它",但我很难想出一个好的论点.
有一个枚举结构,但我不明白这个枚举中'0xDEAD - 2'的含义.
enum TerminatedTypes {
_not_terminated = 0xDEAD - 2,
_thread_exiting,
_thread_terminated,
_vm_exited
};
Run Code Online (Sandbox Code Playgroud)
从上面的代码中,我可以获得什么样的好处?
上面的代码位于openjdk8中的"hotspot/src/share/vm/runtime/thread.hpp"中.
我正在研究jdk的源代码,请帮帮我.
我试图找到所有不以幻数 开头的图像ff d8 ff e0(jpg的签名)根据MSDN,我应该可以在我的数据上使用patindex.然而
SELECT TOP 1000 [cpclid]
FROM [cp]
where patindex('FFD8FFE0%', cpphoto) = 0 -- cpphoto is a column type of image
Run Code Online (Sandbox Code Playgroud)
给了我错误
消息8116,级别16,状态1,行1参数数据类型图像对于patindex函数的参数2无效.
找到与幻数不匹配的记录的正确方法是ff d8 ff e0什么?
更新:
我罗斯的解决方案最终通过对查询的调整进行了一些调整.
SELECT [cpclid]
FROM [cp]
where convert(varchar(max), cast(cpphoto as varbinary(max))) not like convert(varchar(max), 0xFFD8FFE0 ) + '%'
Run Code Online (Sandbox Code Playgroud)
我找到了更好的解决方案,请参阅我的回答.
谷歌搜索后,我发现魔术数字可用于识别文件的内容类型.
在我的程序中,我想验证服务器端的文件内容类型.
我的客户端代码:
<form action="/Home/Index" method="post" enctype="multipart/form-data">
<input type="file" id="inputFile" value="" onchange="readFileContent(this)" />
<input type="submit" value="Submit" />
</form>
function readFileContent(input) {
if (input.files && input.files[0]) {
reader = new FileReader();
reader.onload = function (e) {
var xhr = new XMLHttpRequest();
xhr.open('POST', '/Home/CheckFileType', true);
xhr.setRequestHeader("Content-Type", "multipart/form-data");
xhr.setRequestHeader('X-File-Name', input.files[0].name);
xhr.setRequestHeader('X-File-Type', input.files[0].type);
xhr.setRequestHeader('X-File-Size', input.files[0].size);
xhr.send(input.files[0]);
xhr.onreadystatechange = function () {
if (xhr.readyState == 4 && xhr.status == 200) {
alert(xhr.responseText);
}
}
};
reader.readAsText(input.files[0]);
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的服务器端代码:
[HttpPost]
public JsonResult CheckFileType()
{
string …Run Code Online (Sandbox Code Playgroud) 我有这个函数来计算ROT13.
string function rot13(required string inString) output="false" {
var j = 0;
var k = 0;
var out = "";
for (var i = 1; i <= Len(arguments.inString); i++){
j = asc(Mid(arguments.inString, i, 1));
if(j >= asc("A") && j <= asc("Z")) {
j = ((j - 52) % 26) + asc("A");
}
else if(j >= asc("a") && j <= asc("z")) {
j = ((j - 84) % 26) + asc("a");
}
out &= Chr(j);
} // end for
return out; …Run Code Online (Sandbox Code Playgroud) magic-numbers ×10
enums ×2
backtrace ×1
c ×1
c# ×1
checkstyle ×1
coldfusion ×1
css ×1
debugging ×1
gdb ×1
html ×1
image ×1
refactoring ×1
rot13 ×1
search ×1
sentinel ×1
sql ×1
standards ×1