Laravel 关联模型由于名称一致性导致的问题

1. 定义关联模型

在Laravel里面,我们可以通过定义以下Model来完成关联查询。

class MyPost extends Eloquent {
    public function myPostInfo () {
        return $this->hasOne('MyPostInfo');
    }
}

class MyPostInfo extends Eloquent {}

好代码、坏代码之一

2. 使用关联模型

这里myPostInfo()用的是Camel命名规则,但是我们在读取某一个PostInfo的时候可以用Snake规则。如下面代码都是可行的:

$post = MyPost::find(1);
$post_info = $post->myPostInfo; // example 1
$post_info = $post->my_post_info; // example 2

Laravel允许上述两种方法,但是没有合理的处理使用两种命名造成的冲突。

1.命名很重要,让代码告诉你它自己

澳门新葡亰娱乐在线,命名到底有多重要呢?

重要到这几乎是很多软件项目成功或者失败的“罪魁祸首”,究其原因,代码不光支撑了0和1在计算机系统中运行的业务逻辑,同时也是开发者进行交流与研究的标准语言。没有意义或者有歧义的命名,就像两个等待交流的人,面对了一堆火星文无从下口,让交流变成灾难,也就导致很多问题。

同时,好的命名是自说明的,让代码告诉开发者“我是谁,我做什么,我怎么做”。当然,除了静态式的必要的注释说明之外,动态式的代码也可以包含传递信息的作用,让代码告诉你它自己,因为代码是“活的代码”。

例如,以某个缓存容器为例,泛型参数明确了容器的Key和Value的关系,其中的方法也基本明确了作为缓存容器所具有的方法:Add、Set、Clear、Refresh和IsExist,而TryGetValue是Try-Parse模式的应用体现。其中的变量container表示了容器载体;expiration表示了过期时间;config表示了容器的配置信息。

public class AtCache<TKey, TValue>

{

    public int Count{ }

    public List<TValue> Items{ }

    public int Expiration {
}

 

    public void Add(TKey key, TValue value){ }

    public void Set(TKey key, TValue value, int expiry){}

    public bool TryGetValue(TKey key, out TValue value){}

    public void Clear(){
}

    public bool IsExist(TKey key){ }

    protected void Refresh(){
}

 

    private ReaderWriterLockSlim rwLocker = new ReaderWriterLockSlim();

    private Dictionary<TKey, CacheItem<TKey, TValue>> container = new Dictionary<TKey, CacheItem<TKey, TValue>>();

    private int expiration;

    private DateTime lastRefresh = DateTime.Now;

    private IAtCacheConfiguration config;

    private List<TValue> items;

}

总体来说,让代码告诉它自己,是好代码的体现,而一堆没有意义的代码堆积是让人无法接受和容忍的坏代码。

3. 缓存失效

如果我们同时使用了上述两个例子,就会使其中一个缓存失效。在Model的relations变量中,缓存了已经读取过的关联Model,但是当我们用不同规则的名字去读取的时候,却会使得前一个缓存失效。例如

$post_info = $post->myPostInfo; 
// $post->relations = [‘myPostInfo’ => ..];

$post_info = $post->my_post_info;
// $post->relations = [‘myPostInfo’ => …, ‘my_post_info’ => …];

所以如果不希望缓存失效,得在项目中只使用一种命名方法去读取关系模型。Laravel推荐的是Camel
Case.

2.遵守编码规范

编码规范,就是编码最佳实践,是前辈在编码这件事上的积累和总结,是智慧的延续和工业的实践。在软件产业日益蓬勃的今天,软件工业在于如何更有效率地进行生产这件事儿上,有了巨大的进步和积累,编码规范正是如此。例如可以随意列出很多的规范:

·  命名规范。

·  避免行数过多的方法。

·  代码缩进。

·  异常规范。

·  设计规范。

·  注释规范。

·  文件的组织规范。

·  配置规范。

·  发布与部署规范。

·  测试规范。

·  SQL规范。

在以上每个领域都有N条“法规”,以最佳实践的条款被总结出来,每个条款都渗透着很多前人的智慧。同时,编码规范的应用是有选择和场合的,不同的软件公司和产品,对编码规范都有一定的理解和取舍。

但是,没有规范的编码,一定是有问题、潜伏着坏代码的幽灵。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

相关文章

网站地图xml地图