Java: OOP意见和建议,推进一个小应用
Java: OOP advice and suggestion to advance a small app
所以这个项目有点超出了我的舒适范围。我会将我当前的发展阶段描述为这样一个阶段,“我知道诸如此类的事情:集合、设计模式,以及一般来说什么是好的 OOP。但这些东西有点在我目前的极限。所以我可能不会使用它们,也不会尝试尽可能多地使用它们。”
我正在努力改变这一点,所以我一直在研究真正适合上述情况的相当小的 challenge/application,并要求自己编写智能、干净的代码。到目前为止,我对自己能够做的事情感到相当满意。但是,我还有两个 classes 需要深入研究。关于如何去做这件事,我有很多想法。我确定有些好有些坏,但最重要的是,我想我想多了。
简而言之,这是我想做的,这是我有的,这是我需要去的地方:
我正在尝试做的事情: 陈述此应用程序目标的最简单方法是,我有信用卡(此 class 是 class我做过),我有钱包,我有人。从高层次的角度来看,我是把卡放在钱包里,把钱包放在人们的钱包里。我有 3 张卡,它们实际上只在“名称”和利率上有所不同。我想要一些钱包有 1 张卡,而其他钱包有三张卡。至于钱包,显然每个人至少需要一个,但我想给某人两个。就是这样,我为了简单的兴趣在卡片上计算了一些数学,我会在某个时候加入,但主要是我希望构建一个干净且设计良好的应用程序。
我有什么: 正如我所说,我或多或少已经完成了 CreditCard
class。我仍在对其进行微调,但我已经能够对其进行很多改进并且我对它很满意。我将在下面包含此 class 以提供应用程序的上下文,以便您可以在需要时提供建议。在 class 的顶部你会看到很多文档。这主要是计算单利的数学和逻辑。你会看到的。但是我还有两个正在编写的测试用例,你也会看到这个。
我要去的地方:我有信用卡。现在我只需要钱包和人。从我的角度来看,我可以看到钱包使用了 ArrayList。不过,集合的不同方面可能会更好。我主要(主要)使用 ArrayList,所以我主要使用 ArrayList。到目前为止已经解决了......除此之外,我一直在考虑将 Wallet 和 Person 抽象化,这似乎是个好主意,但再次强调,做出这些选择的经验不多。
所以在所有这一切的最后,我正在寻找一些方向,好的想法的构造以及较弱的想法的替代品。如果这些可以与示例相结合,或者如果建议可以用文字和代码来表达,这将是最佳的,因为当我看到它的实际效果时,我会从建议中得到更多。对我来说,有代码的 OK 建议“通常”比没有代码的好建议更有帮助。这一切都是为了能够应用该建议。但是,那只是我,每个人都不一样。我可以明确告诉你的是,所有建议,无论是什么,都会受到赞赏和帮助。因为,我正在做这件事,我在这里,是为了学习。
/*
* Test Cases:
* 1) 1 person has 1 wallet and 3 cards (1 Visa, 1 MC 1 Discover) – Each Card has a balance of 0 – calculate the total interest (simple interest) for this person and per card.
*
* 2) 1 person has 2 wallets Wallet 1 has a Visa and Discover , wallet 2 a MC - each card has 0
* balance - calculate the total interest(simple interest) for this person and interest per wallet
*/
/*
* Formula Key:
*
* Algebraic Symbols:
* A = Total Accrued Amount (principal + interest)
* P = Principal Amount
* I = Interest Amount
* r & R = Rate of Interest per year in percentage & decimal
* t = Time Period involved in months or years(duration pertaining to this equation)
*
* Rate of Interest, Percentage To Decimal Equations:
* R = r * 100
* r = R / 100
*
* Simple Interest Equation:
* A = P(1 + (r * t))
*/
/*
* Card:
* VISA 10%
*
* Equation:
* Accrued Amount(A) = Principle Amount(P) * (1 +(Interest Rate(r) * Time Period(t)))
*
* Calculation:
* First, converting Interest Rate(R) of 10%, to, Interest Rate(r) of 0.1
* r = R/100 = 10%/100 = 0.1 per year,
* put Time Period(t) of 1 month into years,
* months/year(1 month ÷ 12) = 0.08 years
*
* Solving Equation:
* A = 100(1 + (0.1 × 0.08)) = 100.8
* A = $ 100.80
*
* Solution:
* The total Amount Accrued(A), Principal(P) plus Interest(I),
* from Simple Interest on a Principal(P) of $ 100.00
* at a Rate(r = R/100(convert a percentage to a decimal)) of 10% or 0.1 per year
* for 0.08 years, 1 month(t) is $ 100.80.
*/
/*
* Card:
* MC(Master Card) 5%
*
* Equation:
* Accrued Amount(A) = Principle Amount(P) * (1 +(Interest Rate(r) * Time Period(t)))
*
* Calculation:
* First, converting Interest Rate(R) of 5%, to, Interest Rate(r) of 0.05
* r = R/100 = 5%/100 = 0.05 per year,
* put Time Period(t) of 1 month into years,
* months/year(1 month ÷ 12) = 0.08 years
*
* Solving Equation:
* A = 100(1 + (0.05 × 0.08)) = 100.4
* A = $ 100.40
*
* Solution:
* The total Amount Accrued(A), Principal(P) plus Interest(I),
* from Simple Interest on a Principal(P) of $ 100.00
* at a Rate(r = R/100(convert a percentage to a decimal)) of 5% or 0.05 per year
* for 0.08 years, 1 month(t) is $ 100.40.
*/
/*
* Card:
* Discover 1%
*
* Equation:
* Accrued Amount(A) = Principle Amount(P) * (1 +(Interest Rate(r) * Time Period(t)))
*
* Calculation:
* First, converting Interest Rate(R) of 1%, to, Interest Rate(r) of 0.01
* r = R/100 = 1%/100 = 0.01 per year,
* put Time Period(t) into years,
* months/year(1 month ÷ 12) = 0.08 years
*
*
* Solving Equation:
* A = 100(1 + (0.01 × 0.08)) = 100.08
* A = $ 100.08
*
* Solution:
* The total Amount Accrued(A), Principal(P) Plus Interest(I),
* from Simple Interest on a Principal(P) of $ 100.00
* at a Rate(r = R/100(convert a percentage to a decimal)) of 1% or 0.01 per year
* for 0.08 years, 1 month(t) is $ 100.08.
*/
public class CreditCard
{
private BrandOfCard brandOfCard;
private static final double PRINCIPAL_AMOUNT = 100.00;
private static final double TIME_PERIOD = 0.08;
public CreditCard(BrandOfCard brandOfCard)
{
this.brandOfCard = brandOfCard;
}
/*
* A = P(1 + (r * t))
*/
public double getAccruedAmount()
{
double accruedAmount;
accruedAmount = PRINCIPAL_AMOUNT * (1 + (brandOfCard.getInterestRate() * TIME_PERIOD));
return accruedAmount;
}
public enum BrandOfCard
{
VISA(0.1), MASTER_CARD(0.05), DISCOVER(0.01);
private final double interestRate;
BrandOfCard(double interestRate)
{
this.interestRate = interestRate;
}
public double getInterestRate()
{
return interestRate;
}
}
//bottom of class
public static void main(String[] args)
{
CreditCard visa = new CreditCard(BrandOfCard.VISA);
CreditCard masterCard = new CreditCard(BrandOfCard.MASTER_CARD);
CreditCard discover = new CreditCard(BrandOfCard.DISCOVER);
double accruedAmount;
accruedAmount = visa.getAccruedAmount();
System.out.println("Visa card, with a principle amount of 0.00, & an interest rate of 10%, " +
"has accrued $" + (accruedAmount - PRINCIPAL_AMOUNT) + " in interest, " +
"over the last monthly term.");
System.out.println("The total amount due on this card is now $" + accruedAmount);
accruedAmount = masterCard.getAccruedAmount();
System.out.println("Master Card card, with a principle amount of 0.00, & an interest rate of 5%, " +
"has accrued $" + (accruedAmount - PRINCIPAL_AMOUNT) + " in interest, " +
"over the last monthly term.");
System.out.println("The total amount due on this card is now $" + accruedAmount);
accruedAmount = discover.getAccruedAmount();
System.out.println("Discover card, with a principle amount of 0.00, & an interest rate of 1%, " +
"has accrued $" + (accruedAmount - PRINCIPAL_AMOUNT) + " in interest, " +
"over the last monthly term.");
System.out.println("The total amount due on this card is now $" + accruedAmount);
}
}
首先不要去反对快乐!更多对象!=更好的代码!
从数据的角度来看这个问题,因为这是大多数 OOP 程序员迷失方向的地方。由于某种原因,这些东西是相关存储的。
- 人们把它当作一个对象
- 钱包 - 这只是一个中间键,可以将 n 张卡加入一个人。
- CC 将其作为一个对象,因为每个 CC 都定义了付款条件、费用、利率等。
你最终得到的是:
- Table 个用户。
- Table 张卡片。
除非您想为其分配特定属性,否则钱包实际上是不存在的东西,因为在 CC 记录中让卡所有者密钥将卡链接到所有者。
问题是真的在申请付款。就像银行在 开始处理您的支票或自动付款之前将您的存款添加到您的帐户一样,您必须在计算利息 + 费用值以添加到余额之前应用任何已过帐的付款所以:
for owners{
for cards with card.ownerID = owners.ID{
card.balance=card.balance-payments ;
card.balance=card.balance+calcInterest(card.balance, card.rate)+GetSumOfFees(card);
}
}
这是每个 CC 颁发者每晚运行的基本批处理作业。
在收费方面,这是他们可以逃脱的最小代码,因为这实际上必须在支付终端等处立即发生,等等。
public static String chargeThis(String CCData, Double AMT){
CCNum = GetCCNum(CCData) ;
boolean isValid = validateCC(ccData);
if(isValid) return chargeCC(ccNum,AMT) else return rejectedTrans ;
}
关于 Java 中的列表哈希映射等或 C++ 中的向量...
在超过二级缓存大小之前,对那些调整大小的操作的任何操作都将非常快!在它们超过 L2 缓存的大小后,它们将存储在系统 RAM 中并且它们的性能会下降。在这一点上,链表更胜一筹,因为添加或减去一个元素只是插入一个节点,或删除一个节点。
请记住,获得高级性能需要了解机器并了解 JVM 或编译器如何安排事物。从最好到最差的存储顺序如下:
- L0 缓存 - 1 cpu 周期
- L1 缓存 - 2 cpu 个周期
- L2 缓存 - 5 到 10 cpu 个周期
- 系统内存 1000 次 cpu 周期
- 以太网(通过线路获取数据)10 个 K 周期
- 磁盘 - 50 到 100 K 周期
所以这个项目有点超出了我的舒适范围。我会将我当前的发展阶段描述为这样一个阶段,“我知道诸如此类的事情:集合、设计模式,以及一般来说什么是好的 OOP。但这些东西有点在我目前的极限。所以我可能不会使用它们,也不会尝试尽可能多地使用它们。”
我正在努力改变这一点,所以我一直在研究真正适合上述情况的相当小的 challenge/application,并要求自己编写智能、干净的代码。到目前为止,我对自己能够做的事情感到相当满意。但是,我还有两个 classes 需要深入研究。关于如何去做这件事,我有很多想法。我确定有些好有些坏,但最重要的是,我想我想多了。
简而言之,这是我想做的,这是我有的,这是我需要去的地方:
我正在尝试做的事情: 陈述此应用程序目标的最简单方法是,我有信用卡(此 class 是 class我做过),我有钱包,我有人。从高层次的角度来看,我是把卡放在钱包里,把钱包放在人们的钱包里。我有 3 张卡,它们实际上只在“名称”和利率上有所不同。我想要一些钱包有 1 张卡,而其他钱包有三张卡。至于钱包,显然每个人至少需要一个,但我想给某人两个。就是这样,我为了简单的兴趣在卡片上计算了一些数学,我会在某个时候加入,但主要是我希望构建一个干净且设计良好的应用程序。
我有什么: 正如我所说,我或多或少已经完成了 CreditCard
class。我仍在对其进行微调,但我已经能够对其进行很多改进并且我对它很满意。我将在下面包含此 class 以提供应用程序的上下文,以便您可以在需要时提供建议。在 class 的顶部你会看到很多文档。这主要是计算单利的数学和逻辑。你会看到的。但是我还有两个正在编写的测试用例,你也会看到这个。
我要去的地方:我有信用卡。现在我只需要钱包和人。从我的角度来看,我可以看到钱包使用了 ArrayList。不过,集合的不同方面可能会更好。我主要(主要)使用 ArrayList,所以我主要使用 ArrayList。到目前为止已经解决了......除此之外,我一直在考虑将 Wallet 和 Person 抽象化,这似乎是个好主意,但再次强调,做出这些选择的经验不多。
所以在所有这一切的最后,我正在寻找一些方向,好的想法的构造以及较弱的想法的替代品。如果这些可以与示例相结合,或者如果建议可以用文字和代码来表达,这将是最佳的,因为当我看到它的实际效果时,我会从建议中得到更多。对我来说,有代码的 OK 建议“通常”比没有代码的好建议更有帮助。这一切都是为了能够应用该建议。但是,那只是我,每个人都不一样。我可以明确告诉你的是,所有建议,无论是什么,都会受到赞赏和帮助。因为,我正在做这件事,我在这里,是为了学习。
/*
* Test Cases:
* 1) 1 person has 1 wallet and 3 cards (1 Visa, 1 MC 1 Discover) – Each Card has a balance of 0 – calculate the total interest (simple interest) for this person and per card.
*
* 2) 1 person has 2 wallets Wallet 1 has a Visa and Discover , wallet 2 a MC - each card has 0
* balance - calculate the total interest(simple interest) for this person and interest per wallet
*/
/*
* Formula Key:
*
* Algebraic Symbols:
* A = Total Accrued Amount (principal + interest)
* P = Principal Amount
* I = Interest Amount
* r & R = Rate of Interest per year in percentage & decimal
* t = Time Period involved in months or years(duration pertaining to this equation)
*
* Rate of Interest, Percentage To Decimal Equations:
* R = r * 100
* r = R / 100
*
* Simple Interest Equation:
* A = P(1 + (r * t))
*/
/*
* Card:
* VISA 10%
*
* Equation:
* Accrued Amount(A) = Principle Amount(P) * (1 +(Interest Rate(r) * Time Period(t)))
*
* Calculation:
* First, converting Interest Rate(R) of 10%, to, Interest Rate(r) of 0.1
* r = R/100 = 10%/100 = 0.1 per year,
* put Time Period(t) of 1 month into years,
* months/year(1 month ÷ 12) = 0.08 years
*
* Solving Equation:
* A = 100(1 + (0.1 × 0.08)) = 100.8
* A = $ 100.80
*
* Solution:
* The total Amount Accrued(A), Principal(P) plus Interest(I),
* from Simple Interest on a Principal(P) of $ 100.00
* at a Rate(r = R/100(convert a percentage to a decimal)) of 10% or 0.1 per year
* for 0.08 years, 1 month(t) is $ 100.80.
*/
/*
* Card:
* MC(Master Card) 5%
*
* Equation:
* Accrued Amount(A) = Principle Amount(P) * (1 +(Interest Rate(r) * Time Period(t)))
*
* Calculation:
* First, converting Interest Rate(R) of 5%, to, Interest Rate(r) of 0.05
* r = R/100 = 5%/100 = 0.05 per year,
* put Time Period(t) of 1 month into years,
* months/year(1 month ÷ 12) = 0.08 years
*
* Solving Equation:
* A = 100(1 + (0.05 × 0.08)) = 100.4
* A = $ 100.40
*
* Solution:
* The total Amount Accrued(A), Principal(P) plus Interest(I),
* from Simple Interest on a Principal(P) of $ 100.00
* at a Rate(r = R/100(convert a percentage to a decimal)) of 5% or 0.05 per year
* for 0.08 years, 1 month(t) is $ 100.40.
*/
/*
* Card:
* Discover 1%
*
* Equation:
* Accrued Amount(A) = Principle Amount(P) * (1 +(Interest Rate(r) * Time Period(t)))
*
* Calculation:
* First, converting Interest Rate(R) of 1%, to, Interest Rate(r) of 0.01
* r = R/100 = 1%/100 = 0.01 per year,
* put Time Period(t) into years,
* months/year(1 month ÷ 12) = 0.08 years
*
*
* Solving Equation:
* A = 100(1 + (0.01 × 0.08)) = 100.08
* A = $ 100.08
*
* Solution:
* The total Amount Accrued(A), Principal(P) Plus Interest(I),
* from Simple Interest on a Principal(P) of $ 100.00
* at a Rate(r = R/100(convert a percentage to a decimal)) of 1% or 0.01 per year
* for 0.08 years, 1 month(t) is $ 100.08.
*/
public class CreditCard
{
private BrandOfCard brandOfCard;
private static final double PRINCIPAL_AMOUNT = 100.00;
private static final double TIME_PERIOD = 0.08;
public CreditCard(BrandOfCard brandOfCard)
{
this.brandOfCard = brandOfCard;
}
/*
* A = P(1 + (r * t))
*/
public double getAccruedAmount()
{
double accruedAmount;
accruedAmount = PRINCIPAL_AMOUNT * (1 + (brandOfCard.getInterestRate() * TIME_PERIOD));
return accruedAmount;
}
public enum BrandOfCard
{
VISA(0.1), MASTER_CARD(0.05), DISCOVER(0.01);
private final double interestRate;
BrandOfCard(double interestRate)
{
this.interestRate = interestRate;
}
public double getInterestRate()
{
return interestRate;
}
}
//bottom of class
public static void main(String[] args)
{
CreditCard visa = new CreditCard(BrandOfCard.VISA);
CreditCard masterCard = new CreditCard(BrandOfCard.MASTER_CARD);
CreditCard discover = new CreditCard(BrandOfCard.DISCOVER);
double accruedAmount;
accruedAmount = visa.getAccruedAmount();
System.out.println("Visa card, with a principle amount of 0.00, & an interest rate of 10%, " +
"has accrued $" + (accruedAmount - PRINCIPAL_AMOUNT) + " in interest, " +
"over the last monthly term.");
System.out.println("The total amount due on this card is now $" + accruedAmount);
accruedAmount = masterCard.getAccruedAmount();
System.out.println("Master Card card, with a principle amount of 0.00, & an interest rate of 5%, " +
"has accrued $" + (accruedAmount - PRINCIPAL_AMOUNT) + " in interest, " +
"over the last monthly term.");
System.out.println("The total amount due on this card is now $" + accruedAmount);
accruedAmount = discover.getAccruedAmount();
System.out.println("Discover card, with a principle amount of 0.00, & an interest rate of 1%, " +
"has accrued $" + (accruedAmount - PRINCIPAL_AMOUNT) + " in interest, " +
"over the last monthly term.");
System.out.println("The total amount due on this card is now $" + accruedAmount);
}
}
首先不要去反对快乐!更多对象!=更好的代码!
从数据的角度来看这个问题,因为这是大多数 OOP 程序员迷失方向的地方。由于某种原因,这些东西是相关存储的。
- 人们把它当作一个对象
- 钱包 - 这只是一个中间键,可以将 n 张卡加入一个人。
- CC 将其作为一个对象,因为每个 CC 都定义了付款条件、费用、利率等。
你最终得到的是:
- Table 个用户。
- Table 张卡片。
除非您想为其分配特定属性,否则钱包实际上是不存在的东西,因为在 CC 记录中让卡所有者密钥将卡链接到所有者。
问题是真的在申请付款。就像银行在 开始处理您的支票或自动付款之前将您的存款添加到您的帐户一样,您必须在计算利息 + 费用值以添加到余额之前应用任何已过帐的付款所以:
for owners{
for cards with card.ownerID = owners.ID{
card.balance=card.balance-payments ;
card.balance=card.balance+calcInterest(card.balance, card.rate)+GetSumOfFees(card);
}
}
这是每个 CC 颁发者每晚运行的基本批处理作业。
在收费方面,这是他们可以逃脱的最小代码,因为这实际上必须在支付终端等处立即发生,等等。
public static String chargeThis(String CCData, Double AMT){
CCNum = GetCCNum(CCData) ;
boolean isValid = validateCC(ccData);
if(isValid) return chargeCC(ccNum,AMT) else return rejectedTrans ;
}
关于 Java 中的列表哈希映射等或 C++ 中的向量...
在超过二级缓存大小之前,对那些调整大小的操作的任何操作都将非常快!在它们超过 L2 缓存的大小后,它们将存储在系统 RAM 中并且它们的性能会下降。在这一点上,链表更胜一筹,因为添加或减去一个元素只是插入一个节点,或删除一个节点。
请记住,获得高级性能需要了解机器并了解 JVM 或编译器如何安排事物。从最好到最差的存储顺序如下:
- L0 缓存 - 1 cpu 周期
- L1 缓存 - 2 cpu 个周期
- L2 缓存 - 5 到 10 cpu 个周期
- 系统内存 1000 次 cpu 周期
- 以太网(通过线路获取数据)10 个 K 周期
- 磁盘 - 50 到 100 K 周期