名可名,非常名--谈接口和实现

名可名,非常名--谈接口和实现

黄国强 2009-9-22

      “名可名,非常名”出自《老子》第一章,解释有多种,我找了一个请见[1]。在这里我借这段话来引出接口和实现的话题。
      平时我非常喜欢举的例子是桌子。比如,我们把桌子设计成一个类。

      问题很快出现了,我们应该给这个桌子增加什么成员函数呢?加上有几条腿的查询函数?加上是什么颜色的查询函数?感觉正好应了“名可名,非常名”这句话。我们根本无法用类来表达我们生活中这样一个常见的概念。
      这个问题产生的原因是什么呢?
      我认为,问题出在我们只从一个角度看这个问题。这里需要的是两个角度即,一个是使用者的角度(即,名可名),一个是实现者的角度(即,非常名)。有两个用 户,一个需要书桌(desk),一个需要餐桌(table)。从这两个使用者的角度可以获得两个接口类IDesk和ITable,从实现者的角度可以得到 具体类CTableImplement。CTableImplement 从二者继承。代码如下。

//负责表示书桌
class IDesk
{
    ...
};

//负责表示餐桌
class ITable
{
    ...
};

class CTableImplement
    : public IDesk
    , public ITable
{
    ...
};

      任何接口类的设计都是不能孤立进行的,一定要放在一个具体环境中。桌子这个例子同样如此。观察一个使用者如何使用者张桌子(比如用来当饭桌),从这个角度 我们很容易的给ITable定义出成员函数。一张桌子到底被别人怎么用,桌子本身是无法知道的。所以具体类 CTableImplement 的设计无需从使用者的角度来考察。仅仅需要按照设计者的常识设计桌子即可,无需关注使用者。设计完成后,再去实现从IDesk和ITable继承的虚函数。这点与接口设计存在非常明显的不同。

### 解决 `scroll-view` 中 `scroll-into-view` 属性失效的方法 对于微信小程序中的 `scroll-view` 组件,当遇到 `scroll-into-view` 属性无法正常工作的情况时,有几种常见原因对应的解决方案。 #### 1. 动态赋值与属性配置 确保 `scroll-into-view` 的值被正确设置为目标元素的 ID,并且此 ID 是唯一的。此外,为了使 `scroll-into-view` 正常运作,必须同时开启 `scroll-y` 或者 `scroll-x` 属性并将其设为 `true`。另外,建议启用平滑滚动动画通过设定 `scroll-with-animation="true"` 来提升用户体验[^1]。 ```html <scroll-view class="container" scroll-y="true" scroll-with-animation="true" scroll-into-view="{{targetId}}"> </scroll-view> ``` #### 2. 设置具体的尺寸单位 如果容器高度或宽度采用百分比形式定义,则可能导致 `scroll-into-view` 行为异常。应改为使用固定像素(px)作为度量单位来指定这些样式属性,从而避免因计算误差引发的问题。 #### 3. 关闭节流机制 在某些情况下,快速连续触发事件可能会因为默认开启了节流(throttle),而影响到精确位置调整的效果。可以通过显式声明 `throttle=false` 参数的方式禁用这一特性,进而改善响应速度准确性[^2]。 ```html <scroll-view scroll-x="true" bindscroll="handleScrollEvent" throttle="false"> </scroll-view> ``` #### 4. 数据绑定延迟处理 有时页面渲染完成前就尝试执行滚动操作也会造成失败现象。因此可以在视图更新之后再发起请求,比如利用 Vue.js 提供的 `$nextTick()` 方法或其他框架类似的钩子函数,在 DOM 更新完毕后再调用相关逻辑[^3]。 ```javascript this.$nextTick(() => { this.targetId = 'some-element-id'; }); ``` 以上措施能够有效应对大多数场景下的 `scroll-into-view` 不生效问题。当然实际应用过程中还需结合具体情况做适当调试优化。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

acloud_csu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值