65.9K
CodeProject 正在变化。 阅读更多。
Home

链接面向对象编程 (POOV)

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.69/5 (16投票s)

2016 年 10 月 27 日

CPOL

6分钟阅读

viewsIcon

27034

POOV 是一种面向对象编程语言的编程技术,由 Eduardo Mireles 工程博士和专家程序员在 MIRA 软件工厂开发。它促进了软件解决方案的编码。

引言

链接面向对象编程 (POOV)

什么是 POOV?

POOV 是一种面向对象编程语言的编程技术,由 Eduardo Mireles 工程博士和专家程序员在MIRA 软件工厂开发。

  • 它促进了软件解决方案的编码。
  • 它提供了更高的代码稳定性和易维护性。
  • 有效实现遵守截止日期和成本。
  • 减少故障和风险。

促进软件解决方案的编码

使用面向对象语言的一个主要问题是无法充分发挥其潜力,因为最广泛使用的数据库是关系型数据库,这与面向对象的技术不同。

POOV 试图充分发挥 OOP 的潜力,并增加了将对象状态存储在关系数据库中的便利性,因此 OOP 应该进行小的偏离,并将编程引导至对象的“链接”,从而得到 POOV。

OOP 会怎么样?

  • 使用 UML 详细建模很困难。
  • 通常最后模型与代码不匹配。
  • 类最终具有与模型中引用的类不同的方法。
  • 方法的逻辑、定义和功能在很大程度上取决于程序员的风格。
  • 将对象的状态存储在关系数据库中更加复杂,或者代码面向数据管理。
  • 相同的业务规则可能包含在不同的类中。

POOV 会怎么样?

  • 使用 UML 详细建模到代码行很容易。
  • 代码已生成并附加到模型。
  • 代码结构完美。
  • 方法的逻辑、定义和功能是预定义的,并遵循分析。
  • 对象的状态与存储在关系数据库中完全兼容。
  • 业务规则的所有者已明确标识。
  • 生成标准化的代码,与程序员风格无关。

POOV 建议将代码的重点放在

  • 专注于维护对象的持久性及其恢复。
  • 专注于链接、规则和行为的类型。
  • 维护专门的结构以提供这些功能。

为此,POOV 拥有 2 个专用接口

  1. 一个提供自身接口功能的接口(*Base Interface*)。
  2. 一个提供其他类型对象功能的接口(*Linked Interface*)。

1.- 持久性

系统中的所有对象都必须确保其持久性以及恢复能力。
为此,POOV 建议为所有类提供一个通用接口,以确保这一点。

Base Interface 管理类的对象持久性,其方法具有多种功能和特性。

  • 映射特性包括:ID、IsDetached、PersistentState、Accepted、Hash 和 Schema。
  • 构建器方法:NewObject、Initialize、Clone、Reset、Refresh、Restore,以及类自身的构建器和析构函数。
  • 更新器方法:Add、Update、Delete、AcceptChanges、RejectChanges、ValidateAdd、ValidateUpdate 和 ValidateDelete。
  • 选择方法:Select、FreeSelect、Find 和 Exist。
  • 传输方法:Get、Set、Notify、Quiet 和 ToString。
  • 比较器方法:Equals、Same 和 CompareTo。

有了这个 Base 接口,就足以确保和管理任何类型对象的持久性,无需更多。

Base Interface 确保任何类型对象的持久性,这个接口称为 CCB(Control Class Base)。

CCB 的目的是标准化持久性管理。
(例如,无论是 Loan、Invoice 还是 Product 类,持久性都以相同方式管理)

示例

新贷款

NewLoan = Loan.NewObject();
NewLoan.Account = 5803;
NewLoan.Bank = “National”;
NewLoan.Amount = 15000;
NewLoan.Add();
NewLoan.AcceptChanges();

更改贷款

MyLoan = Loan.Find(5803);
MyLoan.Payment = 1000;
MyLoan.Update();
MyLoan.AcceptChanges();

搜索贷款

MyLoans[] = Loan.Select(“National”);

新发票

NewInvoice = Invoice.NewObject();
NewInvoice.Number = 5803;
NewInvoice.Customer = “ABC Store”;
NewInvoice.Amount = 376.25;
NewInvoice.Add();
NewInvoice.AcceptChanges();

更改发票

MyInvoice = Invoice.Find(5803);
MyInvoice.Payment = 150;
MyInvoice.Update();
MyInvoice.AcceptChanges();

搜索发票

CustInvoices [] = Invoice.Select(“ABC Store”);

新产品

NewProduct = Product.NewObject();
NewProduct.Code = “RD-671”;
NewProduct.Name = “Solar Panel 260 Watts”;
NewProduct.Price = 280;
NewProduct.Add();
NewProduct.AcceptChanges();

更改产品

MyProduct = Product.Find(“RD-671”);
MyProduct.Price = 259.99;
MyProduct.Update();
MyProduct.AcceptChanges();

搜索产品

ListProducts[] = Product.Select();

所有对象都需要创建、更新、搜索和删除。CCB 提供了接口,以便能够以标准化方式执行这些操作。

注意:这里显示的是 CCB 接口的功能,类的特性可能会更多或不同。

2.- 链接

POOV 中,有 10 种不同类型的链接,根据其功能分为 3 组

  1. 限定词:简单限定词(CS)、组合限定词(CC)和独立限定词(CI)。
  2. 关系:简单关系(RS)、组合关系(RC)、历史关系(RH)、对合关系(RI)。
  3. 连接:简单连接(JS)、唯一限定连接(JU)和多重限定连接(JM)。

Linked Interface 管理两个类对象之间的父子依赖关系,分为父端(P)和子端(H)两部分。

P(父)的链接方法是

  • Link、Contain、Remove、Replace、LinkedClassName、ValidateLink、ValidateRemove。
  • Update、AcceptChanges、RejectChanges。

H(子)的链接方法是

  • NewObject、Find、Exist、Select。
  • Compute、Avg、Count、Max、Min、Sum(可以更好地进行计算)。

除了这些方法之外,H 链接接口还有一个附加功能,即包含父对象。

RC 链接类型(组合关系)的示例。

RC 链接有 2 部分:RCP 为父提供功能,为子提供 RCH 功能,以便链接能够运行。

Linked Interface 的目的是标准化类之间关系的管理。
例如,无论是 InputOutput 和 Kardex 类之间的链接,还是 Item 和 Invoice 之间的链接,或者 Invoice 和 Payments 之间的链接,链接的管理方式都是相同的。

示例

新销售

MyKardex = Kardex.Find(“RD-671”);


OutSale = InputOutput.NewObject();
OutSale.Quantity= 3;
OutSale.IO = “Output”;

MyKardex.Link(OutSale);
MyKardex.Update();
MyKardex.AcceptChanges();

Kardex 详情

IOs[] = MyKardex.LinkedInputOutput ();

新发票项目

MyInvoice = Invoice.Find(5803);


NewItem = InvoiceItem.NewObject();
NewItem.Cant = 3;
NewItem.Product = “Solar Panel 260 Watts”;

MyInvoice.Link(NewItem);
MyInvoice.Update();
MyInvoice.AcceptChanges();

发票详情

InvoiceDetail[] = MyInvoice.LinkedInvoiceItem();

新发票付款

MyInvoice = Invoice.Find(5803);

NewPay = Payments.NewObject();
NewPay.Amount = 75.80;
NewPay.Date = “11/06/2015”;

MyInvoice.Link(NewPay);
MyInvoice.Update();
MyInvoice.AcceptChanges();

Invoice detail:

InvoicePays[] = MyInvoice.LinkedPayments();

所有链接都需要进行连接、移除、替换,并了解父对象和子对象。
Linked Interface 提供了接口,以便能够以标准化方式执行这些操作。

注意:这里显示的是 *Linked Interface* 的功能,类的特性可能会更多或不同。

简化编码

  • POOV 已经拥有许多在其功能中定义良好且定义明确的方法和功能,可以用于任何软件开发,不再需要其他。
  • POOV 还拥有定义明确的区域和子区域专业化代码结构。
  • 允许创建专业化和可重用的代码*代码片段*。

一个*代码片段*是可重用的一段代码。
POOV 提倡使用*代码片段*,并定义了其中许多,以便他们能够生成基于先前测试过的代码块的解决方案。

POOV 对每个链接以及将提供功能的*代码片段*进行建模和规范。
因此,Cliente(客户)类将使用一个 CCB *代码片段*进行编码,该代码片段将添加 3 个*属性* Str *代码片段*、一个 CCH *代码片段*、另一个 CSP 和一个 RSP *代码片段*。

例如,要对 Factura(发票)和 Partida(项目)之间的链接进行编码,将

  1. *代码片段* CCB 用于构建 Invoice 类(持久性功能)。
  2. 属性的*代码片段*(DateTime、Int、Curr、Str 等)用于为 Invoice 添加每个特性。
  3. 步骤 1 和 2 重复,但用于编码 Item 类。
  4. 在 Invoice 类的 Links Region 中,插入 RCP *代码片段*,它链接到 Item 类。
  5. 在 Item 类的 Links Region 中,插入 RCH *代码片段*,它链接到 Invoice 类。

就完成了。

C# 中 Visual Studio 的字符串属性*代码片段*示例。

	/// <summary>
	/// Obtiene o establece $Descripcion$
	/// </summary>
        public string $PropertyName$
        {
            get
            {
                if (this.cObj.IsNull["$MPName$"])
                { return string.Empty; }
                else
                { return (string)this.cObj["$MPName$"]; }
            }
            set
            {
                // if (value.Equals(string.Empty)) throw new Exception("El valor de $PropertyName$ no puede ser cadena nula.");
                if (value.Length > $Length$) { throw new Exception("$PropertyName$ debe tener un máximo de $Length$ caracteres."); }
                this.cObj["$MPName$"] = value;
            }

            // ToDo Copie y cotre la siguiente línea y péguela la región "Propiedades" del método Initializes.
            lTpObj.Add(MIRA.Data.Property.NewObject(lTpObj, "$MPName$", "$FieldName$", typeof(System.String), $Length$));

            // ToDo Copie y cotre la siguiente linea y péguela en la Interfaz de la clase.
            string $PropertyName$ { get; set; }

            // ToDo Copie y cotre la siguiente linea y péguela en el método Get.
            pData.$PropertyName$ = this.$PropertyName$;

            // ToDo Copie y cotre la siguiente linea y péguela en el método Set.
            this.$PropertyName$ = pData.$PropertyName$;

        }

使用 POOV 生成代码就是连接*代码片段*,这些*代码片段*已经在多个开发中进行了测试。
最终可以附加到一个应用程序模型,该模型健壮、稳定且无缺陷。

易于维护

由于 POOV 具有定义明确且分为区域和子区域的结构,任何更改、改进或缺陷都可以完全定位,并估算其影响。
 

这使得维护和生成新版本更加容易。

遵守截止日期和成本效益

由于 POOV 通过组装部件生成代码,并且模型中的所有部件都已定义,因此可以准确量化

  • 编码时间。
  • 成本。
  • 进度。
  • 更改。

减少故障和风险

使用经过验证的*代码片段*进行编码,代码中的故障风险降低;并且由于在 POOV 分析实践下,模型由客户和开发人员验证,因此不准确和误解的风险降低,从而生成有效的应用程序来满足需求。

POOV 是一种非常有用的编程技术,可以帮助开发出更好的代码。

PPT 文档(西班牙语)https://1drv.ms/p/s!Aotgp_wzjDaZgawTGcq8poOY3newaA

联系方式:capacita@poov.mx  

© . All rights reserved.