長い読み取り、ブロガーがチームのためにカオスコードを作成して、センチメンタル新人のとき(英語クリーンコードで)、「道路のコードをきれいに」。私は確かに後で同僚を傷つける、左の時に仕事の年には、コードはコードを覚えて、他人の繰り返し悲惨なピットとなっています。正確な変数名なので、上の詳細なメモに行くというよりちょうどいいデザインパターン、:JDKのソースコードや他の偉大なオープンソースプロジェクト、憧れ洗練されたコードの建物を読むとき、彼らは共通の特徴を持っています。今、本を再読み込み内容を要約し、あなたと共有するために自分のアイデアをいくつか追加します。
チーム通信コード
コミュニケーションの仕事だけでなく、電子メールや口頭でのコミュニケーションを対面では、コードが通信するための一つの方法です。コードで実装要件、長征における最初の一歩、コードが自分のデザインのアイデアを表現するために許可する必要があります。あなたが引き継ぐために別の同僚の機能を担っていることを想像して、コメントをあなたのコードの構造が明確かつ合理的な場合は、彼は頻繁にチャレンジコードの疑いはないでしょう、あなたの仕事を中断しないでください。コードを書くときには、アカウントに他の人の読書体験を取る失読症を減らし、チーム全体のためのコードを作成し、自分自身ではないはずです。
ときに比べてみようキャンプ場クリーナー
これは、アメリカの規制のことわざボーイスカウト、アメリカ青少年サマーキャンプの準軍事管理のボーイスカウトのと同じです。サマーキャンプの子供たちはキャンプも聞かせてよりはるかにきれい、清楚をクリーンアップするためにキャンプを残して後。ソフトウェア開発プロセスでは、それを理解することができるよう不要破坏规则,不要引入混乱
。チームのようなサブシステムの接頭辞を持っている必要があり、そのようなクラス名として、コードの仕様を開発している場合BiOrderService
(バイBIはビジネスを意味し)、それがダウンして従うことを続けて、別の例を、チームは、このような公共図書館としてMD5暗号化を提供している、再び新しいを導入していませんMD5ライブラリ。仕事の後、多くの初心者プログラマは、我々は互換性やその他の問題を引き起こして、おなじみのライブラリに直接導入、古いドライバを依頼していないいくつかのツールを必要とする何の公共図書館を持っていない、描画ボード上の仕様を見て好きではありません。
適切な名前
適した命名が重要として、新生児への良い名前として、優先事項です。ネーミングは、しばしば不適切である词不达意、误导观众、过度缩写
英語は、私たちの母国語ではないので、本当に難しいようで、適切な単語の名前を見つけるために、など、。私のアドバイスは、最初のビジネスを理解し、一般的なビジネスの分野で使われる単語の集合組織の会議、メンバーに自分の発明を禁止することです。例えば、コードを使用してcanteen
水筒を表し、次いでない再発明DinnerHall
は、両方の長ったらしいと誤解を招く同僚。
反例を見てください:
// 手机号
String phone = “13421800409”;
// 获取地址
private String getDiZhi();
//修改密码
private void modifyPassword(String password1 ,String password2)
正の例を見てください:
// 手机号 mobileNo比phone更精确
String mobileNo= “13421800409”;
// 避免英文拼音混杂
private String getAddress();
// 参数的命名要区分意义
private void modifyPassword(String oldPassowrd,String newPassword)
近道
決定的な方法はどのように短いではない読者の殺人の心を離さない、適切な、しかし、最大500行の方法です。読者がどこ正面に振り返った、開始忘れてわからないようにする方法は、長すぎます。複雑な方法で、比較的単純なロジックが短いメソッドに分割しました。
反例を見てください:
// 获取个人信息
Private UserDTO getUserDTO(Integer userId)
{
//获取基本信息
… 此处写了10行
//获取最近的一次订单信息
… 此处写了30行
// 获取钱包余额、可用优惠券张数等
... 此处写了30行
return userDTO;
}
正の例を見てください:
// 获取个人信息
Private UserDTO getUserDTO(Integer userId)
{
//获取基本信息
UserDTO userDTO= getUserBasicInfo(userId);
//获取最近的一次订单信息
userDTO.setUserLastOrder(getUserLastOrder(userId));
// 获取钱包、可用优惠券张数等
userDTO.setUserAccount(getUserAccount(userId));
return userDTO;
}
Private UserDTO getUserBasicInfo(userId);
Private UserLastOrder getUserLastOrder(userId);
Private UserAccount getUserAccount(userId);
ネストされた/それ以外の場合は減少
ネストを減らすなぜ、それがネストされたファッションにそれを見ていないのですか?私はかつての同僚、彼らはめまいを維持するために探している時に行くために彼自身の9層までネストコードの一部を見ました。コード過度のネスティング結果は唯一の著者が読み取ることができるということです、そして夏は当惑設定。
反例を見てください:
// 修改用户密码,这个例子只有3层嵌套,很温柔了
public boolean modifyPassword(Integer userId, String oldPassword, String newPassword) {
if (userId != null && StringUtils.isNotBlank(newPassword) && SpringUtils.isNotBlank(oldPassword)) {
User user = getUserById(userId);
if(user != null) {
if(user.getPassword().equals(oldPassword) {
return updatePassword(userId, newPassword)
}
}
}
}
正の例を見てください:
// 修改用户密码
Public Boolean modifyPassword(Integer userId, String oldPassword, String newPassword) {
if (userId == null || StringUtils.isBlank(newPassword) || StringUtils.isBlank(oldPassword)) {
return false;
}
User user = getUserById(userId);
if(user == null) {
return false;
}
if(!user.getPassword().equals(oldPassword) {
return false;
}
return updatePassword(userId, newPassword);
}
陽性の場合は、入れ子にガード文を低減した、すべてではないが書き換えられ、そのような場面に適しています。そうでない場合、論理ハイ関連性は、ネスティングを低減するための独立した方法として抽出してもよいです。
戸建のtry / catch
私たちは、の世話をするためのtry / catchによって開始から終了までの長い道のりを見ていませんか?プロジェクトブロガーは、この文言が責任富むない、経験しました。コードのないすべての行は、エラーがスローされます、エラーは限りビジネスは別の方法で配置することができますとしてスローされます。
反例を見てください:
// 获取个人信息
Private UserDTO getUserDTO(Integer userId)
{
try {
//获取基本信息
... 此处写了10行
//获取最近的一次订单信息.
...此处写了20行
// 获取钱包、可用优惠券张数等
...此处写了20行
}catch (Exception e) {
logger.error(e);
return null;
}
}
return userDTO;
}
正の例を見てください:
// 获取个人信息
Private UserDTO getUserDTO(Integer userId)
{
//获取基本信息
UserDTO userDTO= getUserBasicInfo(userId);
//获取最近的一次订单信息
userDTO.setUserLastOrder(getUserLastOrder(userId));
// 获取钱包、可用优惠券张数等
userDTO.setUserAccount(getUserAccount(userId));
return userDTO;
}
Private UserDTO getUserBasicInfo(userId);
Private UserLastOrder getUserLastOrder(userId);
Private UserAccount getUserAccount(userId){
try{ // TODO } catch( Exception e) { //TODO}
}
複数のパラメータをパッケージ
3以上のメソッドのパラメータが強いカップリングには、パラメータを追加するために、他のクラスをラップ、または提案を置く場合は、セマンティック発信者構文エラーにつながります。背景管理におけるページングクエリーインターフェイスは、そこに多くの場合、クエリパラメータがたくさんあり、かつ増加する可能性がある、それは最高のパッケージです。
反例を見てください:
// 分页查询订单 6个参数
Public Page<Order> queryOrderByPage(Integer current,Integer size,String productName,Integer userId,Date startTime,Date endTime,Bigdecimal minAmount ,Bigdecimal maxAmount) {
}
正の例を見てください:
@Getter
@Setter
Public class OrderQueryDTO extends PageDTO {
private String productName;
private Integer userId;
private Date startTime;
private Date endTime;
private Bigdecimal minAmount ;
private Bigdecimal maxAmount;
}
// 分页查询订单 6个参数
Public Page<Order> queryOrderByPage(OrderQueryDTO orderQueryDTO) {
}
サードパーティのライブラリ
唐辛子
コンパイル時に自動的に生成されたコンストラクタプロパティ、ゲッター/セッター、等しく、ハッシュコードに注釈を介してロンボクアセンブリ 、のtoStringの方法
:例えば以下のよう
@Setterまたはフィールドベースの注釈、クラス内のすべてのフィールドのアノテーション生成セッターメソッド、コメントときフィールドは、フィールドのセッターメソッドを生成します。
ゲッターが生成されることを除いて、上記のように使用@Getter。
toStringメソッドを追加して、クラスのノートを@ToString。
@EqualsAndHashCode注釈タイプ、およびハッシュコードの生成方法に等しいです。
@NoArgsConstructor注釈クラスは、引数なしのコンストラクタを生成します。
磁界発生クラスの@RequiredArgsConstructor注釈クラスのコンストラクタメソッドは、最終的@NonNull注釈付きフィールドなどの特別な処理を必要とします。
@AllArgsConstructor注釈クラスは、クラスのコンストラクタにすべてのフィールドを生成します。
@data注釈型、セッター/ゲッターは、canEqual等しく 、ハッシュコード、のtoStringの方法は、そのような最終的な属性として、属性が生成のためセッターメソッドが生成されません。
従来の書き込み:
Public class Order {
private Integer userId;
public Integer getUserId() {
return userId;
}
public void setUserId(Integer userId) {
return this.userId = userId;
}
}
ロンボクの使用:
@Getter
@Setter
Public class Order {
private Integer userId;
}
Apacheのコモンズシリーズ
Apacheのコモンズのコンポーネントは、ツールのメソッド文字列、コレクション、上のIOの一連の動作を提供してくれます。これらのコンポーネントは、大きな宝物は、車輪の多くを提供しています。
パッケージ | 入門 |
---|---|
々BeanUtils | JavaBeanの様々な操作、クローン、性質など |
コーデック | 処理一般的に使用される符号化ツールパッケージの方法、例えばDES、SHA1、MD5、Base64では次のように。 |
コレクション | Javaの動作フレームコレクション |
コンフィギュレーション | javaアプリケーションの構成管理ライブラリ |
私 | IOパッケージツール |
のみ | ツールなどのJavaのStringUtilsとしてパッケージベースのオブジェクトのメソッド、ArrayUtilsが好きです。 |
ロギング | インタフェースが提供ログイン |
ネット | 検証データフレーム、クライアントとサーバーの提供 |
例を見てください:
例1: 判断集合是否为空:
CollectionUtils.isEmpty(null): true
CollectionUtils.isEmpty(new ArrayList()): true
CollectionUtils.isEmpty({a,b}): false
例2: 判断集合是否不为空:
CollectionUtils.isNotEmpty(null): false
CollectionUtils.isNotEmpty(new ArrayList()): false
CollectionUtils.isNotEmpty({a,b}): true
例3:2个集合间的操作:
集合a: {1,2,3,3,4,5}
集合b: {3,4,4,5,6,7}
CollectionUtils.union(a, b)(并集): {1,2,3,3,4,4,5,6,7}
CollectionUtils.intersection(a, b)(交集): {3,4,5}
CollectionUtils.disjunction(a, b)(交集的补集): {1,2,3,4,6,7}
CollectionUtils.disjunction(b, a)(交集的补集): {1,2,3,4,6,7}
CollectionUtils.subtract(a, b)(A与B的差): {1,2,3}
CollectionUtils.subtract(b, a)(B与A的差): {4,6,7}