我目前面临着一个非常不寻常的设计问题,希望比我更聪明的开发人员能够提供一些见解.
没有太具体,我被非营利组织聘用,以协助重建他们的遗产,但非常有价值(在社会价值方面)软件.开发团队不同于我作为软件开发人员时遇到的任何开发团队,由少数开发人员和更多非编程领域专家组成.这种安排的不寻常之处在于领域专家(我们称之为内容创建者),使用自定义工具(其中一些基于prolog专家系统引擎)来开发基于Web的软件组件/表单.
系统使用非常笨拙的回发模型来执行服务器端的逻辑操作并返回新的表单/结果.它很慢,容易出现故障.简单的东西,比如利用现有的工具创建HTML表单是多少更艰巨的比它应该是.随着对更具交互性和高性能体验的需求的增长,软件开发人员越来越多地发现他们必须绕过内容创建者使用的专家系统/可视化工具,并在javascript中手动编写新组件.内容创作者越来越感到他们的双手被束缚,因为他们现在无法贡献新的组件.
我一直在倡导完全放弃以前的模型并采用典型的软件开发过程.如前所述,由于非程序化开发工具已无法满足业务需求,因此该项目自然而然地向此发展.
然而,内容创建者可以做出非常宝贵的贡献,我希望他们能够专注于使用像Cucumber这样的工具正式指定软件的预期行为,而不是参与实现.
我的同事,我非常尊重和怀疑,比我更有知识,认为现有的过程很好,我们只需要建立更好的工具.然而我不禁觉得这种方法存在根本性的缺陷.我还没有找到一个实例,无论是历史还是现代,这种软件开发模式都取得了成功.COBOL的开发理念是允许业务人员/领域专家在不需要程序员的情况下编写应用程序,在我看来,所有这些都是创建一种新的程序员 - COBOL程序员.如果有可能开发出有效的系统,允许非程序员创建非平凡的应用程序,对程序员的需求肯定会低得多吗?我所知道的唯一适合这种模式的框架是SAP的Smart Forms和Microsoft的Dynamix AX--这两个框架都是特定领域的ERP系统.
这两个概念之间的妥协是将某种DSL作为模板语言来实现.我甚至不确定这会成功,因为除了一个例外,所有内容创建者都完全不是技术性的.
我还考虑使用图形/工具箱样式工具构建基于Visual Studio或Net Beans的自定义IDE.
非程序化开发是一个愚蠢的错误吗?这总是会导致一些令人不满意的事情,需要程序员亲自动手吗?
非常感谢您花时间阅读本文,我当然感谢任何反馈.
通常我使用无序列表标签来设置表单,例如
<fieldset>
<ul>
<li>
<label for="txtName">Name</label>
<input type="text" id="txtName" />
</li>
</ul>
</fieldset>
Run Code Online (Sandbox Code Playgroud)
但是,我经常会看到使用标记的<p>标记,如下所示:
<fieldset>
<p>
<label for="txtName">Name</label>
<input type="text" id="txtName" />
</p>
</fieldset>
Run Code Online (Sandbox Code Playgroud)
哪个在语义上更正确?除了<p>风格更简洁之外,不同的方法是否有任何利弊?
编辑:在这里清楚地打开一罐蠕虫 - 更多选择,哇!:) W3C在这里有推荐吗?
有趣的W3C建议似乎是最不优雅的解决方案:
<p>
<input type="radio" name="flavor" id="choc" value="chocolate" />
<label for="choc">Chocolate</label><br/>
<input type="radio" name="flavor" id="cream" value="cream"/>
<label for="cream">Cream Filled</label><br/>
<input type="radio" name="flavor" id="honey" value="honey"/>
<label for="honey">Honey Glazed</label><br/>
<input type="submit" value="Purchase Donuts"/>
</p>
Run Code Online (Sandbox Code Playgroud)
遗憾的是,关于标记表单元素的最佳约定没有更强的指导.
我很想知道人们如何处理条件标记,特别是在发布和调试版本之间的主页中.
适用于的特定方案是处理连接的js和css文件.我目前正在使用YUI压缩的.Net端口从大量单独的文件中生成单个site.css和site.js.
我想到的一个想法是将js和css include部分放在用户控件或面板集合中,<link>并<script>根据程序集的Debug或Release状态有条件地显示和标记.有点像:
#if DEBUG
pnlDebugIncludes.visible = true
#else
pnlReleaseIncludes.visible = true
#endif
Run Code Online (Sandbox Code Playgroud)
面板在语义上真的不是很好 - <script>在a中包装标签<div>有点粗糙; 必须有一个更好的方法.我也认为像<div>内部的块级元素<head>将是无效的html.
另一个想法是可以使用web.config部分替换来处理,但我不确定如何去做.
使用authlogic 2.1.3和authlogic-oid 1.0.4一旦rails命中控制器向OpenID提供者发出请求,我就会收到以下错误:
uninitialized constant OpenIdAuthentication::InvalidOpenId
Run Code Online (Sandbox Code Playgroud)
我还安装了以下内容:
environment.rb中的Gems配置如下:
config.gem "authlogic"
config.gem "authlogic-oid", :lib => "authlogic_openid"
config.gem "ruby-openid", :lib => "openid"
Run Code Online (Sandbox Code Playgroud)
任何建议将不胜感激,谢谢.
有人知道在Visual Studio中使用VIM样式折叠的方法吗?我在c#类文件中使用了#region块,它们很棒,但遗憾的是javascript和css没有相同的功能.我目前正在研究的网站/应用程序有很多css选择器和javascript,导航整体文件变得越来越困难.
我们考虑过的一个选择是将css和javascript分解为类似于jquery模块的单独文件,但是这会在增加http请求的总数方面引入性能问题.
如果有人有任何管理疯狂的建议,我将非常感激!
更新:Richard Kimber建议使用 visual studio 的书签功能,使标题导航更易于管理.这是朝着正确方向迈出的一步,但没有代码折叠/阻塞那么有用.
Rake允许使用以下语法:
task :my_task, :arg1, :arg2 do |t, args|
puts "Args were: #{args}"
end
Run Code Online (Sandbox Code Playgroud)
我希望能够做到这一点,但使用RSpecs SpecTask.
遗憾的是,以下情况失败:
desc "Run example with argument"
SpecTask.new('my_task'), :datafile do |t, args|
t.spec_files = FileList['*_spec.rb -datafile=#{args}']
t.spec_opts = ["-c -f specdoc"]
end
Run Code Online (Sandbox Code Playgroud)
是否可以通过SpecTask实现这一目标,还是有其他方法?
有没有办法使下面的代码工作?
add = lambda n: (yield n) or add(n+1)
Run Code Online (Sandbox Code Playgroud)
(答案不需要是功能样式)
任何人都可以建议一种可用于编写JavaScript API 包装器的模式,其中多个实现之间没有共享代码吗?我们的想法是为客户端消费者提供一个包装API,用于运行时确定的许多可能API之一.API调用可以是已经在应用程序环境中的对象/库,也可以是Web服务调用.
以下伪代码是我考虑过的两种方法:
var apiWrapper = {
init: function() {
// *runtime* context of which API to call
this.context = App.getContext();
},
getName: function() {
switch(context) {
case a:
return a.getDeviceName() // real api call
case b:
return b.deviceName // real api call
etc...
}
// More methods ...
}
}
Run Code Online (Sandbox Code Playgroud)
优点:可以为库消费者维护一致的API.
缺点:将导致庞大的整体库,难以维护.
// set apiWrapper to the correct implementation determined at runtime
require([App.getContext()], function(api) {
var apiWrapper = api;
});
Run Code Online (Sandbox Code Playgroud)
// …Run Code Online (Sandbox Code Playgroud) 我刚开始使用factory_boy django库来测试工厂,并且遇到了重复键约束违规的问题.
from datetime import date, timedelta
from django.test import TestCase
from app.test.factories import MemberFactory, ProgrammeFactory
from app.models.member_programme import MemberProgramme
class MemberProgrammeTestCase(TestCase):
def member_programme(self):
yesterday = date.today() - timedelta(days=1)
return MemberProgramme.objects.create(
mem=MemberFactory(),
prg=ProgrammeFactory(),
date_registered=yesterday)
def date_registered_should_be_defined_test(self):
# This test passes
memprg = self.member_programme()
assert hasattr(memprg, 'date_registered')
def date_registered_should_be_in_past_test(self):
# This test fails
memprg = self.member_programme()
assert memprg.date_registered < date.today()
Run Code Online (Sandbox Code Playgroud)
class CountryOfOriginFactory(factory.Factory):
""" Factory class for app.models.CountryOfOrigin
"""
FACTORY_FOR = CountryOfOrigin
code = 'UK'
the_country = 'United Kingdom' …Run Code Online (Sandbox Code Playgroud) 我是集成测试的新手,但到目前为止,使用Se:IDE创建了一套测试,取得了很大的成功.因为我一直在运行我的测试,我发现我正在生成大量数据,而且我想在自己之后进行清理.
我的大部分测试都涉及创建一个新的"页面",并且查询字符串中提供了id.我想让Se:IDE存储一个查询字符串值并将其传递给另一个调用delete方法的页面,以便在运行我的验证后进行整理.
我看到我可以使用命令storeLocation,但我不确定如何解析查询字符串中id的值,然后使用Open将其传递给另一个页面.
我是否已达到需要将测试迁移到c#的程度,或者使用IDE可以实现这一点吗?
javascript ×3
css ×2
python ×2
asp.net ×1
compression ×1
django ×1
factory-boy ×1
forms ×1
generator ×1
html ×1
msbuild ×1
openid ×1
rake ×1
recursion ×1
rspec ×1
ruby ×1
selenium ×1
semantics ×1
unit-testing ×1