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 周期