产品或者服务由数据存储和数据计算组成。pojo对象就是用于数据存储。一旦确定后,整个应用或者产品的数据来源就确定。比如一个页面或者功能需要使用什么数据就可以快速找到对应的对象或者通过对象的关系找出来。

pojo对象属于对系统的静态描述。它应该是名词,不应该是动词或者其他。动词、类型或者状态等应该是算法类型的对象,权限应该是AOP考虑的,在后面的漫谈里还会详细提到。

目的

对领域的客观描述反应。比如说:教育领域,农业领域,电商领域,零食领域等。这些只要领域背景没有变化,就会是客观稳定的。当然不同的产品的商业模式对同一个领域的理解也会不同,这些是会经常变化的,但是通常也只是体现在流程、类型、算法、功能等上面,这些并不影响pojo对象。

  • 所有人在沟通的时候理解一致
  • 每个对象职责单一、明确、不可替代

属性分类

为了快速区分属性,并且快速找到真正的pojo对象和属性。这些属性可以在产品里的新增、详情、列表等功能里得到体现。

自描述

一般体现出来的就是手动输入。比如:名称,标题等。

关联

有依赖来源,即在别的地方是手动输入,但是当前功能是选择。比如:选择地区,选择类型。

冗余

方便查询,减少复杂度。一般有以下情况:

  • 一旦生成不会变化的,可以考虑冗余,因为这样可以减少复杂度。
  • 偏统计类。比如:视频里冗余评论数购买数。
  • 为了减少不同类型表的依赖。

功能

个性化业务,纯粹是为了做功能

只留自描述,这个很难。需要深层次了解领域。通过领域驱动设计。这样可以通过面向对象,通过很少的关注点,对整个系统有个静态的认识。而且还可以判断出产品变更的时候对整个系统的结构(即数据存储)有什么影响。特别是出现新名词的时候。

需要根据产品的实际情况来判断这些属性怎么规划。如果是想要快速、简单,但是4种类型都放到pojo上,开发是最快的,但是同时肯定也是扩展性最差的。也需要根据产品的真实需求来判断怎么处理后面3种类型的属性。

抽取步骤

很多童鞋打着面向对象的幌子干着面向过程的事。在抽取名词的时候同时又考虑算法、流程、权限等。这样一来关注点几何倍数增长,本来应该用于考虑pojo对象是否合理的时间更没办法充分得到利用。

很多童鞋想成一次就把对象抽取出来。实现上抽取比印象中还要复杂。所以建议的是分步骤,按部就班的去抽取才是最快的办法。

枚举

只是把产品里涉及到的所有名词枚举出来。
下面是枚举时的陷阱:

  • 不要去通过自己的理解去修改名词叫法
  • 不要去忽略自己觉得不重要的名词
  • 不要考虑表怎么存储
  • 不要考虑非名词

这些陷阱很容易让后期返工。

删除

删除和产品(领域)无关的名词。比如:文案可能出现了故宫或者平台名等和本领域无关的名词。

去重

必需确保每个名词都是职责单一,不可替代的。
一般去重的特征如下:不同的名词体现出来的属性,功能和生命周期是一样的,只是描述不同。
比如: 不同角色的人在对同一个名词描述不同,他们在新增的时候属性相似度非常高,流程也特别像。

一般的反问自己或者产品:

  • 它们的不同点在哪?
  • 如果改一个地方,另一个地方会不会需要同时修改?
  • 如果把它们做成一样会有什么问题吗?

添加

  • 在描述一个概念的时候,必须通过非常多其他对象,而且经常提。
  • 虽然产品没有提过,但是在实施的时候发生有很多对象有一样的特性。常见情况:
    • 一个列表涉及到非常多的名词,但是列表本身产品并没有体现概念。
    • 不同的名词,他们的属性很雷同,而且生命周期几乎是一样的,有种几条平行线的感觉。比如说:同样要新增、发布、审核等

聚合

把属性名词聚合到对象名词里。这里务必确认只放自描述属性。其他的属性暂时不考虑,因为可以很方便的通过关系来描述,而且这个也经常会变化。

陷阱

如果有以下的情况说明对象分析的不够合理,后面很容易返工,请务必重视。

单方面描述

有一方有一直在说,但是另一方从来不提。说明这里缺少重要名词。

描述不一致

在描述同一名词的时候,往往需求进一步翻译。
这样可能会出现的问题是:

  • 沟通和维护成本增加
  • 很可能缺少重要信息或者说关系理解的不对等。

组合描述

  • 用多个词来描述一个概念。需要一个新词。
  • 一个概念没有具体自描述,而是关系出来的,但是又是沟通描述时经常出现。

推荐书单

  • 《UML基础,应用与案例》
  • 《领域驱动设计》

漫淡面向对象——POJO对象的更多相关文章

  1. Hibernate(二)——POJO对象的操作

    POJO对象其实就是我们的实体,这篇博客总结一下框架对POJO对象对应数据库主键的生成策略,和一些对POJO对象的简单增删改查的操作.  一,Hibernate框架中主键的生成策略有三种方式: 1,数 ...

  2. Hibernate框架(二)POJO对象的操作

    POJO对象其实就是我们的实体,这篇博客总结一下框架对POJO对象对应数据库主键的生成策略,和一些对POJO对象的简单增删改查的操作. 一,Hibernate框架中主键的生成策略有三种方式: 1,数据 ...

  3. jface databinding:部分实现POJO对象的监测

    在前一篇博文<jface databinding/PojoBindable实现对POJO对象的支持  >中,已经知道直接对POJO对象进行修改,是不能被绑定的UI组件知道的,在上一篇文章中 ...

  4. 【SpringMVC】SpringMVC系列7之POJO 对象绑定请求参数值

      7.POJO 对象绑定请求参数值 7.1.概述 Spring MVC 会按请求参数名和 POJO 属性名进行自动匹配,自动为该对象填充属性值.而且支持级联属性.如:dept.deptId.dept ...

  5. 自动封装Servlet HttpServletRequest请求成为一个POJO对象

    自己写了个小工具类,将Servlet里面的HttpServletRequest请求封装成为一个POJO对象,可以复习一下Java的反射原理,开发中这个没什么用,毕竟都用MVC框架,框架都自带这种功能, ...

  6. 使用 POJO 对象绑定请求参数

    概述 Spring MVC 会按请求参数名和 POJO 属性名进行自动匹配,自动为该对象填充属性值并且支持级联属性.这一特性在日常开发过程中使用频率比较高,开发效率也高,本文主要对 POJO 对象绑定 ...

  7. Java面向对象 其他对象

     Java面向对象  其他对象 知识概要:             (1)可变参数 (2)静态导入 (3)System (4)Runtime (5)Date  Calendar (6)Math 本 ...

  8. DTO/DO等POJO对象的使用场景和 orika-mapper 框架的使用

    对于项目而言, 我们一般会有DAO->Service->Controller分层设计, 这些层次体现了每层的作用, 而层次之间的数据传递对象设计很少被提及, 下面是一个相对完整的数据转换过 ...

  9. 洗礼灵魂,修炼python(31)--面向对象编程(1)—面向对象,对象,类的了解

    面向对象 1.什么是面向对象 (图片来自网络) 哈哈,当然不是图中的意思. 1).面向对象(Object Oriented,OO)是软件开发方法.利用各大搜索引擎得到的解释都太官方,完全看不懂啥意思对 ...

随机推荐

  1. springboot kafka集成(实现producer和consumer)

    本文介绍如何在springboot项目中集成kafka收发message. 1.先解决依赖 springboot相关的依赖我们就不提了,和kafka相关的只依赖一个spring-kafka集成包 &l ...

  2. 第三章 MySQL高级查询(一)

    第三章 MySQL高级查询(一) 一.SQL语言的四个分类 1.       DML(Data Manipulation Language)(数据操作语言):用来插入,修改和删除表中的数据,如INSE ...

  3. [ZJOI2005]九数码游戏

    [ZJOI2005]九数码游戏 题目描述 输入输出格式 输入格式: 输入文件中包含三行三列九个数,同行的相邻两数用空格隔开,表示初始状态每个方格上的数字.初始状态不会是目标状态. 输出格式: 如果目标 ...

  4. elasticsearch高级组合查询ava

    /**     * 高级检索(组合条件检索)must相当于sql and操作     * @param modelType 0为模糊查询,1为精确查询     * @param index 索引   ...

  5. Mysql [Err] 1293 there can be only one TIMESTAMP column with CURRENT_TIMESTAMP in DEFAULT or ON UPDATE clause

    问题: mysql数据 导入数据出错 [Err] 1293 - Incorrect table definition; there can be only one TIMESTAMP column w ...

  6. C# 6.0 $"Hello {csdn}"

    "hello $world"的格式化字符串是指把字符串中一个单词,以一个标示开头.可以代换为单词所指的变量. 这个在jq有,而C#string的格式只能用格式的字符占位符,格式的字 ...

  7. win10 uwp 获得焦点改变

    本文讲的是当我们应用失去焦点时,我们获得事件,当我们应用获得焦点,同样获得事件.同时,在应用不可以见时,我们也可以获得. 上面一张图,开始是应用启动,获得焦点,应用显示.然后我们打开另一个应用,切换, ...

  8. linux脚本定时备份数据库表(详解)

    数据库备份策略 备份的数据库 服务器:10.10.10.254.10.2.11.10 数据库:gps6 备份的表: user_info alarminfo electronic_fence jpush ...

  9. LeetCode 695. Max Area of Island (岛的最大区域)

    Given a non-empty 2D array grid of 0's and 1's, an island is a group of 1's (representing land) conn ...

  10. LeetCode 455. Assign Cookies (分发曲奇饼干)

    Assume you are an awesome parent and want to give your children some cookies. But, you should give e ...