Java:推广小应用程序的OOP建议和建议

时间:2015-02-08 00:47:57

标签: java oop arraylist collections abstract

所以这个项目有点偏离我的舒适区。我会将我当前的发展阶段描述为“我知道的事情,例如:收集,设计模式,以及通常是什么促成了良好的OOP。但是这些东西都是我目前的极限。所以我可能不会使用它们或尝试尽可能多地使用它们。“

我正在努力改变它,所以我一直致力于相当小的挑战/应用程序,它真正适用于上述内容,并要求自己编写智能,干净的代码。到目前为止,我对我能做的事情感到非常满意。但是,我还有两节课,我还需要深入研究。我对如何解决这个问题有很多想法。我确信有些是好的,有些是坏的,但更重要的是,我认为我在思考问题。

简而言之,这就是我想要做的,这就是我所拥有的,这就是我需要去的地方:

我正在尝试做什么:说明此应用目标的最简单方法是,我有信用卡(此类是我已经完成的课程),我有钱包,以及我有人。从高层次的角度来看,我将卡片放在人们的钱包和钱包里。我有3张牌,他们的名字和利率实际上只有不同。我想要一些钱包有1张卡,而其他钱包有三张。至于钱包显然每个人至少需要一个,但我想给两个人。这真的是关于它的,我在卡上得到了一些数学上的简单兴趣,我会在某些方面与之相关,但大多数时候我都希望建立一个干净且设计良好的应用程序。

我有什么:正如我所说,我或多或少地完成了CreditCard课程。我仍然很好地调整它,但我已经能够很好地改进它,我对它很随意。我将在下面包含此类以提供应用程序的上下文,因此您可以根据需要提供建议。在课程的顶部,你会看到很多文档。这主要是数学,而且它是逻辑,用于解决简单的兴趣。你会看到的。但我也有两个我正在编写的测试用例,你也会看到这个。

我需要去的地方:我有信用卡。现在我只需要钱包和人。从我的角度来看,我可以看到钱包使用了ArrayList。但是,情况可能是集合的不同方面可能更好。我主要(大部分)使用ArrayList,所以我主要使用ArrayList。它到目前为止已经解决了......除此之外,我一直在考虑制作钱包和人物抽象,这似乎是一个好主意,但再一次,在做出这些选择方面没有多少经验。

因此,在所有这一切的最后,我寻找一些方向,构思好的想法和弱者的替代品。如果这些可以与示例相结合,或者如果建议可以用文字和代码表达,那么这将是最佳的,因为当我能够看到它的实际情况时,我会从建议中获得更多。对我来说,一个好的建议与代码,“通常”比一个伟大的建议没有更有帮助。这一切都是为了能够应用这些建议。但是,这只是我,每个人都不同。我可以告诉你的是,这是明确的,所有的建议,无论它们是什么,都会受到赞赏和帮助。因为,我这样做,我在这里,要学习。

/*
 * Test Cases:
 * 1) 1 person has 1 wallet and 3 cards (1 Visa, 1 MC 1 Discover) – Each     Card has a balance of $100 – 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 $100 
 * 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 $100.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 $100.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 $100.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);
    }
}

1 个答案:

答案 0 :(得分:0)

首先,不要快乐!更多对象!=更好的代码!

从数据的角度来看这个,因为这是大多数OOP程序员迷失方向的地方。出于某种原因,这些东西是相关存储的。

  • 人们将其作为一个对象
  • 电子钱包 - 这只是将n张卡片加入某人的中键。
  • CC使该对象成为一个对象,因为每个CC都定义了付款条件,费用,利率等。

你最终得到的是:

  • 用户表。
  • 一张纸牌。

钱包,除非您想为其分配特定属性,这实际上是不存在的事情,因为在CC记录中让卡所有者密钥将卡片链接到所有者。

真正的应用付款。就像银行将您的存款添加到您的帐户之前他们开始处理您的支票或自动付款一样,您必须在计算利息+费用值之前应用任何已过帐的付款以添加到余额中,以便: / p>

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 Issuer每晚都会运行的基本批处理作业。

在充电方面,它是最小的代码,它们可以在正常情况下在付费终端等处实现。

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缓存的大小为止!在它们超过L2缓存的大小之后,它们被存储在系统RAM中并且它们的性能进入槽中。此时链表是优越的,因为添加或减去元素只是插入节点或删除节点。

请记住,获得高级性能需要了解机器并了解JVM或编译器如何安排事情。从最好到最差的存储顺序如下:

  • L0缓存 - 1个cpu周期
  • L1缓存 - 2个cpu周期
  • L2缓存 - 5到10个cpu周期
  • 系统内存1000的cpu周期
  • 以太网(通过线路获取数据)10个K周期
  • 磁盘 - 50到100 K周期