JavaScript libraries in the same space (UI widgets) use two different approaches for instantiating components:
Literal strings to specify types, and inlining as much as possible, for example:
var oTable = webix.ui({ view: "datatable", columns: [ { id: "rank", header: "", css:"rank", width: 50 }, { id: "title", header: "Film title", width: 200 }, { id: "year", header: "Released", width: 80 }, { id: "votes", header: "Votes", width: 100 } ], autoheight: true, autowidth: true, data: tableData });
A complex class hierarchy and passing objects instead of strings:
var oTable = new sap.ui.table.Table({ title: "Movies", }); oTable.addColumn(new sap.ui.table.Column({ label: new sap.ui.commons.Label({text: "Film title"}), template: new sap.ui.commons.TextField().bindProperty("value", "title"), sortProperty: "title", filterProperty: "title", width: "200px" })); oTable.addColumn(new sap.ui.table.Column({ label: new sap.ui.commons.Label({text: "Released"}), template: new sap.ui.commons.TextField().bindProperty("value", "released"), sortProperty: "released", filterProperty: "released", width: "80px" })); oTable.addColumn(new sap.ui.table.Column({ label: new sap.ui.commons.Label({text: "Votes"}), template: new sap.ui.commons.TextField().bindProperty("value", "votes"), sortProperty: "votes", filterProperty: "votes", width: "100px" })); // add the other columns... var oModel = new sap.ui.model.json.JSONModel(); oModel.setData({modelData: tableData}); oTable.setModel(oModel); oTable.bindRows("/modelData");
In both cases, tableData
is a plain JSON array, so no differences there:
[
{ id: 1, title: "Shawshank Redemption", year: 1994, votes: 678790, rank: 1 },
{ id: 2, title: "The Godfather", year: 1972, votes: 511495, rank: 2 }
]
What are the advantages and disadvantages of these two approaches, in terms of learning curve, maintainability, avoidance of antipatterns, reusability, and other software engineering best practices?