软件工程

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

3
在访问/处理复杂数据时,将其存储为许多小块还是一大块更好?
我正在构建一个处理相当复杂的数据的Web应用程序:吉他标签。 As a reference, guitar tabs look like this: Eb|-------------------------------------------------------------------------| Bb|-------------------------------------------------------------------------| Gb|--5-5-5-5----------------------------------------------------------------| Db|--5-5-5-5--3-3-3-3--7-7-7-7--5-5-5-5--2-2-2-2--3-3-3-3--2-2-2-2--5-5-5-5-| Ab|--3-3-3-3--3-3-3-3--7-7-7-7--5-5-5-5--2-2-2-2--3-3-3-3--2-2-2-2--5-5-5-5-| Eb|-----------1-1-1-1--5-5-5-5--3-3-3-3--0-0-0-0--1-1-1-1--0-0-0-0--3-3-3-3-| 将这些数据作为大块存储,或者将其分解并按“逐个记录”的方式存储,会提高性能吗? As a use case: User changes first chord from: to: Eb|--- Eb|--- Bb|--- Bb|--- Gb|--5 Gb|--4 Db|--5 Db|--4 Ab|--3 Ab|--2 Eb|--- Eb|--- 如果我将其存储为块,则操作选项卡的代码将必须复杂得多。如果我逐条记录存储,则将需要更多地访问数据库。哪种方法更有效?潜在地,许多用户将修改数据。我想要性能最好的Web应用程序。如果这完全影响答案,我将使用MySQL。

3
Git是否具有“安全模式”以防止重写历史记录?
当您对Git(和一般的DVCS)有点新鲜,并且开始探索历史记录的更改时,如果存储库仅是本地的,则可以放心,但是如果使用遥控器并尝试使用推动这种变化。 我期望的一个功能是启用“安全模式”的能力,这基本上会阻止我执行我不应该做的事情……那是什么意思?我的意思是对已经推向原点的事物进行历史重写。我无法精确定义它,但这将包括以下情况: commit --amend 当HEAD已被推动时 rebase 非本地分支机构 reset 被推的分支 这些是可能导致下一次push失败的情况的示例(因为IIRC不会快速前进)。我偶然地做了一些,不得不在遥控器上重新创建分支。而且我仍然很幸运能够如此快地执行此操作,以至于没人能拉出我重写的历史记录。 我相信可以识别​​这种类型的更改,并根据需要阻止用户进行更改。也许有一个选择吗? 如果没有,您认为尝试创建它值得吗?您会尝试精确定义如何识别这种“危险的变化”吗?
11 git  dvcs 

6
一次连接一个字符串效率低下吗?
我回想起用C语言进行编程的日子,当两个字符串连接在一起时,操作系统必须为连接的字符串分配内存,然后程序可以将所有字符串文本复制到内存中的新区域,然后旧内存必须手动进行被发布。因此,如果像加入列表一样多次执行此操作,则OS必须不断分配越来越多的内存,只是要在下一个串联后释放它。用C语言执行此操作的更好方法是确定组合字符串的总大小,并为整个连接的字符串列表分配必要的内存。 现在,在现代编程语言(例如C#)中,我通常会看到遍历集合的内容,方法是遍历集合并将所有字符串一次全部添加到单个字符串引用中。即使具有现代计算能力,这也不低效吗?

9
分析应该与技术无关吗?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 4年前关闭。 昨天我和一位同事吵了一架。他(业务分析员,以前是程序员)认为,他应该了解实现该系统所用的技术,以便可以做出更好的设计决策。我认为(我是一名程序员),不应以任何方式将分析与技术相结合,并且我相信优秀的分析师可以做出出色的设计而不必担心实现细节。 我这样想对吗?有什么理由导致业务分析师需要了解用于实施该系统的技术? 编辑:我认为我说的时候用错了词business analyst。也许我是指架构师或系统分析师。我不习惯这些条款。如果您愿意,我的意思是像架构师或系统分析师。 谢谢大家的出色回答!我还没有很丰富的经验,很高兴您对此感到惊讶。

3
try-catch-finally块中无关的代码“有多糟糕”?
这是一个相关的问题: 在返回不良样式/危险之后,使用finally子句进行工作吗? 在引用的Q中,最终代码与所使用的结构和预取的必要性有关。我的问题有所不同,我认为这与广大受众密切相关。我的特定示例是C#winform应用程序,但这同样适用于C ++ / Java。 我注意到很多try-catch-finally块,其中有很多与异常无关的代码以及埋在该块中的异常处理/清除。而且,我会偏向于使用非常紧密的try-catch-finally块,并将其代码与异常和处理紧密相关。这是我所看到的一些示例。 尝试块将设置许多初步调用和变量,从而导致可能引发的代码。日志信息将被设置并在try块中运行。 最后,块将具有表单/模块/控件格式化调用(尽管应用程序即将终止,如catch块所示),以及创建新对象(例如面板)。 大致: methodName(...) { 尝试 { //该方法的大量代码... //可能抛出的代码... //该方法还有更多代码和返回值... } 抓住(某物) {//处理异常} 最后 { //由于异常而进行一些清理,将事情关闭 //有关所创建内容的更多代码(忽略任何异常都可能引发)... //可能会创建更多对象 } } 该代码有效,因此具有一定的价值。它没有很好地封装,逻辑有点混乱。我(痛苦地)熟悉了代码移位和重构的风险,因此我的问题归结为想要了解其他人对类似结构的代码的经验。 不良的风格是否有理由进行更改?有没有人被类似的情况严重烧死?您是否愿意分享糟糕经历的细节?别说是因为我反应过度,风格还不错吗?获得整理事物的维护利益?

4
为团队在两种口头语言之间分配的Scrum
我有一个团队,所有团队成员之间没有一种共同语言。团队分布在两个位置(尽管地理不是主要问题)。每个地点的所有团队成员都说相同的语言,并且两个地点的成员都可以说两种语言。我想介绍一下Scrum,但是在处理语言问题的后勤工作上很挣扎。 这不是一支离岸团队。所有团队成员均为公司员工,但位于不同国家/地区的两个不同办事处。幸运的是,我们在时区方面没有任何问题。语言是主要障碍。尽管可以将团队分为两个团队,但要考虑到每个地点人员的规模和技能以及其他外部因素,因此更希望将其整合为一个团队。 我认为最好使用视频会议,以便进行更丰富的沟通并帮助团队团结起来,使彼此能够看到对方并采取真正的站立方式。但是,恐怕很难在语言之间进行交流。团队中的双语成员应该口头翻译吗?或者,我们可以使用即时消息,这是我发现的有关分布式Scrum语言问题的唯一参考。我担心沟通不畅,也许对Scrum概念的介绍不佳。 在团队中处理过语言差异的经验丰富的人中,您如何解决该问题以及它对您的工作有多好?

4
我会遭受封装使用过度的困扰吗?
我在各种项目的代码中注意到了一些东西,这些东西似乎让我感到代码难闻,有些事情要做,但我无法解决。 在尝试编写“干净的代码”时,我倾向于过度使用私有方法,以使我的代码更易于阅读。问题在于代码确实更干净,但是测试起来也更加困难(是的,我知道我可以测试私有方法...),总的来说,这对我来说是个坏习惯。 这是一个类示例,该类从.csv文件中读取一些数据并返回一组客户(另一个具有各种字段和属性的对象)。 public class GroupOfCustomersImporter { //... Call fields .... public GroupOfCustomersImporter(String filePath) { this.filePath = filePath; customers = new HashSet<Customer>(); createCSVReader(); read(); constructTTRP_Instance(); } private void createCSVReader() { //.... } private void read() { //.... Reades the file and initializes the class attributes } private void readFirstLine(String[] inputLine) …

6
大型机有哪些优势?[关闭]
按照目前的情况,这个问题并不适合我们的问答形式。我们希望答案得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 8年前关闭。 大型机的缺点是被践踏的;昂贵,遗留,日渐萎缩的社区等。 我对不利因素并不特别感兴趣,但是我很好奇大型机硬件/软件是否比当前的Intel / AMD和Linux / Windows环境有任何好处。 有人告诉我,在I / O负载很重的情况下,MF特别好(并且比当前服务器还要好)。这仍然是真的吗?
11 legacy  mainframe 

6
“企业”相对于软件体系结构是什么意思?
我看到“企业”一词在软件开发人员和程序员中泛滥,似乎松散使用。 恩·特普里斯/ ˈentərˌprīz / 名词:项目或事业,通常是困难的或需要努力的。主动性和机智。 有人可以澄清一下这个术语的实际含义吗?“在企业层面”,“企业规模”?甚至有“企业版”的东西。这到底是什么意思?从上述定义来看,显然没有任何意义,因此更具体地讲软件对企业一词的含义是什么? 编辑: 要对此进行补充,该术语又如何适合诸如Enterprise Framework Model之类的短语?数据访问和数据上下文与公司范围的描述有什么关系?

2
PHP本地化,最佳实践或方法?
我正在本地化我的PHP应用程序。在选择最佳方法来实现相同目标方面,我有两难选择。 方法1:当前正在将要本地化的单词存储在php文件的数组中 <?php $values = array ( 'welcome' => 'bienvenida' ); ?> 我正在使用一个函数来根据需要提取并返回每个单词 方法2:是否应该使用存储相同字符串的txt文件? <?php $welcome = 'bienvenida'; ?> 我的问题是,就开发相同的速度和精力而言,哪种方法更好,为什么? 编辑:我想知道其中两种方法响应速度更快,为什么呢?此外,对上述代码的任何改进将不胜感激!
11 php  localization 

3
单一开发人员GIT工作流程(从简单的FTP迁移而来)
我正在尝试确定迁移到VCS对我来说是否明智。我是一个小型组织(5人)中的单个Web开发人员。由于以下原因,我想到了VCS(Git):版本控制,异地备份,集中式代码存储库(可以从家里访问)。 目前,我通常在实时服务器上工作。我进入FTP,进行修改并保存,然后重新上传并刷新。编辑通常是针对CMS的主题/插件文件(例如,concrete5或Wordpress)。这很好用,但不提供备份,也不提供版本控制。 我想知道如何最好地将VCS集成到此过程中。我打算在公司的Web服务器上设置一个Git服务器,但是我不清楚如何将更改推送到客户帐户(通常是同一台服务器上的VPS)-现在,我只需使用其详细信息登录到SFTP,直接更改。 我也不确定什么将明智地表示一个资源库-每个客户的网站都会得到自己的资源库吗? 任何见解或经验都将非常有帮助。我认为无论如何我都不需要Git的全部功能,但是基本的版本控制和事实上的云访问将非常有用。 编辑:我已经将其范围缩小到似乎最明智的两个选项。第一个基于ZweiBlumen的答案,即在实时服务器上进行编辑,然后将其提交到(外部)Git服务器。这样做的好处是我的工作流不会有太大变化(有额外的提交步骤,但其他方面是相同的)。 第二个选项是使用XAMPP在本地工作,然后从本地计算机提交更改。仅当站点上线时,我才将完成的文章从本地计算机上传到Web服务器(在最终提交到Git之后立即)。从理论上讲,这似乎还可以,但是如果该站点随后需要修改,并且我将它们放置在实时服务器上(通常这样做),那么我将需要手动复制本地存储区中已更改的文件,然后将这些更改提交给Git服务器。这似乎过分复杂,可能与我当前的工作流程相去甚远。 我认为总的来说,我会给#1选项一个机会,然后看看我如何继续。

4
使用“混合”语言进行设计:面向对象的设计还是功能编程?
在过去的几年中,我喜欢使用的语言变得越来越“实用”。我现在使用的是一种“混合”语言:C#,F#,Scala。我喜欢使用与域对象相对应的类来设计我的应用程序,并使用使编码更容易,更简洁和更安全的功能功能(尤其是对集合进行操作或传递函数时)。 但是,当涉及到设计模式时,这两个世界会“冲突”。我最近遇到的特定示例是观察者模式。我希望生产者在创建或更改项目时通知其他一些代码(“消费者/观察员”,例如数据库存储,记录器等)。 我最初是这样“功能性地”完成的: producer.foo(item => { updateItemInDb(item); insertLog(item) }) // calls the function passed as argument as an item is processed 但是我现在想知道是否应该使用更多的“ OO”方法: interface IItemObserver { onNotify(Item) } class DBObserver : IItemObserver ... class LogObserver: IItemObserver ... producer.addObserver(new DBObserver) producer.addObserver(new LogObserver) producer.foo() //calls observer in a loop 两种方法的优缺点是什么?我曾经听过一位FP专家说,那里的设计模式仅是由于语言的局限性,这就是为什么功能语言很少的原因。也许这可能是一个例子? 编辑:在我的特定情况下,我不需要它,但是..您将如何以功能方式实现“观察者”的删除和添加?(即,您将如何实现模式中的所有功能?)例如,仅传递一个新函数?

1
功能语言中的UI模式
我想开始摆弄ClojureScript,但是我对某些要点感到困惑。我的问题是,当您尝试进行功能性工作时,什么是应对来自用户交互的状态更改的好方法? 让我举几个例子。我考虑过在浏览器中运行的应用程序,但是我认为这个问题更为普遍。当然,某些事情将会改变-至少是DOM。但我想了解如何组织其余代码以使用不可变数据结构。 1)说我想将一些事件附加到某些DOM对象。这在大多数情况下都不是很难做到的:在创建节点时,将其附加有各种事件处理程序的哈希映射。但是考虑使用事件委托的情况。然后,在创建新节点时,可以将事件处理程序附加到可能已经存在的某个父节点。因此,您将不得不更改与现有节点关联的哈希。 2)说我正在为输入字段设计一个自动完成模块。每次用户按下一个键,我都可以致电服务器以获取建议。这很简单。但是现在假设我想对其进行一些优化。如果我知道所有结果都匹配,foo那就没有必要再要求所有结果匹配了foobar; 我可以过滤前者。所以我需要建立某种缓存。每当用户插入一个新单词(而不是先前输入的单词的超集)时,此缓存就会更新。再说一遍:如何为缓存建模?最合理的方法似乎是将单词映射到结果的哈希映射,但是它应该是可变的。 您能否提出一些模式,以使其更容易将由于用户交互而引起的更改合并到功能设计中?

5
为什么我的班级比本书中的班级等级(初学者OOP)更糟糕?
我正在阅读PHP对象,模式和实践。作者正试图在大学里模拟一堂课。目标是输出课程类型(讲座或研讨会),并且该课程的费用取决于它是每小时课程还是固定价格课程。所以输出应该是 Lesson charge 20. Charge type: hourly rate. Lesson type: seminar. Lesson charge 30. Charge type: fixed rate. Lesson type: lecture. 当输入如下时: $lessons[] = new Lesson('hourly rate', 4, 'seminar'); $lessons[] = new Lesson('fixed rate', null, 'lecture'); 我这样写: class Lesson { private $chargeType; private $duration; private $lessonType; public function __construct($chargeType, $duration, …

5
函数式编程中的数据结构
我目前正在使用LISP(尤其是Scheme和Clojure),并且想知道函数式编程语言中如何处理典型的数据结构。 例如,假设我想使用图形寻路算法解决问题。通常如何用一种功能编程语言(主要是对可以应用于LISP的纯功能样式感兴趣)来表示该图?我是否会完全忘记图并以其他方式解决问题?

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.