一.课前问题列表
- 什么样的方法应该用static修饰?不用static修饰的方法往往具有什么特性?Student的getName应该用static修饰吗?
什么样的方法应该用
static
修饰?工具方法:如果某个方法不依赖于类的实例状态(即不需要访问类的非静态成员变量),并且其主要目的是提供某种通用的、不依赖于实例的功能,那么这个方法应该是静态的。例如,数学工具类中的计算方法。
常量访问:当方法用于返回类的常量或静态变量的值时,将其声明为静态可以使得调用更加直观和方便。
工厂方法:静态方法有时用于创建类的实例,这种方法被称为工厂方法。这些方法根据提供的参数返回类的实例,但不依赖于任何实例状态。
不用
static
修饰的方法往往具有什么特性?- 依赖于实例状态:这些方法需要访问类的非静态成员变量,即它们的行为可能因实例的不同而有所不同。
- 实例特定操作:这些方法执行的操作是针对类的特定实例的,如修改实例的状态或根据实例的状态执行操作。
Student
的getName
方法应该用static
修饰吗?不应该。
Student
的getName
方法通常用于获取学生的名字,这是一个与Student
实例紧密相关的操作。每个学生的名字可能都是不同的,这意味着getName
方法需要访问每个学生实例的名字字段(通常是一个非静态成员变量)。由于static
方法不依赖于类的任何特定实例,因此如果getName
是静态的,它将无法访问或返回特定实例的名字。因此,getName
方法应该是非静态的,以便能够访问和操作实例的状态。
2.购物车案例中,使用了什么方法将问题描述中的类、方法、属性找出来?方法与属性到底属于哪个类,要怎么判定呢?
User
(用户)Product
(商品)Cart
(购物车)CartItem
(购物车项,表示购物车中的商品及其数量)确定类的属性
每个类都会有一些属性来描述其状态或特征。属性是类的数据成员,用于存储类的实例的特定信息。例如:
User
类包含id
、username
、Product
类可能包含id
、name
、price
、description
等属性。Cart
类可能包含id
、userId
(表示购物车属于哪个用户)、items
(一个列表,包含购物车项)等属性。CartItem
类包含productId
、quantity
等属性。确定类的方法
User
类包含login
、logout
、getProfile
。Product
类包含getPrice
、getDescription
。Cart
类包含addItem
(向购物车添加商品)、removeItem
(从购物车移除商品)、getTotalPrice
(计算购物车总价)等方法。CartItem
类包含updateQuantity
(更新商品数量)方法。判定方法与属性所属的类
- 属性:属性通常与类的状态或特征直接相关。如果某个数据项是描述某个类实例的,那么它应该作为该类的属性。
- 方法:方法应该根据它们执行的操作或行为来确定所属的类。如果某个操作是某个类特有的,或者需要访问或修改该类的状态,那么它应该作为该类的方法。
3.一个项目中有很多类。怎样才能避免你项目中的类与别人编写的类同名呢?项目中类各种各样要怎么管理这些代码呢?举例说明。
1. 命名规范
- 使用命名空间(Namespaces):大多数现代编程语言都支持命名空间的概念,它们允许你将类组织到逻辑分组中,从而减少命名冲突的可能性。例如,在C#或Java中,你可以创建命名空间
Company.Project.Core
来区分你的项目与其他人的项目。- 采用有意义的命名:尽量使类名描述其功能或角色,同时避免使用过于通用或常见的名称。
- 前缀或后缀:有时为了明确表明类的来源或用途,可以使用特定的前缀或后缀。比如,将工具类命名为
Utils
,或将自定义异常命名为MyProjectException
。2. 依赖管理
- 使用包管理工具:利用如Maven(Java)、npm(JavaScript)、NuGet(.NET)等包管理工具来管理项目的依赖。这些工具不仅帮助你自动下载和更新依赖库,还能帮助你解决版本冲突。
- 避免过度依赖:尽量减少对外部库的依赖,尤其是那些频繁更改或包含大量未使用功能的库。
3. 代码结构
- 分层架构:将代码按照逻辑和功能分层,如表现层、业务逻辑层、数据访问层等。这种分层方式有助于分离关注点,同时也使得代码结构更加清晰。
- 模块化:将功能相似的类组织到模块中。模块化的代码更易于维护、测试和重用。
4. 版本控制
- 使用Git等版本控制系统:通过版本控制系统,你可以跟踪代码的更改历史,解决代码合并时的冲突,并可以轻松地回滚到之前的版本。
- 分支策略:制定明确的分支策略,如特性分支(feature branches)、发布分支(release branches)等,以支持多人协作和并行开发。
举例说明
假设你正在开发一个名为“MyLibrary”的Java项目,其中包含了多个类。
命名空间和包:你可以为整个项目创建一个名为
com.mycompany.mylibrary
的包。在这个包下,你可以根据功能创建子包,如com.mycompany.mylibrary.data
用于数据访问层,com.mycompany.mylibrary.service
用于业务逻辑层等。类命名:避免使用常见的名称,如
Util
或Tool
,而是采用更具描述性的名称,如BookManager
、UserAuthenticationService
等。依赖管理:如果项目依赖于其他库,使用Maven或Gradle等工具来管理这些依赖。确保在
pom.xml
或build.gradle
文件中声明这些依赖,并定期检查是否有更新或安全问题。代码结构:按照功能将类组织到不同的包中,如
com.mycompany.mylibrary.models
包含数据模型类,com.mycompany.mylibrary.controllers
包含处理请求的控制器类等。版本控制:使用Git来管理项目代码。在GitHub或GitLab上创建一个仓库,并为你的项目编写README文件、贡献指南和代码样式指南等文档。为每次重大更改创建新的分支,并使用合并请求(merge requests)或拉取请求(pull requests)来合并这些更改到主分支。
4.阅读《阿里巴巴Java开发手册 终极版(1.3.0)》,写出至少7条Java编程规范。应包含如下几个方面:变量命名、类命名、方法命名、常量命名、包命名、代码格式、OOP规约。
- 变量命名
- 规范:变量名使用小驼峰命名法(lowerCamelCase),首字母小写,之后每个单词首字母大写。
- 示例:
int studentAge;
表示学生年龄。- 类命名
- 规范:类名使用大驼峰命名法(UpperCamelCase),每个单词首字母大写。
- 示例:
public class StudentManager
表示学生管理类。- 方法命名
- 规范:方法名也使用小驼峰命名法,首字母小写,表明其行为或职责。
- 示例:
public void addStudent(Student student)
表示添加学生的方法。- 常量命名
- 规范:常量名全部大写,单词间使用下划线(_)分隔。
- 示例:
public static final int MAX_STUDENTS = 100;
表示最大学生数量的常量。- 包命名
- 规范:包名应该是唯一的,通常采用公司或组织域名反写加上模块名。
- 示例:
com.alibaba.myapp.module
,其中com.alibaba
是公司域名反写,myapp
是应用名,module
是模块名。- 代码格式
- 规范:
- 大括号风格统一,推荐采用K&R风格(左大括号不另起行)。
- 每行代码不超过120个字符,超过需要换行。
- 操作符两边空格,如
int a = b + c;
。- 使用空格而不是Tab进行缩进,通常为4个空格。
示例:
public class MyClass { public void myMethod() { if (condition) { doSomething(); } } }
- OOP规约
- 规范:
- 遵守SOLID原则(单一职责、开放封闭、里氏替换、接口隔离、依赖倒置)。
- 类中的方法应该职责单一,尽量避免单一职责外的操作。
- 优先使用组合/聚合而非继承来达到代码复用。
- 接口设计合理,接口中的方法不应超过约定数量(如不超过20个)