标签: magic-numbers

重构CSS以消除"神奇数字"

我知道魔术数字是坏的,但我仍然遇到它们似乎不可避免的时代.我创造了一个例子,我喜欢有人向我展示如何重构和消除神奇的数字.

希望这将有助于我对将来消除它们有不同的看法.

我在CodePen上的例子:http://codepen.io/kevinsperrine/pen/LiGlb

编辑:css文件的第51行包含"幻数".

top: -42px; 
Run Code Online (Sandbox Code Playgroud)

编辑2:试图澄清我在问什么:WordPress的风格指南定义了一个CSS幻数作为一次性使用的数字来"修复"(读取:创可贴)一个问题.我要求更多关于如何更改HTML和CSS甚至不需要使用-42px.根据我的经验,似乎这些类型的问题经常出现在Web开发中,所以我以这个案例为例,希望比我更有经验的人可以重构代码,这样就不需要"神奇的数字"了.

html css refactoring magic-numbers

6
推荐指数
1
解决办法
2063
查看次数

0xfbad8001回溯中的幻数

我正在查看我在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源代码,但仍然没有看到任何吸烟枪.我不知道还能在哪里看.

c debugging gdb magic-numbers backtrace

6
推荐指数
1
解决办法
458
查看次数

设计以防止魔术数字和字符串

我正在构建一个从第三方检索并提交给第三方的服务.第三方提供了一个复杂的数据模型,其中包括三种不同的状态类型,所有这些类型的整数都有一个模糊的数字序列.下面提供了一个示例(键:值):

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)

我们可以期待添加其他值,并且用户友好名称可能会随时间而变化.
此外,还有一些操作,例如提交和委托给不需要用户选择新值的其他用户,这意味着服务需要知道在这些操作发生时必须设置的一组组合.

  • 我必须能够为每种状态类型中的每个状态值定义用户友好的显示名称
  • 我必须能够从用户接收新的状态值并映射正确的状态类型
  • 我必须能够查找定义组合的值
  • 我必须能够根据一组状态值查找定义的组合


我想到了三种不同的解决方案,各有利弊.

1.为每种状态类型定义en enum

优点:

  • 强类型
  • 维护仅限于一个文件

缺点:

  • 枚举
  • UI表示的字符串格式


2.在外部JSON文件中定义键/值对

优点:

  • 添加不需要更改代码
  • 可以在运行时更新

缺点:

  • 需要魔术字符串/数字用于具有相关组合的动作(没有用户输入的动作)
  • 经常从文件系统中读取


3.为不同的可用状态组合创建代理类

优点:

  • 强类型
  • 灵活

缺点:

  • 在第三方系统中发生更改时需要代码维护


我已经尝试研究最佳实践和模式,以确定哪种解决方案最适合,可维护性和良好的代码设计,但我没有得到任何地方(同时我在开发过程中严重依赖魔术字符串和数字) ).

c# enums proxy-classes magic-numbers

6
推荐指数
1
解决办法
990
查看次数

Java的checkstyle,MagicNumberCheck

我正在使用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通知

magic-numbers checkstyle

5
推荐指数
1
解决办法
7024
查看次数

SOLID原则和类内的硬代码配置

我最近在很多代码中都注意到,人们在类/方法的深处放置了硬编码配置(如端口号等),这使得很难找到,也无法配置.

这违反了SOLID原则吗?如果没有,是否还有另一个"原则",我可以向我的团队成员介绍为什么这不是一个好主意?我不想只说"这很糟糕,因为我不喜欢它",但我很难想出一个好的论点.

magic-numbers solid-principles

5
推荐指数
1
解决办法
213
查看次数

"0xDEAD"在以下代码中的含义是什么?

有一个枚举结构,但我不明白这个枚举中'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的源代码,请帮帮我.

enums magic-numbers sentinel

5
推荐指数
1
解决办法
3541
查看次数

在javascript中匹配event.keyCode时如何避免幻数

在javascript中匹配按键时,我可以避免使用幻数吗?

一个例子是使用13来匹配回车键.

我可以指定自己的常量,但我不知道这些值是否在不同的平台/浏览器/语言环境中足够稳定.

standards magic-numbers javascript-events

4
推荐指数
1
解决办法
1544
查看次数

如何在image/varbinary字段中搜索以二进制模式开头的记录

我试图找到所有不以幻数 开头的图像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)


我找到了更好的解决方案,请参阅我的回答.

sql search sql-server-2005 image magic-numbers

4
推荐指数
2
解决办法
1万
查看次数

纯文本文件的幻数

谷歌搜索后,我发现魔术数字可用于识别文件的内容类型.

在我的程序中,我想验证服务器端的文件内容类型.

我的客户端代码:

<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)

magic-numbers

4
推荐指数
1
解决办法
4987
查看次数

在ColdFusion中删除ROT13上的幻数

我有这个函数来计算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)

coldfusion magic-numbers rot13 coldfusion-2018

4
推荐指数
1
解决办法
88
查看次数