软件工程

针对在系统开发生命周期中工作的专业人士,学者和学生的问答

3
为什么long int在某些计算机上占用12个字节?
在我的机器上编译以下代码后,我发现了一些奇怪的事情: #include <stdio.h> int main() { printf("Hello, World!\n"); int a,b,c,d; int e,f,g; long int h; printf("The addresses are:\n %0x \n %0x \n %0x \n %0x \n %0x \n %0x \n %0x \n %0x", &a,&b,&c,&d,&e,&f,&g,&h); return 0; } 结果如下。注意,每个int地址之间有4个字节的差异。但是,在最后一个int和长整数之间有12个字节的差异: Hello, World! The addresses are: da54dcac da54dca8 da54dca4 da54dca0 da54dc9c da54dc98 da54dc94 …
26 c  memory  pointers 

8
如果空值是邪恶的,那么当值可以有意义地缺失时应该使用什么?
这是一遍又一遍重复的规则之一,这令我感到困惑。 空是邪恶的,应尽可能避免。 但是,但是-出于我的天真,让我尖叫-有时可能会有意义地缺乏价值! 请让我在一个示例中问这个问题,该示例来自我目前正在研究的此反模式缠身的可怕代码。从本质上讲,这是一个基于多人网络回合的游戏,其中两个玩家的回合都同时运行(例如在Pokemon中,与Chess相反)。 每次转动之后,服务器都会广播客户端JS代码的更新列表。Update类: public class GameUpdate { public Player player; // other stuff } 此类被序列化为JSON并发送到连接的播放器。 大多数更新自然都会有一个与之相关的玩家-毕竟,有必要知道哪个玩家在此回合​​中做出了哪个动作。但是,某些更新无法使Player有意义地与它们相关联。示例:游戏被强行捆绑,因为超出了没有动作的回合限制。我认为,对于此类更新,让播放器为空是有意义的。 当然,我可以利用继承来“修复”此代码: public class GameUpdate { // stuff } public class GamePlayerUpdate : GameUpdate { public Player player; // other stuff } 但是,由于两个原因,我看不到有什么改进: 现在,JS代码将简单地接收不带Player的对象作为已定义的属性,这与它为null相同,因为两种情况都需要检查该值是否存在。 如果将另一个可为空的字段添加到GameUpdate类中,则我必须能够使用多重继承来继续进行此设计-但是MI本身是邪恶的(根据经验更丰富的程序员),更重要的是,C#不会有它,所以我不能使用它。 我有一个暗示,这段代码是经验丰富的优秀程序员惊骇地尖叫的其中之一。同时,我看不到这个null会如何伤害任何事物,而应该怎么做。 你能向我解释这个问题吗?

2
标记C ++函数constexpr是否曾经很糟糕?
鉴于功能非常微不足道, int transform(int val) { return (val + 7) / 8; } 很明显,将这个函数变成一个constexpr函数很容易,允许我在定义constexpr变量时使用它,如下所示: constexpr int transform(int val) { return (val + 7) / 8; } 我的假设是,这严格来说是一种改进,因为该函数仍可以在非constexpr上下文中调用,并且现在也可以用于帮助定义编译时常量变量。 我的问题是,在某些情况下这是个坏主意吗?就像通过执行此功能一样,constexpr我是否可以遇到在特定情况下该功能将不再可用或行为异常的情况?
26 c++  c++11 

8
“ x和y之间”应该交换吗?
在我的应用程序中,有一些预定义的表达式模板可用于过滤数据。其中之一是“ between x and y”。一位质量检查工程师声称其定义存在缺陷,因为“ between 100 and 200”与“ ”给出的结果不同between 200 and 100。该表达式在内部转换为“ value >= x and value <= y”,因此,当第二个边界低于第一个边界时,显然没有结果。我检查了SQL是否存在相同的行为-“ between x and y”假定y> = x或没有结果。这意味着,至少在SQL中,运算符不是可交换的。 那么,质量保证“ between x and y”应可交换吗?

10
编程语言中的每个函数调用/块都在单独的线程中完成?[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 2年前关闭。 我目前正在创建一种有趣的编程语言,其思想是每个函数调用/新块(如果有子句,循环等)将在单独的线程中工作。它不是自动创建新线程,而是应该自动执行该标准,并且如果您希望它在主线程中运行,则必须指定它。 我对多线程并行编程的了解不多,但是我知道一些基础知识(期货,线程安全对象)。因此,我想知道这样的语言在语法上看起来如何明智,甚至是否有可能以它开头?目标不是使它“有用”,更多是为了它的乐趣和学习经验。 (很抱歉,如果这是错误的发帖地点。如果是这样,请将您指向允许我这样的问题的正确地点,我将不胜感激。)

4
库的C#名称空间和类命名约定
我正在用C#构建带有各种小型实用程序函数的库,并尝试确定名称空间和类命名约定。我目前的组织是这样的: Company Company.TextUtils public class TextUtils {...} Company.MathsUtils public class MathsUtils {...} public class ArbitraryPrecisionNumber {...} public class MathsNotation {...} Company.SIUnits public enum SISuffixes {...} public class SIUnits {...} 这是组织名称空间和类的好方法,还是有更好的方法?特别是,在名称空间和类名称(例如,Company.TextUtils名称空间和TextUtils类)中具有相同的名称似乎只是重复,这表明该方案可能会更好。
26 c#  naming  namespace 

8
有没有一种编程范例可以促进使依赖关系对其他程序员来说非常明显?
我在一个数据仓库中工作,该数据仓库通过许多流和层为多个系统提供源,并且具有迷宫般的依赖关系,将各种工件链接在一起。几乎每天我都会遇到这样的情况:我运行某些东西,它不起作用,运行大量代码,但是几个小时后,我意识到我已经设法将现在所知的一小部分概念化为流程图需要一天的稍后时间,所以我问一个人,他们告诉我必须先运行另一个流,并且如果我在这里检查(表明其他编码依赖项的巨大堆栈中某些看似任意的部分),则我将看到了这个。真令人沮丧。 如果我能够向团队建议,如果我们做更多的事情来使对象之间的依赖关系更加可见和明显,而不是将它们深深地嵌入到递归代码级甚至数据中,那可能是个好主意。之所以必须存在,是因为它被另一个流填充了,也许是通过引用一个众所周知的,经过测试的软件范例进行的,那么我也许可以使我的工作变得简单,而其他所有人都可以简化很多。 向我的团队解释这种好处是很困难的。他们倾向于按照现状接受事物,而不是“想大”,因为他们看到了能够以新方式概念化整个系统的好处–他们并没有真正看到是否可以为大型系统建模高效,那么就不太可能遇到内存效率低下,流停止唯一约束和重复键,废话数据的情况,因为这样可以更轻松地进行设计以符合原始视觉,并且以后不会遇到所有这些问题我们现在正在经历,我知道这与以往的工作不同寻常,但他们似乎认为这是不可避免的。 那么,有谁知道一个强调依赖关系并促进系统通用概念模型以确保长期遵守理想的软件范例?目前,我们几乎陷入了混乱,每个冲刺的解决方案似乎都是“只是在这里,这里和这里添加此东西”,而我是唯一一个担心事情真的开始崩溃的人。

5
如何逐步引入代码审查?
我带领一个由六个高级工程师组成的团队。我非常相信,出于所有标准原因,进行代码审查将对我们大有裨益。不一定每次更改,但至少要有稳定的背景审查。因此人们至少会看到别人的变化并开始谈论它们。 有什么好的方法来介绍评论吗?我感到团队很不情愿,因为这是另一回事,而且谈话可能会很痛苦。我觉得复习每一个变化都是起步,至少作为第一步。我希望人们在增加数量之前先进入节奏和练习以较低的频率进行评论。 有人成功地逐步引入了代码审查吗?怎么样?我已经要求对“热门”文件或库进行审查。或随机采摘。或者我选择“选择”必须审查的更改。还是冒险尝试并进行所有更改是唯一的方法?

4
在DDD中,是验证应用程序逻辑还是域逻辑?
假设我们正在使用DDD对表单进行建模;表格可能具有某种与之相关的业务规则-如果您不是学生,可能需要指定收入,如果您表示已婚,则需要列出孩子。如果您指定了一个国家,那么它应该有一个有效的国家。 这种验证是否存在于域或应用程序层中?我正在考虑的其他一些问题: 某些框架(例如Laravel)提供了验证规则,可以在请求到达控制器之前验证输入。如果在该级别进行验证,是否会破坏DDD? 对于确定国家/地区是否有效的情况,通常我只会查询世界上所有国家/地区的数据库表。但是,在DDD中,这可能(根据我的理解)是在域层上完成的。是否允许域层访问数据库,还是必须使用非SQL搜索来确定有效的国家/地区? 是否有必要在应用程序和域层都验证输入?

9
如何处理关于“过早优化是万恶之源”的误解?
我遇到了很多人,他们在原则上反对任何在英语中通常被认为是“优化”的东西,他们经常逐字引用(部分)引用“过早的优化是万恶之源”。作为他们立场的理由,暗示他们将我所说的一切解释为“过早的优化”。但是,这些视图有时是如此可笑地根深蒂固,以至于它们几乎消除了任何与最纯粹的“天真的”实现方式有关的算法或数据结构偏差……或者至少与它们之前的工作方式无关。在听到“性能”或“优化”的消息后,人们如何才能像这样使人们再次“张开耳朵”?我该如何讨论对性能有影响的设计/实现主题,而又不会让人立即想到:“这个人想花两周时间来编写十行代码?” 现在,在这里以及在Web的其他角落已经讨论了 “是否所有优化都是过早的并因此有害的”的立场,并且已经讨论了如何识别优化何时过早并因此有害的立场,但是不幸的是,现实世界中仍有一些人不愿意挑战自己对反优化的信念。 以前的尝试 几次,我试图提供Donald Knuth的完整报价,以解释“过早的优化是不好的”↛“所有的优化都是不好的”: 我们应该忘记效率低下的问题,例如大约97%的时间:过早的优化是万恶之源。然而,我们不应放弃我们那临界的3%的机会。 但是,在提供完整报价时,这些人有时有时会变得更加确信我在做的是Premature Optimization™,并深入研究并拒绝听。好像“优化”一词使他们感到害怕:在某些情况下,我能够通过避免使用“优化(e | ation)”一词来提出实际的性能改进代码更改,而不会被否决。和“性能”(这个词也很吓人),而是使用“替代架构”或“改进的实现”之类的表达方式。因此,这似乎真的是教条主义,而不是他们实际上是对我的批评进行评估,然后视其为不必要和/或过于昂贵而将其驳回。

2
为什么在Python中不推荐使用通用换行模式?
我只是注意到文件操作的通用换行符功能似乎即将退出。 为Python 3.5的文档open的mode参数表明它弃用: 'U' 通用换行模式(不建议使用) 在open记录mode参数用法时,至少追溯到Python 3.2 包含类似的“仅向后兼容”警告: 'U' 通用换行模式(为了向后兼容;不应在新代码中使用) 即使在Python 2.7中,的文档中也有类似的警告io.open。 这是什么原因?
26 python  io  deprecation 


7
有什么实际的方法可以使链接的节点结构不可变?
我决定编写一个单链接列表,并制定了使内部链接节点结构不可变的计划。 不过我遇到了障碍。说我有以下链接的节点(来自先前的add操作): 1 -> 2 -> 3 -> 4 并说我想附加一个5。 为此,由于node 4是不可变的,因此我需要创建的新副本4,但将其next字段替换为包含的新节点5。现在的问题是3参考旧的4;没有附加的5。现在,我需要复制3,并替换其next字段以引用4副本,但是现在2引用的是旧版本3... 换句话说,要执行追加操作,似乎需要复制整个列表。 我的问题: 我的想法正确吗?有什么办法可以执行追加操作而不复制整个结构? 显然,“有效Java”包含以下建议: 类应该是不可变的,除非有充分的理由使它们可变。 这是变异性的好例子吗? 我认为这不是建议答案的重复,因为我不是在谈论清单本身。显然,它必须是可变的才能符合该接口(无需执行诸如在内部保留新列表并通过getter检索它的操作。不过,经过深思熟虑,即使这样也需要进行一些修改;将其保持在最低限度)。我说的是列表的内部是否必须不可变。


9
声明式编程的梦想[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 4年前关闭。 为什么没有实现声明式编程的梦想?有什么具体的障碍阻碍?举个简单的例子,为什么我不能说 sort(A) is defined by sort(A) in perm(A) && asc(sort(A)) 并自动获得排序算法。perm表示排列,asc表示上升。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.