我已经处理过许多需要持久保存数据的.NET项目,并且通常最终使用了Repository模式.有没有人知道在不牺牲代码库可扩展性的情况下删除尽可能多的样板代码的好策略?
因为很多存储库代码都是锅炉板并且需要重复,所以我通常会创建一个基类来覆盖基本知识,例如异常处理,日志记录和事务支持以及一些基本的CRUD方法:
public abstract class BaseRepository<T> where T : IEntity
{
protected void ExecuteQuery(Action query)
{
//Do Transaction Support / Error Handling / Logging
query();
}
//CRUD Methods:
public virtual T GetByID(int id){}
public virtual IEnumerable<T> GetAll(int id){}
public virtual void Add (T Entity){}
public virtual void Update(T Entity){}
public virtual void Delete(T Entity){}
}
Run Code Online (Sandbox Code Playgroud)
因此,当我有一个简单的域时,这很有效,我可以为每个实体快速创建一个DRY存储库类.但是,当域变得更复杂时,这会开始崩溃.假设引入了一个不允许更新的新实体.我可以拆分基类并将Update方法移动到另一个类中:
public abstract class BaseRepositorySimple<T> where T : IEntity
{
protected void ExecuteQuery(Action query);
public virtual T GetByID(int id){}
public virtual …Run Code Online (Sandbox Code Playgroud) 当我有类似的功能
f :: (Ord a) => a -> a -> Bool
f a b = a > b
Run Code Online (Sandbox Code Playgroud)
我想用make函数包装这个函数.
例如,使这样的功能
g :: (Ord a) => a -> a -> Bool
g a b = not $ f a b
Run Code Online (Sandbox Code Playgroud)
我可以像组合一样组合
n f = (\a -> \b -> not $ f a b)
Run Code Online (Sandbox Code Playgroud)
但我不知道怎么做.
*Main> let n f = (\a -> \b -> not $ f a b)
n :: (t -> t1 -> Bool) -> t -> t1 -> Bool …Run Code Online (Sandbox Code Playgroud) 在C#的最新版本,我可以这样做这个?
我觉得linq是最接近的,但那是链接,而不是功能组合,对吧?
在我的项目中,我必须使用画布在另一个相同尺寸和图案图像上实现一个不同的彩色图像,并且图像不是圆形或矩形形状.所有这些都是波浪形状,它将应用于单个主背景图像,以在每个onclick功能上显示多个图形.
重叠图像应更改为另一种选定颜色.我的问题是否有任何使用画布的方法我们可以改变画布绘制的图像颜色,或者我们需要总是使用不同的图像并应用CSS/jQuery.
我读到了关于画布图像遮罩和重叠的内容.但不能理解我的图像,因为它不是方形或圆形,那么首先是我如何在单个图像上绘制多个波形.我不知道我搜索但没有找到完美的解决方案.
我需要的是在画布上绘制一个波形图像并从点击功能中更改其颜色,并设置另一个带背景图像的div,还有两个画布将重叠.这可能吗?
(这意味着:此功能用于在汽车上创建或设置多个图形,因为每个图形图像需要在画布中设置,而另一个图形需要在div和第一个画布上重叠)
我正在阅读关于Haskell的本教程.他们将功能组成定义如下:
(.) :: (b->c) -> (a->b) -> (a->c)
f . g = \ x -> f (g x)
Run Code Online (Sandbox Code Playgroud)
我没有提供任何例子,我相信这会让我了解这里定义的内容.
有人能提供一个关于如何使用函数组合的简单示例(有解释)吗?
我正在完成一个关于设计模式的课程,虽然在审阅这些笔记时遇到了我在学期期间遗漏的东西:复合与构图.我设法理解的是复合是指一个对象实际上封装了整个对象,而复合是指它只保存指向它们的指针.
在使用Swing创建应用程序时,我看到人们会做两件事之一来创建JFrame.哪种方法更好,为什么?
我是Java和编程的初学者.我唯一的学习来源是书籍,YouTube和Stack Overflow.
import {imports};
public class GuiApp1 {
public static void main(String[] args) {
new GuiApp1();
}
public GuiApp1() {
JFrame guiFrame = new JFrame();
guiFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
guiFrame.setTitle("Example GUI");
guiFrame.setSize(300,250);
................
}
Run Code Online (Sandbox Code Playgroud)
和
import {imports};
public class GuiApp1 extends JFrame {
public Execute() {
getContentPane().setBackground(Color.WHITE);
getContentPane().setLayout(null);
setSize(800, 600);
.............
}
public static void main(String[] args) {
Execute frame1 = new Execute();
frame1.setVisible(true);
}
}
Run Code Online (Sandbox Code Playgroud) 在设计我的对象时,我发现从可测试性的角度来看,组合是更好的选择.原因是,如果需要的话,我可以在运行单元测试时模拟部分组合结构.如果我有一个继承层次结构,这是不可能的.
我想知道其他人是否也发现这是喜欢作曲的理由.还有什么其他可测试性陷阱,因为使用了继承?
组成和继承.
我知道它们都是适当选择的工具,上下文在组合和继承之间进行选择时非常重要.然而,关于每个的适当背景的讨论通常有点模糊; 这让我开始考虑传统OOP的独特方面是多么明显的继承和多态.
多态性允许人们同等地指定"is-a"关系以及继承.特别是,从基类继承隐式地创建该类与其子类之间的多态关系.然而,尽管可以使用纯接口实现多态,但是继承通过同时传输实现细节使多态关系复杂化.通过这种方式,继承与纯多态性完全不同.
作为一种工具,继承通过简化在无关紧要的情况下重用实现,为程序员提供与多态(通过纯接口)不同的方式.但是,在大多数情况下,超类的实现细节与子类的要求略有冲突.这就是为什么我们有"覆盖"和"成员隐藏"的原因.在这些情况下,继承所提供的实现重用是通过在级联级别的代码中验证状态更改和执行路径的额外工作来购买的:子类的完整"扁平化"实现细节分布在多个类之间,这通常意味着多个文件,其中只有部分适用于相关的子类.在处理继承时,查看该层次结构是绝对必要的,因为如果不查看超类的代码,就无法知道哪些未覆盖的细节会对您的状态进行整理或转移您的执行.
相比之下,独占使用组合可以保证您可以看到哪些状态可以通过显式实例化对象进行修改,这些对象的方法可以自行调用.真正扁平化的实现仍然没有实现(实际上甚至不可取,因为结构化编程的好处是实现细节的封装和抽象)但是你仍然可以重用代码,你只需要在一个地方查看当代码行为不端时.
我的目标是在实践中测试这些想法,避免传统继承为基于纯接口的多态性和对象组合的组合,我想知道,
有什么对象组成和接口无法实现继承吗?
编辑
在迄今为止的回复中,ewernli认为一种技术没有技术专长,而另一种技术则没有; 后来他提到了每种技术固有的不同模式和设计方法.这是有道理的.但是,这个建议让我通过询问是否专用组合和界面代替传统继承来禁止使用任何主要设计模式来改进我的问题?如果是这样,在我的情况下是不是有相同的模式?
我很困惑Delphi 2009/2010对Windows中Aero Theme Glass功能的支持,以及DoubleBuffered的含义,以及与Aero glass有什么关系.我发现DoubleBuffered不仅是VCL中的一个属性,它也可以在.net WinForms中找到.最初我想知道它是否设置了公共控件库使用的某种窗口样式位,或者是什么.它为什么使用,何时使用?
[更新:我应该说我知道什么是"双缓冲",作为减少闪烁的一般技术,我想知道的是,为什么它与在Windows Vista中的Aero Glass窗格上渲染控件有任何关系? Windows 7,特别是为什么所有东西的按钮需要双缓冲设置为真,才能在玻璃上工作?下面链接的博客文章似乎最有用.]
特别是,我对DoubleBuffered属性感到困惑,我想知道它为什么存在,以及它在窗体和控件中的玻璃支持和双缓冲属性之间的关系是什么.当您阅读像这样的C++文章时,您会发现没有提到双缓冲.
[更新2:以下内容包含一些事实错误,并已修改:]
我发现一些C++开发人员正在讨论他们如何调用SetLayeredWindowAttributes以避免DWM/Aero合成导致的"黑色变成玻璃"故障,当你在经典的Win32应用程序中打开它时[但是下面的博客链接告诉我这不再起作用在Windows 7中,实际上只在Vista中短暂工作,直到微软阻止它].[开始错误的想法]我们不应该使用其他颜色,如明亮的洋红色,并使其变成玻璃透明色?[结束错误的想法]
什么时候应该设置和不设置DoubleBuffered的规则,以及为什么DoubleBuffered首先添加到VCL?设置什么时候会引起问题?(看来远程桌面是一种情况,但这是唯一的情况吗?)当它没有设置时,我们会搞清楚按钮文本的渲染,很可能是因为看起来Delphi没有改变默认的"渲染黑色如玻璃"在Aero DWM中.
在我看来,Aero Glass渲染基本上是以奇怪或难以理解的方式进行的[由Windows本身,而不是仅仅包含此功能的Delphi],以及2009/2010年的许多内部VCL源代码StdCtrls中的类必须做很多复杂的逻辑才能正确地在Aero Glass上呈现内容,但它仍然存在很多问题,并且看起来像是错误的,并且这可能是这个相关问题和qc问题的背后. [更新3:玻璃上的很多渲染故障,在VCL中在常见控件中渲染错误,看起来,微软并不关心修复.简而言之,Delphi VCL代码修复无法解决这样一个事实:古老的Windows通用控件库和现代[但奇特的] Aero Glass合成功能彼此不太相似,并且不能特别合作.感谢微软建立如此高质量的技术,并将其释放到世界各地.
如果它还不够有趣; 为什么我们有ParentDoubleBuffered?
[7月30日更新:这个问题对我很有意思,因为我认为它表明,当你拥有一个庞大的现有VCL框架时,使用Windows API解决这个问题是一个很难的问题.
composition ×10
inheritance ×4
haskell ×3
.net ×2
c# ×2
function ×2
oop ×2
aero ×1
canvas ×1
composite ×1
delphi ×1
dwm ×1
html5-canvas ×1
java ×1
javascript ×1
polymorphism ×1
swing ×1
testability ×1