软件工程

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

7
OOP如何演变为包含属性的概念
我来自C ++背景,在目前的工作中全力以赴使用C#,并且我刚刚读了很多问答,内容涉及公共领域和属性之间的区别以及此变化和体现的所有来回变化。基本问题(例如此SO帖子和所有相关的链接问题)。所有这些问题都是根据实际存在的差异解决的,这些差异应理所当然地认为存在财产制度,但是我认为最好从所有语言的设计者首先决定支持财产的角度来解决这个问题。地方正在思考(在此处查看 Wikipedia文章中的列表))。OOP是如何从C ++ / Java扩展到Wikipedia文章有趣地标识为方法和成员数据之间的中间地带的: “也就是说,属性位于类的成员代码(方法)和成员数据(实例变量)之间,并且属性提供比公共字段更高的封装级别。” MSDN进一步增加了背景: “尽管从技术上讲,属性在本质上与方法非常相似,但是它们的使用场景却大不相同。应将它们视为智能字段。它们具有字段的调用语法和方法的灵活性。” 我想知道这种中间封装水平对于一般的编程证明是有用的。我假设在表达OOP范式的编程语言的第一个化身中没有这个概念。

2
Java中未初始化的对象变量和初始化为null的对象变量有什么区别
我有以下两个对象变量 Date a; Date b=null; 绝对“ a”和“ b”都没有引用任何对象。 现在,如果我调用以下语句 System.out.println(a.toString()); 会有编译时错误,但是如果我调用以下语句 System.out.println(b.toString()); 不会有编译时错误,但会存在运行时错误。这是什么原因,什么值将实际存储在“ b”中以表示空值?
12 java 

4
为什么在方法名称中使用连词是不好的命名约定?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 5年前关闭。 在我的团队中,我们与一些软件架构师紧密合作。他们批准我们项目的所有设计决策,进行一些代码审查等。 我们的项目主要包括使用Symfony 2框架以PHP实现的后端功能。因此,在语法上,代码,命名约定和项目结构看起来几乎与Java的外观相同(Symfony 2鼓励采用这种结构)。我之所以这样说是因为特定于Java的约定也适用于我们的情况(如果可能)。 最近,他们提出了一些令我感到很奇怪的东西:所有方法的名称中都应带有连词,例如getEntityOrNull,setValueOrException等等。 这样的命名约定对我来说是非常错误的,但是我无法提出任何具体的论据或在线文章/页面来专门挑战这一点。 我想到的唯一的东西是: 此类信息应出现在方法的注释中,例如@return或@throws 在方法名称中使用连词(“和”,“或”等)通常表明未适当遵守“单一责任原则” 反对该命名约定的其他一些具体论点是什么?

2
用外行的话来说,剩下的递归是什么?
根据code.google.com上的一页,“左递归”的定义如下: 左递归只是指任何递归非终结符,当它产生包含自身的语句形式时,其自身的新副本出现在生产规则的左侧。 维基百科提供了两种不同的定义: 就上下文无关文法而言,如果非r产生的任何产品(“替代”)中的最左符号立即(直接/直接向左递归)或通过其他一些非终结符,则该非终结r是左递归定义(间接/隐藏的左递归)再次重写为r。 “如果我们能找到一些非终结符A,那么语法将是左递归的,它最终会得出一个以其自身为左符号的句子形式。” 我只是在这里刚开始进行语言创建,而我在业余时间做。然而,当它归结为选择语言解析器,无论是左递归被该分析器或支持该分析器是一个问题马上来了前沿和中心。查找诸如“句子形式”之类的术语只会引出更多行话,但是“左”递归的区别几乎必须非常简单。请翻译?

3
依赖倒置原则与“编程到接口而不是实现”
我试图了解依赖倒置原则与“程序到接口,而不是实现”原则的区别。 我了解“对接口编程,而不是实现”的含义。我也了解它如何允许更灵活和可维护的设计。 但是我不理解依赖关系反转原理与“程序到接口,而不是实现”原理有何不同。 我在网上的几个地方都读到了DIP,但这并没有消除我的困惑。我仍然看不到这两个原则之间的区别。谢谢你的帮助。

3
全局请求上下文-反模式?
今天我在和我的一位同事谈论Python Web框架以及我们对它们的印象。我告诉他,我认为Flask具有全局请求的气味很难闻,并且是一种反模式。 该文档说关于请求上下文: 相反,在请求处理期间,存在其他一些规则: 当请求处于活动状态时,上下文本地对象(flask.request和其他对象)指向当前请求。 任何代码都可以随时获取这些对象。 我认为我了解此设计决策背后的想法-使应用程序更简单。这只是一个折衷,就像在Thread Locals的情况下: 是的,使用线程本地化通常不是一个好主意。它们给不基于线程概念的服务器造成麻烦,并使大型应用程序难以维护。但是Flask并不是专门为大型应用程序或异步服务器设计的。Flask希望使其能够轻松快捷地编写传统的Web应用程序。 使用当前请求信息修补全局对象是否是反模式? 我相信是这样,因为从静态代码分析器的角度来看,它是一个全局状态,尽管事实并非如此。作为程序员,如果不仔细阅读文档,我将无法理解其工作原理。这对测试有影响。 将请求作为参数传递给视图不是一个好习惯吗?我认为它更具可读性,明确性且易于调试。并避免全局状态。

3
刚被聘为高级开发人员,甚至从未成为初级开发人员,我应该期待什么?[关闭]
关闭。这个问题是题外话。它当前不接受答案。 想改善这个问题吗? 更新问题,以使它成为软件工程堆栈交换的主题。 6年前关闭。 我晚上一直是自由职业者和编码员,最近一段时间,尽管在某些特定领域我有些欠缺,但我在一家不错的纽约公司接受了几次面试之后被录用了。对于公司而言,雇用经验较少的老年人是否常见?他们会等几个星期以遵守一定的学习曲线吗? 我对在公司工作一无所知,所以这就是我担心的原因。一个星期后,我仍在检查和探索资源,但是工作了一个星期后,似乎有些同事正在考虑我的进度很慢。我擅长数学,物理,算法,但仍然需要了解该公司使用的所有模板。 这里的任何人都已经收到了经验不足的高级团队成员吗?这可以接受吗? 我正计划与老板开会,以免再为此担心。听起来是一个好主意? [编辑] 感谢您提供这些答案。我绝对是一位新的高级开发人员。我星期一更加自信地回到了办公室。我猜想,当您获得丰厚报酬的最初几周,在未知的模板/资源面前感到有点不称职是正常的。

2
是否可以嵌套静态库依赖项?
我在QT工作。 静态库可以依赖于另一个静态库吗?(静态Lib是通过链接另一个静态库创建的) 如果是,在链接到lib2之后,生成的lib(lib1)是否可能不包含lib2的所有代码吗? 在我的Qt项目中,我使用的是静态库,该库依赖于多个库。尽管我的代码中只需要一个库(以及该类的一个.h),但我必须添加所有库(及其项目中的所有标头)。 请说明情况。
12 c++  qt  static-linking 

3
单断言单元测试不会违反DRY原理吗?
每当我编写单元测试时,我总是试图在每个测试中使用一个断言,以便在测试失败时简化调试。但是,当我遵循这个规则时,我感到我在每个测试中都在不断复制相同的代码,并且通过进行更多的测试,变得更难回头阅读和维护。 那么单断言测试是否违反DRY? 而是否有一个很好的规律可循找到了很好的平衡,就像刚有每个方法一个测试?* *我意识到可能没有一种适合所有需求的解决方案,但是有没有建议的解决方法?

2
我们可以建造一台功能正常的计算机吗?
就像FP一样,最终,我们所有的程序都是结构化的。也就是说,我们制作它们的纯度或功能无关紧要-它们始终会转换为汇编,因此实际上在幕后运行的是指令,状态和循环。我们有点模仿FP。 作为硬件新手,我的问题是:为什么我们不使用实际上以功能样式计算事物的计算机体系结构?例如,一台计算机可能由原始的“功能芯片”组成,例如“ concat”,“ map”和“ reduce”,而程序只会告诉计算机如何在这些芯片之间流动数据以计算所需的结果,例如连接语言。 这真的没有道理,但可以说明我在想什么。

2
为什么要对结构使用typedef?
在C语言(ANSI,C99等)中,结构存在于自己的名称空间中。链表的结构可能看起来像这样: struct my_buffer_type { struct my_buffer_type * next; struct my_buffer_type * prev; void * data; }; 然而,对于大多数C程序员来说,自动对这些结构进行如下类型的定义似乎是很自然的: typedef struct tag_buffer_type { struct tag_buffer_type * next; struct tag_buffer_type * prev; void * data; } my_buffer_type; 然后像普通类型一样引用该结构,即get_next_element(my_buffer_type * ptr)。 现在我的问题是:是否有特定原因? 维基百科说http://en.wikipedia.org/wiki/Typedef#Usage_concerns 有些人反对typedef的广泛使用。大多数参数都以typedef仅隐藏变量的实际数据类型为中心。例如,Linux内核黑客和文档编制者Greg Kroah-Hartman阻止将它们用于除函数原型声明以外的任何内容。他认为这种做法不仅不必要地混淆了代码,而且还可能导致程序员意外地滥用大型结构,认为它们是简单的类型。[4] 其他人则认为,使用typedef可以使代码更易于维护。K&R指出使用typedef有两个原因。首先,它提供了使程序更具可移植性的方法。不必更改在程序源文件中出现的所有类型的类型,只需更改单个typedef语句即可。其次,typedef可以使复杂的声明更易于理解。 我个人想知道,使用单独的struct命名空间是否有时没有使用类型定义的结构没有足够的好处,并且由于周围存在着几种C编程文化(我的经验是Windows C编程与Linux C编程有着不同的传统),如果还有其他我不了解的传统。 然后,我对历史考量(C的前身,第一个版本)感兴趣。

2
Clojure中的方括号和花括号是否仍然是S表达式?
我正在尝试学习Lisp,并查看那里的所有Lips及其差异。 我看到在Scheme的某些实现中,您可以将方括号与圆括号互换使用以提高可读性,因此,由于对它们进行了相同的处理,因此我认为它们仍然像其他所有内容一样只是S表达式。 但是,在Clojure中,我看到方括号和花括号用于表示不同的数据类型,例如向量等。这些还是仍然有效的S表达式,还是必须将它们视为原子?这不是“破坏”整个S表达式的概念,从而使Clojure成为“不纯的” Lisp吗?
12 lisp  clojure 

6
不变类型的缺点是什么?
当不希望更改类的实例时,我看到自己使用越来越多的不可变类型。它需要做更多的工作(请参见下面的示例),但是可以更轻松地在多线程环境中使用这些类型。 同时,即使可变性不会使任何人受益,我也很少在其他应用程序中看到不可变类型。 问题:为什么在其他应用程序中很少使用不可变类型? 这是因为编写不可变类型的代码时间更长, 还是我错过了某些东西,使用不可变类型时有一些重要的缺点? 现实生活中的例子 假设您是Weather从RESTful API 获得的: public Weather FindWeather(string city) { // TODO: Load the JSON response from the RESTful API and translate it into an instance // of the Weather class. } 我们通常会看到的是(删除新行和注释以缩短代码): public sealed class Weather { public City CorrespondingCity { get; set; } public …
12 c#  immutability 

2
可能以下划线开头的变量/成员会困扰编译器吗?
从高中开始我就被教导要定义如下变量: int _a; 要么 int __a; 应该将其视为不良做法,因为这最终会使使用下划线开头的变量来命名临时变量的编译器感到困惑。 据我所知,这就是有些人喜欢在名称末尾移动下划线的原因,例如: int a_; 但是,我看到很多代码都使用下划线开头的变量。而且该代码在Visual Studio 2010和g ++ 4.x中都可以很好地构建。 所以我想知道:这今天不是问题吗?现代编译器在命名约定方面更聪明吗?

4
如何管理从Web应用程序发送的自动电子邮件
我正在设计一个Web应用程序,并且想知道如何设计用于管理自动电子邮件发送的体系结构。 目前,我已将此功能内置到我的Web应用程序中,并且根据用户输入/交互(例如创建新用户)发送电子邮件。问题是直接连接到邮件服务器需要花费几秒钟的时间。扩大我的应用程序,这将是未来的重大瓶颈。 在我的系统体系结构中管理发送大量自动电子邮件的最佳方法是什么? 不会发送大量电子邮件(每天最多20​​00个)。电子邮件无需立即发送,最多可以延迟10分钟。 更新:消息队列已作为答案,但是如何设计?是否可以在应用程序中处理并在安静的时间段进行处理,还是我需要创建一个新的“邮件应用程序”或网络服务来仅管理队列?

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.