真的很遗憾,在.Net中没有数字的多态性,即没有统一不同类型的数字类型的数字接口,如bool,byte,uint,int等.在极端情况下,我们想要一个完整的抽象包代数类型.
Joe Duffy有一篇关于这个问题的文章:
http://www.bluebytesoftware.com/blog/CommentView,guid,14b37ade-3110-4596-9d6e-bacdcd75baa8.aspx
您如何在C#中表达这一点,以便在不影响.Net或C#的情况下对其进行改造?
我有一个想法,首先要定义一个或多个抽象类型(接口,如INumeric - 或者比它更抽象),然后定义实现这些的结构并包装类型如int,同时提供返回新类型的操作(例如Integer32: INumeric;其中添加将被定义为
public Integer32 Add(Integer32 other)
{
return Return(Value + other.Value);
}
Run Code Online (Sandbox Code Playgroud)
我有点害怕这段代码的执行速度,但至少它是抽象的.
没有运营商超载良好......
还有其他想法吗?
.Net看起来不像一个可行的长期平台,如果它不能拥有我认为的这种抽象 - 并且效率很高.
抽象是重用.
更新:
到目前为止,这是一个示例实现类型签名:
public struct Integer32 : INumeric<Integer32, Int32>, IOrder<Integer32, Int32>
Run Code Online (Sandbox Code Playgroud)
补偿缺乏协变返回类型.
是否可以采用像NHibernate或Entity Framework这样的O/RM,并以一种可以在遇到O/RM无法处理的情况时替换它的方式对其进行抽象.
使用大块服务方法创建服务似乎很诱人,其中创建会话,会话用于获取/ upsert实体,然后用于保存所有脏对象.
我会考虑存储库模式,以便服务操作向存储库请求实体,并且O/RM会话嵌入在存储库中.但是你如何保存相关实体,并且Update(T实体)方法会立即刷新更改.它似乎很简单,而且通常不令人满意.
我现在倾向于使用单个O/RM包装器类,它使用诸如"StartSession","EndSession","AbandonSession","GetById(object id)"等通用方法公开接口.
至少这将允许OR/M在测试中伪造,这是我的另一个大问题.
我想我是说我不想密切交织业务逻辑和O/RM数据访问代码,因为切换到另一个O/RM可能会导致大部分代码被替换.
人们在现实世界中做了什么?
问候,
这是一个具有挑衅性的问题,旨在公开讨论如何在开发者社区中看到抽象反转.我很想知道你的想法.
首先,这里引用维基百科给出的抽象反转例子:http: //en.wikipedia.org/wiki/Abstraction_inversion
在诸如Java和C++之类的面向对象语言中创建表示函数的对象是很麻烦的,其中函数不是第一类对象.在C++中,可以通过重载()运算符来使对象"可调用",但是仍然经常需要实现一个新类,例如STL中的Functors.
对我来说,函数是Scala中的一等公民,但是当我们使用Scala生成Java字节码时,Scala会在Java上创建特定的类'以使函数式编程成为可能...... 我们可以将其视为抽象反转吗?
同样可以应用于Clojure或JVM的任何功能语言......甚至是Apache Collections,例如:
http://commons.apache.org/collections/apidocs/org/apache/commons/collections/Closure.html
顺便说一句,我不相信维基百科文章的客观性.例如,当谈到微内核中可能的抽象反转时,文章说"一个观点主体认为微内核设计是一个抽象反转",但在OOP中没有这样的函数类型声明.
oop abstraction programming-languages functional-programming scala
我已经使用StructureMap超过一年了.而且这段时间我曾经有一个名为IoC的包装类,看起来像这样
class IoC {
public static T GetInstance<T>()
{
return (T)GetInstance(typeof(T));
}
public static IEnumerable<T> GetAllInstances<T>()
{
return ObjectFactory.GetAllInstances<T>();
}
public static IEnumerable GetAllInstances(Type type)
{
return ObjectFactory.GetAllInstances(type);
}
public static object GetInstance(Type type)
{
return ObjectFactory.GetInstance(type);
}
public static void Inject<T>(T obj)
{
ObjectFactory.Inject(obj);
}
}
Run Code Online (Sandbox Code Playgroud)
我添加了包装器,假设我可能想在某个时候更改IoC容器.此时我觉得这很糟糕.一个原因是:我不能在我的代码中使用ObjectFactory做其他有趣的事情,我必须使用这个包装器.另一件事是:我们的代码不应该真正独立于DependencyInjection容器.
使用这种方法的优点/缺点是什么?
structuremap abstraction dependency-injection ioc-container wrapper
我正在开发一个MVC应用程序框架,我已经就我应该构建模型层的方式提出了一些建议.
构建模型,以便将每个模型映射到数据库中用于该应用程序的表,因此典型的应用程序将具有该表
并将每个映射到名为PHP的文件,如 app/models/configuration.php
现在我遇到的问题是创建父数据库类以便能够处理特定的表数据,例如:
class PDOModel
{
public function __construct()
{
$this->__Communicator = Registry::getPDOInstance();
}
public function getSingle($id)
{
return /*Row*/;
}
/*Etc*/
}
Run Code Online (Sandbox Code Playgroud)
然后是应用程序模型的类似内容
class Model_Topic extends PDOModel
{
protected $__id_column = 'id';
}
Run Code Online (Sandbox Code Playgroud)
然后在我的控制器中我可以像这样使用:
$Topic = $this->model->topic->get(22);
Run Code Online (Sandbox Code Playgroud)
但我也想考虑自动连接表,是否有任何简单的轻量级库已经过测试并符合我的要求.
任何帮助将受到高度赞赏.
我只是有一个问题.如何在没有lambda的情况下使用抽象函数?
说我有两个清单
a = [1,2,3,4,5]
b = [2,4,6]
Run Code Online (Sandbox Code Playgroud)
如果我要打印所有元素都出现在A和B中,
与lambda:
def f():
print reduce (list.__add__ , map (lambda x: filter (lambda y: x == y, b), a))
Run Code Online (Sandbox Code Playgroud)
怎么做没有lambda?
我的意思是我只是使用辅助函数而不是lambda
在阅读抽象时,我遇到了以下声明
"抽象仅捕获与当前视角相关的对象的细节"
例如.从驾驶员的角度来看,Car class会是
public class Car
{
void start();
void applybrakes();
void changegear();
void stop();
}
Run Code Online (Sandbox Code Playgroud)
从机械师的角度来看,Car class会是
public class Car
{
void changeOil();
void adjustBrakes();
}
Run Code Online (Sandbox Code Playgroud)
我的问题,在设计系统时,我们是为一个用户视角(驱动程序还是机制)设计的,还是我们可以设计多个用户视角并根据用户类型进一步抽象出来?
希望我的问题很明确.
谢谢
在软件工程中,设计阶段有两个主要概念abstraction,decomposition但我无法得到它们之间的差异?
我知道开闭原则意味着对扩展开放,对修改封闭。考虑如下示例
public class Vehicle{
public void service(){
//vehicle servicing code
}
}
public class Bike extends Vehicle{
public void service(){
// bike specific servicing
}
}
Run Code Online (Sandbox Code Playgroud)
现在我明白Bike该类Vehicle使用开放封闭原则扩展并添加了新功能。
考虑我创建Vehicle类的jar 文件,然后类从 jarBike扩展Vehicle类。在这种情况下,我们不能修改Vehicle类并Bike扩展它。这是开闭原则的一个很好的例子吗?我想知道 OCP 与继承有何不同
polymorphism inheritance abstraction open-closed-principle solid-principles
我想定义一个特定的仿函数如下:
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE FlexibleInstances #-}
data ValOrError a b = Val a | Error b
class MF c a b where
mcons :: a -> c -> c
merr :: b -> c
mhead :: c -> ValOrError a b
mtail :: c -> ValOrError c b
Run Code Online (Sandbox Code Playgroud)
我希望我的类型MF上的类型类型c具有类型参数a和b.我试着在这样的数据结构上定义一个过滤函数,如下所示:
mfilter f e =
let h = mhead e in
let t = mtail e in
case h of
Error …Run Code Online (Sandbox Code Playgroud) abstraction ×10
oop ×2
.net ×1
c# ×1
haskell ×1
inheritance ×1
interface ×1
model ×1
modeling ×1
nhibernate ×1
numeric ×1
pdo ×1
performance ×1
php ×1
polymorphism ×1
python ×1
scala ×1
structuremap ×1
testing ×1
typeclass ×1
uml ×1
wrapper ×1