软件工程

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

3
将用户和用户个人资料保留在不同的表中?
我在几个项目中看到,开发人员更喜欢将基本用户信息保留在一个表中(电子邮件/登录名,密码哈希,屏幕名称),而将其余非必需用户概要文件保留在另一个表中(创建日期,国家/地区等)。所谓非必需,是指仅偶尔需要此数据。明显的好处是,如果您使用的是ORM,则查询较少的字段显然是好的。但是,然后您可以将两个实体映射到同一表,这将使您免于查询不需要的内容(同时更加方便)。有人知道将这些东西放在两个表中还有其他好处吗?

2
如何编写代码文档,为什么软件(通常)文档记录不佳?
有一些很好的示例,这些示例都记录了很好的代码,例如java api。但是,公共项目(例如git和公司的内部项目)中的许多代码都没有很好的文档记录,并且不是很新手。 在我所有的软件开发工作中,我不得不处理文档记录不佳的代码。我注意到以下情况- 代码中很少或没有注释。 方法和变量名不是自描述的。 很少或没有文档说明代码如何适合系统或业务流程。 雇用不良的开发者或不指导好的开发商。他们不能编写简单干净的代码。因此,包括开发人员在内的任何人都很难或不可能编写代码。 结果,我不得不阅读大量代码并与许多人交谈以学习事物。我觉得这浪费了大家的时间。它还为项目的新手带来了KT /知识转移会话的需求。 我了解到,由于以下原因,文档没有得到应有的重视: 懒惰。 开发人员只喜欢编写代码就什么都不喜欢。 就业保障。(如果没有人能轻易理解您的代码,那么您可能就很难被替换。) 艰难的截止日期几乎没有时间记录在案。 因此,我想知道是否有一种方法可以鼓励和执行公司或项目中的良好文档规范。无论项目的复杂性如何,用于为任何项目的系统和代码创建体面文档的策略是什么?有什么很好的例子,说明什么时候需要最少的文档或根本不需要文档? 恕我直言,我认为我们应该在项目交付后对文档进行审查。如果它不简单,简洁,说明性和用户友好性,则开发人员或技术文档工程师将对此负责,并负责对其进行修复。我既不希望人们编写大量文档,也不希望它像第一本书一样对用户友好,但是我希望它消除了数小时的分析和浪费的KT会话。 有没有办法结束或减轻这种疯狂?也许是“文档驱动的开发”?

1
如何在功能编程语言中实现分支定界?
我试图在所有函数f的集合上写一个分支和边界搜索:D-> R,其中域大小很小(| D |〜20),范围更大(| R |〜2 ^ 20 )。最初,我想出了以下解决方案。 (builder (domain range condlist partial-map) (let ((passed? (check condlist partial-map))) (cond ((not passed?) nil) (domain (recur-on-first domain range condlist partial-map '())) (t partial-map)))) (recur-on-first (domain range condlist partial-map ignored) (cond ((null range) nil) (t (let ((first-to-first (builder (cdr domain) (append ignored …

3
既然我们拥有Micro ORM,内联SQL是否仍被列为不良做法?
这是一个开放式的问题,但我想提出一些意见,因为我成长于一个以内联SQL脚本为标准的世界,然后我们都非常了解基于SQL注入的问题以及sql当时多么脆弱在各处进行字符串操作。 然后是ORM的曙光,您在其中向ORM解释查询并让它生成自己的SQL,在很多情况下,这种查询不是最佳方法,但又安全又容易。有关ORM或数据库抽象层的另一个好处是,SQL是在考虑数据库引擎的情况下生成的,因此我可以将Hibernate / Nhibernate与MSSQL,MYSQL一起使用,而我的代码从未更改,它只是一个配置细节。 现在快速发展到今天,Micro ORM似乎正在赢得更多开发人员的支持,我想知道为什么我们似乎在整个内联sql主题上都掉头了。 我必须承认,我确实喜欢没有ORM配置文件的想法,并且能够以更优化的方式编写查询,但是感觉就像我向诸如SQL注入之类的旧漏洞敞开了怀抱,而且我也将自己束缚于一个数据库引擎,因此,如果我希望我的软件支持多个数据库引擎,则需要做更多的字符串黑客攻击,这似乎开始使代码变得不可读且更脆弱。(就在有人提到它之前,我知道您可以在大多数micro orms中使用基于参数的参数,这在大多数情况下都可以防止sql注入) 那么人们对此事有何看法?在这种情况下,我将Dapper用作微型ORM,在这种情况下将NHibernate用作常规ORM,但是在每个领域中的大多数情况都非常相似。 我所说的内联SQL是源代码中的SQL字符串。曾经有过关于源代码中SQL字符串的设计争论,这有损于逻辑的基本意图,这就是为什么静态类型的linq样式查询如此流行的原因,它仍然仅是一种语言,但是在一页中说C#和Sql现在,您的原始源代码中混合了2种语言。为了澄清起见,SQL注入只是使用sql字符串的已知问题之一,我已经提到过可以通过基于参数的查询阻止这种情况的发生,但是我着重指出了在源代码中根植SQL查询的其他问题,例如缺少DB Vendor抽象以及在基于字符串的查询上丢失任何级别的编译时错误捕获功能,这些都是我们设法通过ORM的高级查询功能来解决的问题, 因此,我不太关注各个突出的问题,而更全局的是,由于大多数Micro ORM使用这种机制,现在再次将SQL字符串直接再次包含在源代码中变得越来越容易被接受。 这是一个类似的问题,它具有一些不同的观点,尽管更多是关于没有微规范上下文的内联sql: /programming/5303746/is-inline-sql-hard-coding
26 database  sql  orm 

5
用户权限检查应该在哪里进行,并且MVC由谁进行?
用户权限检查应该在模型或控制器中进行吗?谁应该处理权限检查,User对象或某些UserManagement助手? 应该在哪里发生? 检入控制器: class MyController { void performSomeAction() { if (user.hasRightPermissions()) { model.someAction(); } } ... 在Controller中进行检查有助于简化模型的操作,因此我们可以将所有逻辑保留在Controller中。 签入模型: class MyModel { void someAction() { if (user.hasRightPermissions()) { ... } } ... 通过将检查放到模型中,我们使模型复杂化,而且还确保我们不会意外允许用户执行他们不应该在Controller中进行的操作。 又是谁? 一旦我们确定了该地点,谁应该进行检查?用户? Class User { bool hasPermissions(int permissionMask) { ... } ... 但是,了解自己的能力并不是用户的真正责任,所以也许是一些帮助者? Class UserManagement { bool hasPermissions(User …
26 mvc  permissions 

8
是否有某些SOLID原则与清洁代码相反的OOP风格?
我最近与我的一个朋友讨论了有关视频游戏开发中OOP的问题。 我正在解释我的一款游戏的体系结构,令我的朋友惊讶的是,它包含许多小类和几个抽象层。我认为这是我专注于赋予一切单一职责并放松组件之间的耦合的结果。 他担心的是,大量的课程将转化为维护的噩梦。我的看法是,它将产生完全相反的效果。我们进行了长达数个世纪的讨论,最终同意了不同意,说也许在某些情况下SOLID原则和适当的OOP实际上并不能很好地融合在一起。 甚至Wikipedia关于SOLID原则的条目都指出,它们是有助于编写可维护代码的指南,并且它们是敏捷和自适应编程的整体策略的一部分。 所以,我的问题是: 在OOP中是否存在某些或全部SOLID原则不适合清理代码的情况? 我可以马上想象一下,《李斯科夫替代原则》可能与另一种安全继承形式发生冲突。也就是说,如果有人设计了通过继承实现的另一种有用模式,则LSP很可能与其直接冲突。 还有其他吗?也许某些类型的项目或某些目标平台可以使用较少的SOLID方法更好地工作? 编辑: 我只想说明我不是在问如何改善代码;)我在这个问题中提到一个项目的唯一原因是提供一些上下文。我的问题是关于OOP和一般的设计原则。 如果您对我的项目感到好奇,请参阅this。 编辑2: 我以为可以用以下三种方式之一回答这个问题: 是的,存在与SOLID部分冲突的OOP设计原则 是的,存在与SOLID完全冲突的OOP设计原则 不,SOLID是蜜蜂的膝盖,OOP将永远更好。但是,与所有内容一样,它不是万能药。负责任地喝酒。 选项1和2可能会产生很长且有趣的答案。另一方面,选项3是一个简短的,无趣的,但总体上令人放心的答案。 我们似乎正在选择方案3。

2
“蛇案”一词何时使用?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 5年前关闭。 许多人使用“ 蛇形案例 ”一词来描述变量或其他符号with_the_form_of_underscores。 在过去的一周中,我进行了几次广泛的搜索。我找不到有关该术语起源的任何信息,比Wikipedia所说的(上) 该术语最早的记录何时开始使用?

4
我为什么要使用代码合同
最近,我偶然发现了Microsoft的代码合同框架。 我阅读了一些文档,发现自己不断问:“为什么我要这样做,因为它通常也不执行静态分析。” 现在,我已经有了一种防御性编程风格,并带有如下防护异常: if(var == null) { throw new NullArgumentException(); } 我也大量使用NullObject Pattern,很少遇到任何问题。向其添加单元测试,就一切就绪。 我从未使用过断言,也从未错过它们。恰恰相反。我真的很讨厌其中包含很多毫无意义的断言的代码,这对我来说只是噪音,使我无法真正看到。代码合同,至少是Microsoft的方法,几乎​​是一样的,甚至更糟。它们给代码增加了很多噪音和复杂性。在99%的情况下,无论如何都会抛出异常-所以我不在乎它是来自断言/合同还是实际问题。程序状态真正被破坏的情况极少出现。 坦率地说,使用代码契约有什么好处?有没有?如果您已经在使用单元测试和防御性代码,我认为引入合同是不值得的,并且会给维护人员在更新方法时要诅咒的代码带来噪音,就像我看不到代码在做什么一样由于无用的断言。我还没有看到支付该价格的充分理由。

2
使用回调时,Javascript代码如何变得异步?
我一直在做很多在线阅读,试图弄清楚如何编写异步JavaScript代码。我的研究中出现的很多技术之一就是使用回调。当我了解如何编写和执行回调函数的过程时,我感到困惑的是,为什么回调似乎自动地使JavaScript执行异步。所以,我的问题是:在我的JavaScript代码中添加回调函数如何使所说的代码自动地异步?

4
为什么不建议在同一期/票证中张贴多个缺陷?
我不确定这是否是提出以下概念性问题的地方(肯定不是Stackoverflow)。 我在多项选择题考试(单一答案)中看到了这个问题,类似于ISTQB考试: 为什么不建议在同一期/票证中报告多个缺陷? 一种。为了使报告简洁明了。 b。因为开发人员可能只修复一个错误。 C。因为测试组测试人员是根据发现的错误数量进行评估的。 d。错误管理系统不支持多个错误的此功能。 我唯一的意见是a正确的答案。 b-不能这样,因为fix-feedback-resolved-closed应该避免这种情况。 c-显然是错的。 d -Redmine / Trac插件支持多个字段。 根据答题纸的答案是b。 有人可以解释为什么吗?欢迎对评论提出意见。

7
为什么在PHP中很少使用引用?
此问题是从Stack Overflow 迁移而来的,因为可以在Software Engineering Stack Exchange上回答。 迁移 6年前。 我有一些C ++知识,并且知道那里经常使用指针,但是我已经开始研究PHP开放源代码,而且我从没看过在方法中使用引用的代码。 相反,代码始终使用返回值,而不是将对变量的引用传递给方法,该方法然后更改该变量的值并只返回它。 我已经读到使用引用会占用更少的内存,那么为什么不在PHP中使用它们呢?
26 php  reference 

8
为什么大型网站的后端和前端使用不同的语言?
我对小型MVC应用程序的理解是,您拥有处理HTML,JS,jQuery等的前端,而拥有由控制器和模型组成的后端。 但是,当我与大公司的开发人员交谈时,他们经常提到拥有前端层和后端层。所以有时候,我可能会听说他们在C#中有一个前端,在Java中有一个后端。为什么任何公司都希望使用不同语言的后端和前端?这是否有助于大型网站更好地扩展? 当人们说他们的前端是用C#构建的时,这是否意味着他们使用的是前端框架(如.NET)和后端的其他框架(如Spring)?还是意味着完全不同?

5
是否可以通过分配系统上的所有空白空间来从另一个程序读取内存?
从理论上讲,如果我要构建一个程序来分配系统上所有未使用的内存,并继续请求越来越多的内存,因为其他应用程序释放了它们不再需要的内存,则可以从另一个应用程序读取最近释放的内存?还是受到现代操作系统的某种保护? 我对此没有实际应用,我只是很好奇。我意识到现实生活中分配“所有可用内存”存在一些问题。 编辑:为澄清起见,我专门询问“已释放”内存,而不访问其他应用程序当前分配的内存。

1
如果我根据GPL发布程序,是否必须继续这样做?
考虑这种情况: 我正在开发使用GPL许可库QuuxTools的程序FooSuite 我在GPL下发布了程序FooSuite 1.0 后来我发现,由于某种原因,我需要以不同的方式将程序许可给某人。 因此: 我通过QuuxTools删除了对GPL的依赖,方法是... 重写程序以不再使用该库 获得QuuxTools的不同许可(如果是双重许可,请参见PyQt) 我根据非GPL许可证发布了FooSuite 1.1。 但是,FooSuite 1.1仍然是FooSuite 1.0的派生作品。我知道陌生人做我做的事是不合法的,但是作为FooSuite的所有人,我本人是否可以不受此限制?
26 licensing  gpl 

7
回车符是否已过时?
我编写了一个开放源代码库,该库可以解析结构化数据,但由于看不到要点,因此特意省去了回车检测。它增加了额外的复杂性和开销,几乎没有好处。 令我惊讶的是,一个用户提交了一个错误,解析器无法正常工作,我发现了问题的原因是数据使用CR行尾而不是LF或CRLF。 自从切换到基于UNIX的平台以来,OSX一直没有使用LF样式的行尾吗? 我知道有些应用程序(例如Notepad ++)可以将行尾更改为显式使用CR,但我不明白为什么有人要这样做。 是否可以安全地排除支持(无论出于何种原因)决定使用旧Mac OS样式行尾的用户的统计上微不足道的支持? 更新: 需要说明的是,支持Windows行尾(即CRLF)不需要CR令牌识别。为了提高效率,词法分析器按每个字符进行匹配。通过静默忽略CR字符,CRLF令牌简化为LF。因此,CRLF令牌本身可以被认为是过时的,但这不是这个问题的目的。 最后一个为CR样式行结尾提供系统范围支持的操作系统是Mac OS 9。具有讽刺意味的是,在OSX中唯一仍将其用作默认值的应用程序是Microsoft Excel。

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.