标签: declarative

WF,WCF和声明性服务(或者:微软的"声明性"是什么意思?)

我已经制作了这个社区Wiki,因为有些人可能认为它可以辩论,其他人可能会认为这是一个用词来表示他们真正意义的问题(换句话说,这是一个意见问题,这是一个意见问题).

关于声明性编程的SO有一个普遍的问题,它有一些很好的答案.

但是我对微软福音传道者的这篇博文有点不满.

声明性编程的一个优点是,您可以指出您想要做什么,而不是如何做.

到目前为止,这么好 - 事实上,这与SO问题上接受的答案完全一致.

但是请查看有关"服务实施"的部分,

您可以查看几十行xaml代码,并能够确定如何配置WCF服务以及如何定义相应的工作流.

看了一些例子后,让我简单回答一下,说"不,我不能".但是,不要轻率地解雇这些东西,让我们看看文档.

这需要一段时间,但最终现实已经赶上了讽刺 ......但这不是重点 - 当然他们并没有认真地建议这样做来揭露像添加这样的微不足道的东西.我也不是在抱怨荒谬的冗长,以及任何人都会手写这样的东西的奇怪想法 - 它看起来更像是编译器的输出而不是人类可读的语言.

对我来说,难题是声称这是"声明性的".然而它的核心是一个任务声明.

还有更多:

声明性服务在XAML中以声明方式定义,并提供另一层抽象.基本上,您可以通过定义服务要执行的操作而不是如何执行操作来创建服务模型.整个服务可以以声明方式定义,包括操作的实现.

因此,如果我们说声明性声明性三次,那就使它成为声明性的.疑难杂症.如果我们说出"你想做什么而不是怎么做"的神奇短语,那么我们可以忽略一点,在下一句话中,我们将指定"操作的实施",所以我们我会准确地说明如何做到这一点.

该页面中的示例是:

<wma:Sequence>
    <wma:WriteLine Text ='[String.Concat(String.Concat(String.Concat(String.Concat("Add(", CType(op1, Object)), ","), CType(op2, Object)), ") called")]' />
    <wma:Assign x:TypeArguments="xs:Int32" To="[result1]" Value="[op1 + op2]" />
</wma:Sequence>
Run Code Online (Sandbox Code Playgroud)

也就是说,整个事情(包括我从WF示例中删除的大量垃圾)恰恰相当于:

void Add(int op1, int op2, out int result1)
{
    Console.WriteLine("Add(" + op1 + ", " + op2 + ") called");
    result1 = op1 + op2; …
Run Code Online (Sandbox Code Playgroud)

wcf declarative workflow-foundation

6
推荐指数
1
解决办法
592
查看次数

声明性SQLAlchemy中的标签词典?

我正在开发一个已经实现的相当大的代码库,sqlalchemy.ext.declarative我需要在其中一个类中添加类似dict的属性.我需要的是与这个问题相同,但是以声明的方式.在SQLAlchemy中有更多知识的人能给我一个例子吗?提前致谢...

python sqlalchemy declarative

6
推荐指数
1
解决办法
1445
查看次数

实现声明性事务的问题

我想在功能级别实现事务控制.我想要的是这样的.

class MyService {

static transactional = false

@Transactional(readOnly = false,propagation = Propagation.REQUIRES_NEW)

public def saveCountry(){Country co = new Country(name:'mycountry')co.save()createState()

}

@Transactional(readOnly = false,propagation = Propagation.REQUIRES_NEW)

public def createState(){State state = new State(name:'state')state.save()throw new RuntimeException()}}

我想要的是createState()创建一个独立于saveCountry()的新事务,这样如果createState()失败,

已保存的国家/地区对象未被撤销.虽然我已经给出了注释,但它们没有产生预期的效果.此处创建单个事务,并在抛出异常时撤消该事务.保存对象的任何一个.

任何人都可以帮忙

grails transactions declarative

6
推荐指数
1
解决办法
233
查看次数

基于属性的编程有哪些优点?

我正在使用WCF RIA服务,并且遇到了使用属性的示例:

[StringLength(10, ErrorMessage="Too long")]
public string FirstName { get; set; }
...
Run Code Online (Sandbox Code Playgroud)

虽然属性不仅限于WCF RIA,但它让我想起了一个问题:为什么基于声明式或基于属性的编程可以编写验证例程"老式方式"?

谢谢,

斯科特

c# attributes declarative

6
推荐指数
1
解决办法
2863
查看次数

声明性GTK

TL; DR:是否有使用GTK创建声明性UI的库?最好是Python支持.


我是一名Python/Django开发人员,我对用户界面的大部分经验来自网络,其中声明性,松散耦合的UI设计是标准的.最近我不得不使用Java/Swing为学校项目创建一个GUI应用程序,最后使用SwiXML为项目创建声明性Swing布局.

我问自己是否有类似的可能性用于Python.我不是很喜欢Java,所以我不会开始开发Swing应用程序.在寻找Python GUI Toolkits时,我最终得出结论,该领域的三个主要参与者是GTK,QT和Wx.

在这3个我更喜欢GTK,但我找不到任何方法来创建GTK的声明性UI.根据我对HTML和SwiXML的经验,我发现基于代码的UI创建非常混乱,并且不希望这样做.声明性UI更灵活,更松散耦合.

是否有使用GTK创建声明性UI的库?最好是Python支持.

如果没有这样的东西(我假设,因为我找不到任何东西),我可能最终开始使用QT,即使我不喜欢它在Linux下的默认外观.(但也许这也是可定制的,在某种程度上它看起来与GTK类似.)

python gtk user-interface qt declarative

6
推荐指数
1
解决办法
983
查看次数

使用SQLAlchemy从MySQL获取最后插入的值

我遇到了一个相当棘手的问题,经过测试后我发现没有可用的答案就足够了.

我已经看到了各种建议,但似乎没有人能够返回MySQL中auto_increment字段的最后插入值.

我看过一些例子,提到使用session.flush()来添加记录然后检索id.然而,似乎总是返回0.

我也看到过提及session.refresh()使用的例子,但会引发以下错误:InvalidRequestError:无法刷新实例''

我想做的事似乎非常简单,但我似乎无法弄明白这个秘密.

我正在使用声明式方法.

所以,我的代码看起来像这样:

class Foo(Base):
    __tablename__ = 'tblfoo'
    __table_args__ = {'mysql_engine':'InnoDB'}

    ModelID = Column(INTEGER(unsigned=True), default=0, primary_key=True, autoincrement=True)
    ModelName = Column(Unicode(255), nullable=True, index=True)
    ModelMemo = Column(Unicode(255), nullable=True)

f = Foo(ModelName='Bar', ModelMemo='Foo')
session.add(f)
session.flush()
Run Code Online (Sandbox Code Playgroud)

此时,对象f已被推送到DB,并且已自动分配了唯一的主键ID.但是,我似乎无法找到一种方法来获取在一些额外操作中使用的值.我想做以下事情:

my_new_id = f.ModelID

我知道我可以简单地执行另一个查询来根据其他参数查找ModelID,但我不愿意,如果可能的话.

我非常感谢任何有关此问题的解决方案的见解.

我在这里先向您的帮助表示感谢.

python mysql sqlalchemy declarative

6
推荐指数
1
解决办法
4838
查看次数

在Prolog中实现一个简单的C语言?

我是prolog的新手,所以这对我来说是一个很大的挑战.我应该在Prolog中实现一个简单的C语言.

the ultimate goal is to be able to execute something like this:
?- run([begin,a,:=,10,while,a,>,5,begin,write,a,a,:=,a,-,1,end,end]).

and get: 
10 
9
8
7
6 
yes
Run Code Online (Sandbox Code Playgroud)

但是,我陷入了第一步.这是我迄今取得的成就.超出本地堆栈!

statement(Vars,_Vars) --> assign(Vars,_Vars).
statement(Vars,Vars2) --> statement(Vars,Vars1), statement(Vars1,Vars2). 

assign(Vars,_Vars) --> default_assign(Vars,_Vars).
assign(Vars,_Vars) --> simple_assign(Vars,_Vars).

% a //default value 0
default_assign(Vars,_Vars) --> 
    var_name(Var_Name),
    {update_vars([Var_Name,0],Vars,_Vars)}.

% a = 0
simple_assign(Vars,_Vars) --> 
    var_name(Var_Name),[=],var_value(Var_Value),
    {update_vars([Var_Name,Var_Value],Vars,_Vars)}.

% a = b
simple_assign(Vars,_Vars) --> 
    var_name(Var_Name1),[=],var_name(Var_Name2),
    {
    update_vars([Var_Name1,Var_Value],Vars,_Vars)
    }.

var_name(Var_Name) --> [Var_Name],{\+number(Var_Name2)}.    
var_value(Var_Value) -->[Var_Value],{number(Var_Value)}.

% found match, update
update_vars(Var,Vars,_Vars):-
    member(Var,Vars),
    update(Var,Vars,_Vars),
    _Vars\==[].
% no match, …
Run Code Online (Sandbox Code Playgroud)

interpreter declarative prolog dcg

6
推荐指数
1
解决办法
290
查看次数

如何停止递归?

代码的出现第1天需要以一种或那种形式循环一长串括号等((((())(())(((()))((.这个想法是(上升到一层,)下到一层,目标是打印

  1. 字符串中第一个索引,其中楼层编号为负数
  2. 找到字符串结尾时的最后一层.

使用for循环的命令式解决方案很简单(以Python为例):

def main():
    flr = 0
    basement = False
    for idx, elt in enumerate(text):
        flr += {
            "(": 1,
            ")": -1
        }.get(elt)

        if flr < 0 and not basement:
            print("first basement pos:", idx + 1)
            basement = True

    print("final floor:", flr)
Run Code Online (Sandbox Code Playgroud)

递归函数解决方案稍微复杂一点,但仍然不太难.

def worker(flr, txt, idx, basement):
    flr += {"(": 1, ")": -1}[ txt[0] ]

    if not (len(txt) - 1): return flr

    if flr < 0 and not basement:
        print("first …
Run Code Online (Sandbox Code Playgroud)

recursion functional-programming declarative factor-lang

6
推荐指数
1
解决办法
227
查看次数

Jenkins声明性管道:当仅为管道设置代理时,哪个工作空间与阶段关联?

以下是声明性管道的示例,其中代理程序是为管道设置的,但未在各个阶段中设置:

pipeline {
    agent { node { label 'linux' } }
    stages {
        stage('Checkout') {
            steps {
                checkout scm
            }
        }
        stage('Build') {
            steps {
                sh 'make'
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我发现有关脚本化管道的文档清楚地表明,单个工作空间将在单个节点块中使用,但多个节点块可能被分配多个工作空间,因此必须在这些步骤之间存储,使用外部工作空间插件等如果你想确定步骤之间工作区中的内容.

我很难找到有关声明性管道的工作空间保证的文档.这个例子对于工作空间有什么保证?

我相信在测试类似管道的过程中,我遇到了在不同工作空间中执行的两个阶段,但我不确定发生了什么.我真的希望避免在构建步骤之前隐藏我的结帐或使用外部工作区插件,所以我希望有办法强制我的所有阶段在一个工作区/一个节点上运行.

declarative jenkins jenkins-pipeline

6
推荐指数
1
解决办法
3232
查看次数

在Haskell中混合折叠器与OR(懒惰?)

该函数如何返回true?

foldr (||) False [True,undefined] 

=> True
Run Code Online (Sandbox Code Playgroud)

第一个折叠看起来像这样:

undefined || True 
Run Code Online (Sandbox Code Playgroud)

,这应该返回一个错误

因此,我猜测haskell优先考虑OR函数的懒惰,而不是逐步进行折叠.找到一个True在途中并在开始折叠之前返回

它是否正确?在那种情况下,haskell是否总是优先于非惰性函数的惰性函数?我认为这是懒惰的定义,但似乎可以改变错误的答案

evaluation haskell functional-programming declarative lazy-evaluation

6
推荐指数
1
解决办法
108
查看次数