威尼斯手机平台登陆-官方网站登录

威尼斯手机平台登陆为您带来世界三大博彩公司最新相关资讯,威尼斯官方网站登录充分考虑到不同地域网民的不同需求,威尼斯手机平台登陆良好的用户界面,人性化的操作,实用的功能设计使其广泛受到欢迎,推动实体出版、影视、动漫、游戏等相关文化产业的发展。

您的位置:威尼斯手机平台登陆 > 最新留言 > 好代码、坏代码之一,命名空间

好代码、坏代码之一,命名空间

发布时间:2020-03-04 19:26编辑:最新留言浏览(61)

    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;

    }

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

    放置位置

    所有的数据模型文件,都 必须 存放在:app/Models/ 文件夹中。

    命名空间:

    namespace AppModels;
    

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

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

    User.php

    Laravel 5.1 默认安装会把 User 模型存放在 app/User.php必须 移动到 app/Models 文件夹中,并修改命名空间声明为 App/Models,同上。

    为了不破坏原有的逻辑点,必须 全局搜索 App/User 并替换为 App/Models/User

    4. toArray() 方法失效

    如果同时使用了两者,另外一个问题就是导致Model::toArray()失效。因为toArray()方法首先去relations中查找Snake Case命名的关联模型,没有的话才去看Camel Case的。

    所以如果用到了toArray()方法来转换Model,切忌同时使用两者。

    3.遵守命名规则

    命名已经被反复强调了,遵守编码规范首当其冲就是对于命名规范的遵守,对于命名规则,通常可选择的体系主要有:

    ·  Pascal Casing,混合使用大小写字母,每个单词的首字母必须是大写,例如FirstName。

    ·  Camel Casing,混合使用大小写字母,第一个单词的首字母是小写,其他单词的首字母是大写,例如firstName。

    ·  匈牙利命名法,通过属性、类型和对象描述混合来表示,例如frmMainWindow,表示一个窗体实例的命名。

    不过,对于不同的语言体系而言,一般有着不同的命名规范和体系,很多不同的语言对于命名规范的选择也有差别。以C#语言为例,最基本的命名规则包括:

    ·  以Pascal Casing风格定义命名空间、类及其成员、接口、方法、事件、枚举等。

    ·  以Camel Casing规范定义参数、私有成员。

    ·  避免使用匈牙利命名法。

    ·  以Attribute作为特性的后缀。

    ·  以Delegate作为委托的后缀。

    ·  以Exception作为异常的后缀。

    当然,规范还有很多,而这种积累来自于平时对于代码的理解和运用。

     图片 1

    本文节选自《你必须知道的.NET(第2版)》一书

    图书详细信息:

     

    使用基类

    所有的 Eloquent 数据模型必须 继承统一的基类 App/Models/Model,此基类存放位置为
    /app/Models/Model.php,内容参考以下:

    <?php
    
    namespace AppModels;
    
    use IlluminateDatabaseEloquentModel as EloquentModel;
    
    class Model extends EloquentModel
    {
        public function scopeRecent($query)
        {
            return $query->orderBy('created_at', 'desc');
        }
    }
    

    以 Photo 数据模型作为例子继承 Model 基类:

    <?php
    
    namespace AppModels;
    
    class Photo extends Model
    {
        protected $fillable = ['id', 'user_id'];
    
        public function user()
        {
            return $this->belongsTo(User::class);
        }
    }
    

    5. 容易犯错的位置

    最容易犯错的代码是这样的:

    MyPost::with(‘myPostInfo’)->get();
    

    在使用With去eagerLoad关联模型时,必须使用和定义方法同名的key去读取,那么这样读取出来的方法只能是Camel Case的key。其他地方就只能用

    $my_post->myPostInfo;
    

    来保证不出问题。

    命名规范

    数据模型相关的命名规范:

    • 数据模型类名 必须 为「单数」, 如:AppModelsPhoto
    • 类文件名 必须 为「单数」,如:app/Models/Photo.php
    • 数据库表名字 必须 为「复数」,多个单词情况下使用「Snake Case」 如:photos,my_photos
    • 数据库表迁移名字 必须 为「复数」,如:2014_08_08_234417_create_photos_table.php
    • 数据填充文件名 必须 为「复数」,如:PhotosTableSeeder.php
    • 数据库字段名 必须 为「Snake Case」,如:view_count, is_vip
    • 数据库表主键 必须 为「id」
    • 数据库表外键 必须 为「resource_id」,如:user_id,post_id
    • 数据模型变量 必须 为「resource_id」,如:$user_id, $post_id

    利用 Trait 来扩展数据模型

    有时候数据模型里的代码会变得很臃肿,应该 利用 Trait 来精简逻辑代码量,提高可读性,类似于 Ruby China 源码。

    借鉴于 Rails 的设计理念:「Fat Models, Skinny Controllers」。

    存放于文件夹:app/Models/Traits 文件夹中。

    Repository

    绝不 使用 Repository,因为我们不是在写 JAVA 代码,太多封装就成了「过度设计(Over Designed)」,极大降低了编码愉悦感,使用 MVC 够傻够简单。

    代码的可读性,维护和开发的便捷性,直接关系到程序员开发时的愉悦感,直接影响到项目推进效率和程序 Debug 的速度。

    关于 SQL 文件

    • 绝不 使用命令行或者 PHPMyAdmin 直接创建索引或表。必须 使用 数据库迁移 去创建表结构,并提交版本控制器中;
    • 绝不 为了共享对数据库更改就直接导出 SQL,所有修改都 必须 使用 数据库迁移,并提交版本控制器中;
    • 绝不 直接向数据库手动写入伪造的测试数据。必须 使用 数据填充 来插入假数据,并提交版本控制器中。

    全局作用域

    Laravel 的 Model 全局作用域 允许我们为给定模型的所有查询添加默认的条件约束。

    所有的全局作用域都 必须 统一使用「闭包定义全局作用域」,如下:

    /**
     * 数据模型的启动方法
     *
     * @return void
     */
    protected static function boot()
    {
        parent::boot();
    
        static::addGlobalScope('age', function(Builder $builder) {
            $builder->where('age', '>', 200);
        });
    }
    

    本文由威尼斯手机平台登陆发布于最新留言,转载请注明出处:好代码、坏代码之一,命名空间

    关键词: