我将使用术语"框模型"通常指的是任何数据模型,用于表示矩形容器的图形布局" (又名"框"),并执行相关的计算(例如,在调整封闭盒的大小时计算各个盒子的位置)。 (Here's这种模型的一个例子。)
我的问题的实质是:
我正在寻找一个"盒子模型的实现"具有以下属性,大致按重要性顺序:
- 它应该保持布局信息的建模之间的清晰分离(例如尺寸,边距,填充,包含关系等),以及在某些特定设备(例如web)中呈现此信息浏览器,PostScript,X11等;);
- 应该忠实地实施一些标准"盒子模型(例如,w3's),或者,除此之外,至少有足够的采用基础成为“事实上的标准”的标题的可靠候选者;
- 最好它应该用Python编写(第二选择:JavaScript;第三选择:其他任何东西!)。
醇>
我意识到,如果有某些东西满足这些标准,它就不太可能孤立。最有可能的是它将成为更大系统的一个组成部分。这没关系。
注意:IMO,本文的其余部分不包含回答上述问题所需的任何信息。 我将此附加内容仅用于那些可能想知道此问题来自哪里的人,然后再回答它。 讨论。请将对评论的任何回复限制在评论部分。在任何情况下,如果与我的估计相反,这个补充内容被认为不适合SO,请告诉我,我将非常乐意将其删除。
这个问题背后的动机的简洁(虽然可能有点不透明)陈述将是这样的:
最小化"认知失调的数量"由我正在实施的图书馆添加。
更详细一点,"认知失调"我指的是每一个新软件引入的软件,它以一种基本相同但不相同的方式对一个成熟的问题域进行建模。"在同一问题域中运行的任何其他现有软件。这种"认知失调"包括既定概念的新术语,或既定术语,新惯例等的新含义。
最小化这种认知失调的显而易见的方法是坚持采用某些预先存在的标准数据模型的术语和惯例的原则。当然,这种策略只有在是这样的标准数据模型时才能成功,然后才与其普遍性成比例。 (根据我的经验,至少,广泛采用的数据模型是相对罕见的,这就是为什么我的目标只是"最小化"而不是完全"避免",由...引起的认知失调我正在制作的图书馆。)
更具体地说,我正在开发一个小型内部库,以解决 抽象编码和使用 布局信息进行计算的问题。
这个库仍然非常简单,但我已经发现自己必须在命名,约定和整体结构方面做出大量任意选择。例如,在Python中:
# EXAMPLE 1
from __future__ import division
class Box(object):
def __init__(self, width, height):
self.width = width
self.height = height
def make_box(width, height, aspect_ratio=None):
if aspect_ratio is not None:
w = height * aspect_ratio
if w < width:
width = w
else:
height = width / aspect_ratio
return Box(width, height)
此函数在具有指定宽度和高度的周围框中创建适合的最大Box
对象,如果指定,将具有宽高比aspect_ratio
。
(注意:本文中的所有代码仅用于说明,而不是生产级代码的示例。因此:没有错误检查,没有性能优化,没有处理舍入错误等等。)
有一点需要注意的是,即使在这个小玩具的例子中,我已经介绍了几个可能符合或不符合标准做法的条款和惯例,包括:
width/height
(与比率height/width
相对); Box(50, 100)
; aspect_ratio
以及width
和height
的指定组合不同意的情况的政策(即:将width
和height
解释为 maximal ,而不是例如 minimal ,允许的值)。可以说,问题不仅限于术语,也不限于简单的约定,例如参数的默认排序,而是扩展到设计决策同样是约定的问题,即使它们具有更广泛的范围。
为了说明这一点,假设使用Padding
类增强模型,并更改make_box
函数,以便不返回可能小于指定大小的Box
对象根据{{1}}和width
参数,它始终返回具有这些维度的height
,但也包含编码指定Box
之间任何差异的padding
属性,以及指定的aspect_ratio
和width
。此外,当存在这种差异时,在盒子的两侧之间均等地分开左侧空间(即,使得到的填充对称)。 (有关此说明的代码再现,请参阅下面的height
。)
这个小小的增强本身引入了另一堆术语和约定,但我想关注的事实是这个小的增强已经指向模型的细化,包括一个额外类型的对象(&#34 ; padding&#34;),以及它与这种新类型的对象和预先存在的对象(特别是&#34; box&#34;)之间的特定(尽管很大程度上是任意的)关系。换句话说,这个小增强实际上暗示模型的扩展,影响库的其余部分,全局。我希望我的图书馆符合这样的&#34;全球&#34;结构约定,而不仅仅是较小范围的约定,例如默认排序等。
当然,其中一些设计决定恰好与任何可能被认为是标准的&#34;完全一致或足够接近。此外,每个偏离该标准的人都只会对其潜在用户造成很小的认知负担。毕竟,如果不是&#34;框&#34;标准术语,例如,&#34;框架&#34;,对那些阅读我的图书馆(最终)文档以精神上替代&#34;框架&#34;的人来说,这不会太费力。每提一次&#34; box&#34;。然而,在聚合中,特别是在一个&#34;认知世界中。已经包含许多其他类似的库(并且典型的程序员必须使用),每个库都添加了自己与惯例的微小偏差,效果确实变得很麻烦。这些转变的惯例妨碍了对新软件的学习,其中一个特别明显的表现形式是错误,其中一些可能很难被发现。
正如我已经说过的那样,希望能消除所有这种认知失调是不现实的。首先,没有标准。最好的人可能希望混淆最少数量的用户,但即使这样,这个数字仍然很大。此外,有些情况下,有意识地采用某些非标准惯例或术语的长期的好处(与程序员的短期便利相反)确实合理地证明了额外的认知因此,我怀疑这种情况非常罕见。
EXAMPLE 2
答案 0 :(得分:1)
也许我没有花足够的时间仔细阅读你的帖子,但我仍然不确定我是否正确地确定了这个问题?
但是根据我的理解,我想你可能想看看Sencha如何为ExtJS库设计他们的布局系统。
他们的想法非常简单,但却导致了一个非常易于使用,功能强大且灵活的布局系统。
基本上,每个container都可以与layout manager结合使用,Layouts and Containers guide负责渲染子组件。
您可以查看他们的Ext.Component。
此外,您将对他们{{3}}课程感兴趣,该课程基本上是您尝试实施的Box
课程。