Javaスーパーマーケット管理システム1.0(ソースファイルを含む、今後も最適化されます〜)
記事のディレクトリ
序文
私は1か月間散らばってJavaを学びました。この「スーパーマーケット管理システム」の演習を通じて、Javaを一緒に学び始めた友人に言及し、大物がより多くの指針や批判を与えることを願っています〜
1つは、需要を決定する
プログラムの概要:
小型スーパーの商品販売管理システムは、小型スーパーの4種類の商品を管理対象として選択します。
商品の4つのカテゴリーは、食品、化粧品、日用品、飲料です(4つのカテゴリー)。
各タイプの商品には、商品の名前と商品の利益(販売価格、購入価格、商品の在庫など)が含まれます。(5つの属性)
異なる商品の各カテゴリには、他の商品と区別するための特別な情報(サブカテゴリ固有の属性)もあります。たとえば、食品の卸売業者、化粧品のブランド、飲料の製造業者があります。
上記のテキストは、次の点を決定することができます
- プログラムは、「追加、削除、変更、チェック」の4つの基本機能を実現する必要があります+利益を表示します
- このプログラムでは、4つのカテゴリの商品を操作する必要があるため、分類が非常に明確であり、4つのカテゴリの商品を表すために4つのカテゴリを作成するだけで済みます。
- このプログラムでは、商品には(次の属性)商品名、商品の利益、販売価格、購入価格、在庫が必要です(もちろん、商品IDを追加して、より明確な同等の比較を実現できます。後で説明します)。
- このプログラムでは、さまざまな種類の商品について独自の情報を持っている必要があります(食品には卸売業者があり、化粧品にはブランドがあり、飲料には製造業者があります)。
上記のコンテンツを通じて、おそらくこのプログラムの予備的なアイデアとアイデアがあります。どのクラスとメソッドが必要かを詳細に分析しましょう。
2つ目は、クラス、インターフェイス、メソッドの実装を決定することです。
1.クラスを決定します
上記のように:4つのタイプの商品を表すために4つのクラスを定義する必要があります。次に、継承の概念を紹介するために書く前に、4つのクラスから同じ特性(属性)を抽出できますか?
明らかに可能です。製品カテゴリWares
を親カテゴリとして定義できます(そして、ポリモーフィズムを使用して、親カテゴリのさまざまな参照を切り替えWares
ます)。親カテゴリには、4つのカテゴリの製品(製品名、販売)の共通機能が含まれています。価格、購入価格、在庫の5つの属性、製品番号id)、およびそのサブカテゴリはもちろん、食品Food
、化粧品Cosmetic
、日用品DailyUsing
、飲料Drinking
であるため、プログラムのカテゴリが決定されます。
より深く考えることができます:それ
Wares
は通常のクラスまたは抽象クラスである可能性があります。どのように選択しますか?
実際、関数の実装に関しては両方とも可能ですが、通常のクラスがインターフェースを実装する場合、抽象クラスはそれらを必要とせず、インターフェース内のすべてのメソッドを書き直す必要があります。Wares
さらに、4種類の商品の親クラスです。商品を操作するときは、そのサブクラスのオブジェクトを操作するだけで済みます。Wares
オブジェクトをインスタンス化する必要はないためWares
、抽象クラスとして定義することにしました。
食品:約4つのサブクラス
Food
、飲料Drinking
、化粧品Cosmetic
、日用品のカテゴリがDailyUsing
決定
4つのサブクラスは親クラスから継承するだけでWares
よく、共通の属性は自然に継承され、特性属性は各クラスに個別に書き込むことができます。
//Wares类中的属性
//商品名字
private String name;
//商品编号
private int id;
//商品进价
private double inPrice;
//商品售价
private double outPrice;
//库存量
private int Count;
注:Wares
サブクラスの属性をプライベート属性として設定してからsetter
、getter
メソッドを介してアクセスし、カプセル化の適切な習慣を身に付けることをお勧めします〜
2.インターフェースを決定します
商品クラス
Wares
には、すべての商品クラスとそのサブクラスで共有される静的特性(属性)と動的操作(メソッド)が含まれます。プロパティはクラス内で1つずつ初期化できますが、メソッドはこのクラスに1つずつ含める必要があります。 。メソッド本体を記述しますか?
インターフェイスを使用して、プログラムに必要なすべてのメソッドを実装せずに1つずつインターフェイスに宣言し、親クラスWares
がimplement
インターフェイスするのを待ってから、そのサブクラスにインターフェイスのメソッドを1つずつ実装させることができます(上書き)できる
3.方法を決定します
プログラムの要件(要件:追加、削除、変更、チェック、利益の表示)に従って方法を決定しましょう
また、「全製品トラバース」機能を追加することで、検証の役割を果たすプログラムのデバッグ時に、追加、削除、変更、チェック機能が実現できるかどうかを判断できます。
したがって、次の方法を決定しました。
public interface Operations {
/*
添加商品信息
*/
void addWareInfo(ArrayList<Wares> arrayList);
/*
输出商品信息
注意:需要重写toString方法
*/
void printWareInfo(ArrayList<Wares> arrayList);
/*
查询商品信息
注意:需要重写equals方法
*/
void findWareInfo(ArrayList<Wares> arrayList);
/*
计算并显示某个商品的利润
注意:需要重写equals方法
*/
void countWarePrice(ArrayList<Wares> arrayList);
/*
删除商品的信息
注意:需要重写equals方法
*/
void delWareInfo(ArrayList<Wares> arrayList);
/*
修改货物信息
注意:需要重写equals方法
*/
void updateWareInfo(ArrayList<Wares> arrayList);
}
3つ目は、コードを入力する前に別のウェーブを分析することです〜
1.equals()を書き換えますか?
書き換え
equals()
の目的は、同じ内容の2つの異なるオブジェクトを比較し、equalsメソッドが結果がfalseではなくtrueであると判断することを期待することです。このとき、書き換える必要があります。equals()
このプログラムのカスタムequals()
判断ルールは、オブジェクトの数と名前が同時に同じ場合、2つのオブジェクトは同じオブジェクトであると判断されます
。明らかに、このプログラムが「追加、削除、変更、チェック」操作、またはユーザーかどうかの確認同じ商品を繰り返し追加する機能は、2つのオブジェクトを比較する必要があるため、書き換えequals()
が必要です。
では、すべてのクラスがequalsメソッドをオーバーライドする必要がありますか?
明らかに、Wares
抽象クラスは必要ありません。比較するときに、そのサブクラスのオブジェクトが親クラスオブジェクトではなく、同じオブジェクトであるかどうかを比較するためです(さらに、親クラスは抽象クラスであり、インスタンス化することはできません。もちろん、インスタンス化することもできます。と呼ばれるequals()
ので、確実にできます:Food
クラス、Drinking
クラス、DailyUsing
クラス、書き換えられるCosmetic
クラスequals()
を書き換える
/*
重写equals方法
自定义为:当名称相同且商品id相同的时候,视为同一件商品
*/
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || !(o instanceof Wares)) return false;
Cosmetic cosmetic = (Cosmetic) o;
return super.getName().equals(cosmetic.getName()) && super.getId()==cosmetic.getId();
}
2. toStringを書き直しますか?
製品情報を明確に表示する必要があるため、情報を出力する必要があるたびに、すべての情報
System.out.print(“…” + 属性1 + “…” + 属性2);
を表示できます。
しかし、プログラムが何度も出力することを考慮して、System.out.print()
メソッドは内部的に呼び出されtoString()
ます。
したがって、(親クラスの)toStringメソッドを書き直して、各出力に固定出力形式のセットを持たせ、System.out.print(实例化的对象名);
フォーマットされた出力を実装後に完了することができます。
では、すべてのクラスを書き直す必要があり
toString()
ますか?
明らかに、Wares
抽象クラスは必要ありません。情報を出力するときに、4つのサブクラスオブジェクトの情報を出力したいからです(親クラスWares
は抽象クラスであり、オブジェクトをインスタンス化することはできません。もちろん、呼び出すこともできますtoString()
)。私たちは確信することができます:Food
クラス、Drinking
クラス、DailyUsing
クラス、書き直されるCosmetic
クラスtoString()
を書き直すには
/*
重写toString方法
*/
@Override
public String toString() {
return "化妆品 {\t " + super.getId() +
"\t " + super.getName() +
"\t\t" + super.getInPrice() + "元" +
"\t\t" + super.getOutPrice() + "元" +
"\t\t" + super.getCount() + "件" +
"\t}";
}
3. hashCode()を書き直しますか?
Javaは次のように規定しています:2つのオブジェクトが同じである場合、それらの
hashCode
値は同じである必要があります.2つのオブジェクトがhashCode
同じであるequals
場合、それらのオブジェクトの比較は必ずしも同じではありません。
したがって、equalsメソッドを書き直すと、実際には同じオブジェクトではない2つのインスタンスは論理的には等しくなりますが、ハッシュコードは等しくなく、矛盾します。
この種の矛盾はhashMap
、実際の操作結果と期待される操作結果との間に不一致を引き起こします。
(個人的な理解:equals()
trueを返すことは、2つのオブジェクトが同じであり、同じ単一リンクリストで比較されることを意味します。同じ単一リンクリスト上のノードの場合、それらのハッシュ値はすべて同じである必要があるためhashCode()
、戻り値も同じ)。
このプログラムに関する限り、このhashMap
ようなコレクションの基礎となるデータ構造は、各オブジェクトを格納するために使用されません(ただし、使用されますarrayList
)。したがって、hashCodeメソッドを書き換えるかどうかは、このプログラムにほとんど影響しませんが、標準化の観点からです。プログラムの中で、原則として以下に従う必要があります。
クラスのequalsメソッドをオーバーライドする場合は、hashCodeメソッドをオーバーライドする必要があります。また、equalsメソッドがtrueを返す場合、hashCodeメソッドによって返される値は同じである必要があります。
/*
重写hashCode方法
*/
@Override
public int hashCode() {
return Objects.hash(brand);
}
4.保管構造の決定
クラス、インターフェイス、メソッド、属性、データ型、および実装メソッドが決定されました。インスタンス化されたオブジェクトはどのような形式で一緒に保存する必要がありますか?
1つは配列で、もう1つはコレクションです
明らかに、初期化するとき、格納する必要のある商品の数がわからず、配列の容量を見積もることができません。配列は単一のデータ型の要素のみを格納できます。それを操作する場合(提供されているセットと比較して)コレクションの多くの操作には非常に不便であり、配列の検索効率は高いものの、挿入検索の効率は非常に低くなっています。
このプログラムではarrayList
、オブジェクトストレージ用のコレクションを選択します。
注:このプログラムに関しては、個人的にはまだ使用されている
hashMap
(問い合わせが速い)またはhashSet
(並べ替えが便利)と感じており、どちらも保存されている情報が重複しないという特性を自動的に制御できます。これは、このプログラムの改善が必要な分野の1つです。
4、要約とソースコード
この記事がJavaに不慣れな人に役立つことを願っています!
記事の説明やアイデアが正しくないか不適切な場合は、通りすがりの大物が私をたくさん訂正してくれることを願っています!
最後に、ソースコードを添付してください〜
リンク:https
://pan.baidu.com/s/11zu0-HpybqQL46ITh7JC2A抽出コード:m4do