我试图了解通过面向对象的构建器DSL构建SQL与参数化原始SQL字符串的好处.在研究/实现相同的查询三种方式之后,我注意到原始SQL是迄今为止最容易阅读的.这引出了一个问题,"为什么要跳过篮筐?" 为什么不直接声明和使用原始SQL?
这就是我的想法:
首先,我想它会使SQL更具可移植性,因为任何具有适配器的DB都可以使用它.我猜这是个大人物吧?但是,对于大多数数据库来说,大多数T-SQL都不是可理解的吗?
其次,它提供了一个可以重用的查询对象 - 作为其他查询,命名范围链接等的基础.
通过构建SQL而不是声明SQL,您实现的主要投资回报是什么?
def instances_of_sql(ttype_id) #raw sql
ttype_id = get(ttype_id).try(:id)
ti = get('tmdm:type-instance')
inst = get('tmdm:instance')
type = get('tmdm:type')
self.class.send :sanitize_sql, [%{
SELECT t.*
FROM associations a
JOIN roles type ON type.association_id = a.id AND type.ttype_id = ?
JOIN roles inst ON inst.association_id = a.id AND inst.ttype_id = ?
JOIN topics t ON t.id = inst.topic_id
WHERE a.topic_map_id IN (?)
AND a.ttype_id = ?
AND type.topic_id = ?
}, type.id, inst.id, self.ids, ti.id, ttype_id]
end …Run Code Online (Sandbox Code Playgroud) 该swap!函数是Clojure工具箱中最惯用的工具之一,可以进行instance?检查.我们被告知在编程中避免实现类型检查的条件,更喜欢多态(协议).奇怪的是,ClojureScript没有ISwap直接针对原子实现协议,而是在swap!检查主题是否是原子之后,在公共api 中反而回落协议.
我认为这种策略必须用于性能原因,因为原子是swap!许多其他原子方法的主要用例.这是正确的吗?
我本来希望实现一个atom的api作为实际协议的一部分,这样就不需要这种东西了.
(defn swap!
"Atomically swaps the value of atom to be:
(apply f current-value-of-atom args). Note that f may be called
multiple times, and thus should be free of side effects. Returns
the value that was swapped in."
([a f]
(if (instance? Atom a)
(reset! a (f (.-state a)))
(-swap! a f)))
([a f x]
(if (instance? Atom a)
(reset! a (f (.-state a) x))
(-swap! a …Run Code Online (Sandbox Code Playgroud) 编程的圣杯是一次解决问题,并永远重复使用该解决方案.然而,尽管我付出了最大的努力,但我发现我经常重新处理熟悉的问题.除了GoF设计模式之外,我曾多次设计过日历,内容管理和人/组织地址簿,仅举几例.
我想知道是否有任何好的资源(书籍,网站,等等)我可以仔细阅读常见的高级商业设计.我确实意识到我的项目和我可能发现的任何模式之间的要求会有所不同,但我确实希望事情的核心保持不变,那将会有很多来之不易的经验.此外,尽管如此,我只是喜欢阅读有关设计出现的决策背后的过程和理由.当商店,初创公司和编码员对他们的设计透明时,我喜欢它.(例如37Signals,Garret Dimon)
这篇文章涉及这个主题并将这些高级设计模式称为"功能设计模式",但我不确定这是我所描述的常用术语.对"功能设计模式"的搜索并未发生太多变化.我还搜索了"领域特定设计模式"和"数据模型设计模式",后者提供了一个有趣的结果,所以这可能更多的是目标.你知道我想用什么术语描述什么?有什么好资源吗?是否有其他商店/程序员透明地展示他们的新设计?
关于html表单,一个非常常见的标记模式是:
<form ...>
<p>
<label>Name:</label>
<input .../>
</p>
<p>
<label>Birthdate:</label>
<input .../>
</p>
..
<input type=submit/>
</form>
Run Code Online (Sandbox Code Playgroud)
您通常提供多少标记(类等)以允许表单的最灵活的可视化格式?也就是说,您添加了多少标记来帮助您的css选择器并使用通用选择器?
<form ...>
<p class='name'>
<label>Name:</label>
<input .../>
</p>
<p class='birthdate'>
<label>Birthdate:</label>
<input .../>
</p>
..
<input type=submit/>
</form>
Run Code Online (Sandbox Code Playgroud)
与
<form class='person' ...>
<p class='name string'>
<label>Name:</label>
<input .../>
</p>
<p class='birthdate date'>
<label>Birthdate:</label>
<input .../>
</p>
..
<input type=submit/>
</form>
Run Code Online (Sandbox Code Playgroud)
在第二种情况下,直接从数据库添加泛型类型("日期")可以更容易地一致地格式化日期字段.包装分组("人")以显示字段来自的模型也可以提供帮助.(或者我可以使用内部DIV.)然而,为了增加css重用,我发现自己添加了额外的标记.在我读过的一些书中,我听说标记越少越好(虽然这对我来说是真的很粗糙).例如,我很可能已使用其中一个先前块的标记,并为css添加了更多选择器.
决定标记有多大意义的原则是什么?或者在css方面放多少钱?
此外,我知道我可以选择输入的名称,但由于这是一个嵌套元素,我失去了从外部包装器("p")控制格式的能力,这通常是我想要额外控制的地方.
我在一家商店工作,维护一个相当新的应用程序.该应用程序仍有其公平的错误,每天都有大量的门票.我们给这些票证提供的错误信息没有它可能有用,因为应用程序是在发布模式下编译的,我读到的更小更快(有意义).
将.NET应用程序部署到以调试模式编译的生产是否有任何后果?我希望它会慢一点,但我已经看到差异是名义上的.这可以向我们保证,当我们在故障单上出现错误时,我们会将这些错误与行号相关联,这当然会使调试变得更加容易.
任何会阻止你这么做的主要危险信号?我的任务是研究这种可能性.所以感谢任何反馈.
在调试期间第二次让Firefox(FireBug)崩溃后(我在Ubuntu上),我决定使用Chrome.在大多数情况下,这很棒.我只是一个大问题.在FireBug中,当您将某些内容记录到控制台时,您始终会获得该对象的字符串表示形式.因此,在大多数原型上实现toString是很有意义的,允许在开发人员面板或控制台中的任何对象出现时随时显示最重要的信息.
如果我的代码记录以下内容:
console.log(bill_gates);
Run Code Online (Sandbox Code Playgroud)
我不希望我的对象在控制台中的第一个表示形式是:
Object
Run Code Online (Sandbox Code Playgroud)
什么时候可能是:
Person{Bill Gates, Microsoft Founder, dob: Oct 28}
Run Code Online (Sandbox Code Playgroud)
我不应该双重记录所有内容以弥补这个缺点:
console.log(bill_gates, bill_gates.toString());
Run Code Online (Sandbox Code Playgroud)
此外,当您向下钻取一个对象并发现您的对象由标记为"对象"的其他对象组成时,双重记录无效.
想象一下,去一个每个人的名字徽章都写着"人"的聚会.我想要的是关于那个人的身份的更多细节,也许是"Ned Campbell,房地产经纪人"或"Sue Bradshaw,保险销售".在FireBug中,您的对象佩戴自定义名称标记(基于您的toString实现).在Chrome中,所有对象都佩戴名称为"对象"的徽章.你必须花时间询问对象(向下钻取其属性和方法)以找出你正在处理的对象.多么浪费.
这对我来说是对其他精湛的Chrome Devtools设计的主要监督.是否有某种方式(可能是扩展)使Devtools显示对象(无论它们出现在哪里)的字符串表示形式如FireBug那样?
我不太了解JavaScript垃圾收集器,只是它试图管理引用,以便可以定期从内存中清除未引用的对象.如果语言实施者可行的话,我正在思考一些我认为可以提高性能的东西.
它会像这样.在文件中添加一行:
"no gc";
Run Code Online (Sandbox Code Playgroud)
这与use strict设置类似.它会将文件中定义的所有内容标记为不进行垃圾回收.我认为这将在jQuery和下划线等库中使用.所有辅助方法都将被标记并存储在不由GC管理的单独的内存区域中.
虽然我知道这可能最终会保留那些从未使用过的东西; 它至少会将它与定期的GC过程隔离开来.因此,虽然我们可能会吞噬一些额外的内存,但至少可以减轻GC处理的负担.
我为这个建议的天真而道歉,因为我从未实施过GC.我只是想知道这个想法是否可行,或者JavaScript是否已经以某种方式做到了这一点.
我认为 Windows 支持的 NTFS 中存在扩展文件属性。我找不到用于访问/更新属性的 cmd。
是否有支持此功能的 Windows(及其文件系统)风格?
我尝试了getfattr、setfattr和许多其他命令。attrib不是吗。
如果扩展属性要跨文件系统保持可移植性(即使是在 FUSE 中实现的虚拟),那么所有目标平台都需要在用户空间(一个 cmd 或一组 cmds)中呈现一个 api。
我有一个客户端界面,允许用户对树状轮廓执行多次编辑.我认为构成该大纲的记录的总和是单个资源(/大纲/ 39),即使其部分可以通过不同的URL作为单独的资源访问.
问题是用户可以编辑轮廓中的现有节点以及向轮廓添加新节点.通常情况下,当您编辑某些内容时,请将其更改,当您添加新内容时,请将其发布; 但是,在某些情况下,您需要在单个事务中包装所有更改(包括添加和编辑).人们处理这个问题的实际方法是什么?
即使轮廓已经存在且PUT看起来合适,嵌入式增加也违反了PUT的幂等性.我不确定POST是否合适.出于设计目的,我决定不保存用户所做的每个离散更新,但我想这提供了一个解决方案.但是,必须有其他人处理我的问题或对此有所了解.
通常,当我在开发期间从控制台运行rails应用程序时,我可以按Ctrl+ C然后退出.然后我可以再次运行应用程序,从而弹出它并实现更改.
我正在运行一个sinatra应用程序.我只是运行ruby文件.
$: ruby myapp.rb
Run Code Online (Sandbox Code Playgroud)
但是,当我按Ctrl+ C时,它不会停止应用程序.我不得不调出Ubuntu系统监视器并终止Ruby进程.很烦人.
有谁见过这个/之前处理过这个?