标签: abstraction

在OpenGL中创建环境堆栈

我想在OpenGL中创建一个与矩阵堆栈类似的环境设置(混合,模板,深度等)的抽象.推入堆栈,进行所需的任何更改,绘制对象,然后弹出堆栈并返回先前的设置.

例如,目前你可能有这样的绘图代码:

glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glDisable(GL_DEPTH_TEST);
//Draw operations
glEnable(GL_DEPTH_TEST);
glDisable(GL_BLEND); 
Run Code Online (Sandbox Code Playgroud)

但是对于环境堆栈,它看起来像这样:

glPushEnv();
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glDisable(GL_DEPTH_TEST);
//Draw operations
glPopEnv(); 
Run Code Online (Sandbox Code Playgroud)

我认为只有两种方法可以做到这一点:

  1. 创建我自己的每个环境设置功能的'味道'并调用它.它将依次更新当前的EnvStack数据结构并调用OpenGL环境函数.
  2. 改变OpenGL环境函数指向我的环境函数,它将再次更新当前的EnvStack数据结构并调用原始的OpenGL环境函数.

所以选项1显然要简单得多.但是如果我使用其他人的代码,我会遇到一个问题,因为我不一定知道它对环境做了什么改变,因此我的数据结构会不同步.而且由于重点是确保环境设置正确的简单方法,这并不酷.

所以我的问题是,在这个上下文中,我如何更改OpenGL环境功能指向的功能?

c c++ opengl abstraction

2
推荐指数
1
解决办法
468
查看次数

卡布奇诺(目标-j)/阿特拉斯是如何将相对和绝对定位排除在外?

我最近一直在查看卡布奇诺和阿特拉斯,他们似乎已经将相对和绝对的定位抽象为"有效"的东西.我想知道那些熟悉这个项目的人 - 他们是怎么做到的?

我一直认为相对和绝对定位是一种思考定位元素的模糊方式,所以我对此非常好奇.

我可以查看的任何帮助或资源都很棒!

abstraction cappuccino positioning atlas

2
推荐指数
1
解决办法
292
查看次数

NSArray的实施

如何实施NSArray,它是否类似于std::vector.

abstraction objective-c nsarray

2
推荐指数
1
解决办法
1909
查看次数

是否可以使用JDBC作为RDBMS的抽象层?

JDBC提供了一个API,可用于连接到不同的RDBMS或类似的数据存储.但数据存储区的实现方式不同(例如SQL方言).

是否可以以这种方式使用JDBC,我的查询和语句适用于大多数常见的RDBMS(例如:Oracle,PostgreSQL,SQL Server,MySQL)?

这个问题在两个方面对我很有意思:*常见SQL(INSERT,UPDATE,SELECT等)*访问元数据(获取有关表和列的信息)

我目前正在尝试使用自编写的持久性框架,并希望在其下插入JDBC数据存储区.因此,如果我编写JDBC数据存储区适配器,那么它将很好,如果它可以在大多数常见的RDBMS上工作.

提前致谢

java sql abstraction jdbc relational-database

2
推荐指数
1
解决办法
640
查看次数

CSS Helper类的使用

我今天尝试使用“帮助类样式”编写CSS,Twitter上的许多开发人员表示这是一种不良做法。

这是一个例子:

<span class="et-margin-top-30 et-width-400 et-display-inline">
    <p class="et-common-frame-shadow et-inner-img-shadow">
        <img class="et-common-frame-img" src="img3.jpg"/>
    </p>
    <h3 class="et-margin-top-10 et-fontsize-26 et-fontweight-bold">foo</h3> 
    <p class="et-margin-top-10">bar</p>
</span>
Run Code Online (Sandbox Code Playgroud)

为什么这是一个不好的做法?谁能告诉?我们什么时候应该使用.clear之类的帮助器类?

css abstraction helper

2
推荐指数
1
解决办法
1030
查看次数

定义正确的构造函数注入和ISP(SOLID)的抽象

假设我想出于不同的原因抽象集合上的操作:

现在为了简单起见,让我们推荐一个集合

class Book {
  public string Title { get; set; };
  public string SubTitle { get; set; }
  public bool IsSold { get; set; }
  public DateTime SoldDate { get; set; }
  public int Volums { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我有一个类型只需要搜索Book::Title(区分大小写),所以我可以定义我的抽象:

interface ITitleSearcher {
  bool ContainsTitle(string title);
}
Run Code Online (Sandbox Code Playgroud)

然后实施

class CaseSensitiveTitleSearcher : ITitleSearcher { ... }
class NoCaseSensitiveTitleSearcher : ITitleSearcher { ... }
Run Code Online (Sandbox Code Playgroud)

并将其消费为

class TitleSearcherConsumer  {
  public TitleSearcherConsumer(ITitleSearcher searcher) { // <- ctor injection
  }
} …
Run Code Online (Sandbox Code Playgroud)

c# abstraction design-patterns dependency-injection

2
推荐指数
1
解决办法
219
查看次数

IList in interface,List in implementation

在我的接口中,通常有一个IList<ISomeType>代表List类型的成员,并且说我期望一个支持Add方法的实现.

但是在接口实现中,有一个

IList<ISomeType> = new List<ISomeType>()
Run Code Online (Sandbox Code Playgroud)

例如,每当我使用List时,我都必须进行转换

(this.MyList as List<IMyType>).AddRange(someType.ToList());
Run Code Online (Sandbox Code Playgroud)

有一个更好的方法吗?如何避免这种演员?

- 编辑以询问更多信息 -

而不是扩展方法,是否有一个小的linq表达式来解决这个问题?

IList<string> list = new List<string>();
var items = new[] { "1", "2", "3" };
items.ToList().ForEach(x => list.Add(x));
Run Code Online (Sandbox Code Playgroud)

但这看起来并不是很直接,因为它颠覆了正在做的事情.(操作在要添加的项目上,而不在列表中).

有什么比这更好的?可以在列表上做些什么?

c# abstraction interface list

2
推荐指数
1
解决办法
257
查看次数

使用集合作为函数

FP课程:

type Set = Int => Boolean  // Predicate

  /**
   * Indicates whether a set contains a given element.
   */
  def contains(s: Set, elem: Int): Boolean = s(elem)
Run Code Online (Sandbox Code Playgroud)

为什么这才有意义?

assert(contains(x => true, 100))
Run Code Online (Sandbox Code Playgroud)

基本上它所做的是为100函数提供值x => true.即,我们提供100,它返回true.

但这与集合有何关系?

无论我们放什么,它都会回归true.感觉在哪里?

据我所知,我们可以提供我们自己的一套执行/功能,因为这将代表提供的值是一组内部(或没有)的事实一个参数-那么(只)本实施使得contains由某种意义上/意/逻辑来填充函数/功能.

但到目前为止,它看起来像一个无意义的功能.它被命名,contains但名称不代表逻辑.我们可以调用它,apply()因为它的作用是将一个函数(第一个参数)应用于一个值(第二个参数).只有名称contains可以告诉读者作者可能想说什么.可能不是太抽象吗?

abstraction functional-programming scala higher-order-functions

2
推荐指数
1
解决办法
846
查看次数

如何使用自定义多态类型的集合获得多态行为?

我有一个超类,Super有一个子类SubA

public class Super{}

public class SubA : Super{}
Run Code Online (Sandbox Code Playgroud)

我想要一个接口来定义对Super.

public interface IDoer
{
    List<Super> GetObjects();
    void SaveObjects(List<Super> items);
}
Run Code Online (Sandbox Code Playgroud)

所以基本上,我希望能够多态地传递 的集合Supers,但List<SubA>不是List<Super>. 所以我的 subADoer 没有实现 IDoer。

public class SubADoer : IDoer
{
    public List<SubA> GetObjects{ return new SubA()}
    public void SaveObjects(List<SubA> items){//save}
}
Run Code Online (Sandbox Code Playgroud)

我如何抽象对象的列表(或其他一些集合类型)来反映构成它们的类型之间的关系?

c# collections polymorphism abstraction

2
推荐指数
1
解决办法
58
查看次数

Result&lt;(), Box&lt;(dyn SomeTrait + 'static)&gt;&gt; 不满足 Trait Bound

use once_cell::sync::OnceCell;

pub trait SomeTrait {}
pub struct Impl1 {}

impl SomeTrait for Impl1 {}

pub static GLOBAL_THING: OnceCell<Box<dyn SomeTrait>> = OnceCell::new();

pub fn main() {
    GLOBAL_THING.set(Box::new(Impl1 {})).unwrap();
}
Run Code Online (Sandbox Code Playgroud)

我收到此错误,但不知道如何解释它的含义或修复它。

error[E0599]: the method `unwrap` exists for enum `Result<(), Box<(dyn SomeTrait + 'static)>>`, but its trait bounds were not satisfied
   --> src/main.rs:11:42
    |
11  |       GLOBAL_THING.set(Box::new(Impl1 {})).unwrap();
    |                                            ^^^^^^ method cannot be called on `Result<(), Box<(dyn SomeTrait + 'static)>>` due to unsatisfied trait bounds
    |
    = note: the following trait bounds …
Run Code Online (Sandbox Code Playgroud)

abstraction traits dynamic-dispatch rust

2
推荐指数
1
解决办法
1212
查看次数