X36OBP - Semestrální práce
Zadání
Jednoduchá knihovna pro zpracování tabulkových dat
Cílem práce je navrhnout a implementovat jednoduchou knihovnu pro čtení, manipulaci a zápis tabulkových dat (ve smyslu aplikací typu tabulkový kalkulátor).
Datový model by měl podporovat různé typy buněk (číslo, řetězec, vzorec) a poskytovat jednoduché API pro manipulaci. Knihovna by měla postytovat API pro psaní importních a exportních modulů pro různé formáty (formát CSV bude použit jako demonstrace takovéhoto modulu).
Tým
- Martin Plicka - plickm1<pečenáč>fel<tečka>cvut<tečka>cz
- Pavel Andrejs - andrep1<pečenáč>fel<tečka>cvut<tečka>cz
- Jan Skalický - skalij2<pečenáč>fel<tečka>cvut<tečka>cz
- Filip Šimek - simekf1<pečenáč>fel<tečka>cvut<tečka>cz
Návod
Výchozí image
ČVUT SmallTalk/X 5.2.8 dostupný z http://cellstore.felk.cvut.cz/wiki/DownloadSmalltalkX
Potřebné balíčky
Není potřeba instalovat žádné další balíčky
Postup instalace
Proveďte FileIn dodaných souborů do vašeho image. Jelikož nejsou vyexportované soubory řazeny v pořadí, v jakém musí být importovány, provádějte FileIn tak dlouho, než dojde k bezproblémovému importu. Importované třídy naleznete v kategorii obp-SpreadSheet. Všechny změny se importují jako projekt SpreadSheet::all.
Ukázkový kód
sheet := SpreadSheet new. "simply append rows" sheet appendRow: #(1 2 3 4). sheet appendRow: #(1 2 3). "build expression = 3 + (2 * A1)" "current table 1 2 3 4 1 2 3 nil " "expression tree" branch := ExprBinTimes with: 2 with: (CellReference newAtRow: 1 column: 1 atSheet: sheet). "CellExpression object must be on the top of the tree" expr := CellExpression with: (ExprBinPlus with: 3 with: branch). "put it into table" sheet cellAtRow: 3 column: 1 put: expr. Transcript show: ((sheet cellAtRow: 3 column: 1)value); cr. "create reference range" ref:= CellReferenceRange newFromR: 1 C: 1 toR:2 C:4 atSheet: sheet. "place into function" func:= ExprFunSum with: ref. "put it into table" sheet cellAtRow: 3 column: 2 put: (CellExpression with: func). "show it" Transcript show: ((sheet cellAtRow: 3 column:2) value);cr. "now we can insert row between 1st and 2nd row, all references and ranges must be reindexed" sheet insertRow: #(1 2 3 4 5 6) at: 2. "cell with function was moved down" Transcript show: ((sheet cellAtRow: 4 column:2) value);cr. "any cell export for future export modules" Transcript show:((sheet cellAtRow: 4 column:2) asString); cr. "iterating rows or cells" sheet rowsDo:[:x| x do: [:y| Transcript show: (y value). Transcript show: ' '.]. Transcript cr.]. "export it" exporter:= SpreadSheetExporterCSV newWithFile: 'testfile'. exporter export: sheet. "import it" importer:=SpreadSheetImporterCSV newWithFile: 'testfile'. sheet2:= importer import. "show it" sheet2 rowsDo:[:x| Transcript show: x; cr.]. "delete the file" 'testfile' asFilename delete.
Seznam tříd
s popisem odpovědností
Třída | Popis |
---|---|
AbstractTable | Abstraktní třída vnitřní implementace tabulky. Poskytuje interface definující potřebné metody. |
ArrayedTable | Implementace vnitřní struktury tabulky pomocí dynamických polí. |
ArrayedTableRow | Představuje jeden řádek vnitřní struktury tabulky ArrayedTable. |
ArrayedTableTests | TestCase |
CellEmpty | Prázdná buňka (pro účely exportu, hodnotu exportér určí podle potřeby). |
CellExpression | Buňka obsahující výraz. Výraz je strom složený z objektů typu Expr*. Může obsahovat konstanty, reference na buňky, operátory a funkce. |
CellReference | Objekt představující referenci na nějakou buňku uvnitř některého sheetu. |
CellReferenceRange | Představuje referenci na rozsah buněk uvnitř nějakého sheetu. Umožňuje iterovat přes všechny odkazované buňky nebo přes řádky výběru. |
CellReferenceTests | TestCase |
CellUndefined | Objekt pro nedefinovanou hodnotu (např. při chybě výpočtu). |
ExprFunction | Předek pro třídy funkcí. |
ExprFunSum | Funkce suma. Je-li argumentem CellReferenceRange, pak sečte hodnoty všech odkazovaných buněk. Jinak posílá argumentu zprávu sum. |
ExprOperator | Předek pro třídy operátorů. |
ExprBinOperator | Obecný binární operátor, rozšiřuje ExprOperator o levý a pravý operand. |
ExprUnOperator | Obecný unární operátor, rozšiřuje ExprOperator o jeden operand. |
ExprBinMinus ExprBinOver ExprBinPlus ExprBinTimes | Binární operátory: - / + *. S čísly provádějí obvyklé aritmetické operace, pro jiné datové typy operandů mohou mít jiné chování. |
ExprUnNegation | Unární operátor - |
ExpressionTests | TestCase |
OperatorTests | TestCase |
RecursiveDefinitionError | Nová chyba oznamující rekurzivní výpočet kvůli špatné definici odkazů na buňky. |
SpreadSheet | Třída zahrnující celou tabulku. Obsahuje jednak jednu z implementací tabulky, tak nástroje pro oznamování reindexace adres pro objekty CellReference. Objekt představující reprezentaci dat je možno vyměnit za jiného potomka třídy AbstractTable. |
SpreadSheetExporter | Abstraktní třída poskytující inteface pro implementaci exportních funkcí. |
SpreadSheetExporterCSV | Exporter jednoho Sheetu do CSV. |
SpreadSheetExporterCSVTests | TestCase |
SpreadSheetImporter | Abstraktní třída s interface pro importní moduly. |
SpreadSheetImporterCSV | Importer z CSV. |
SpreadSheetImporterCSVTests | TestCase |
SpreadSheetTests | TestCase |
Object Collection Number Integer String Date Time | Modifikace základních tříd poskytují metody pro export, a vzájemné převody při operacích ve vzorcích tabulky. |
Použité návrhové vzory
a třídy, které je implementují
Návrhový vzor | Seznam implementujících tříd |
---|---|
Bridge | SpreadSheet + AbstractTable a potomci - různá implementace vnitřní struktury tabulky. |
Composite | CellExpression + ExprOperator a potomci - konstrukce vzorců. |
Decorator | SpreadSheet + AbstractTable a potomci - SpreadSheet poskytuje komplexnější akce s tabulkou jako konkrétní volání zobecněných metod vnitřní implementace. |
Double dispatch | Binární operátory - levý operand dostane požadavek na operaci, přepošle ho pravému a zároveň specifikuje svůj typ. |
Iterator | CellReferenceRange, SpreadSheet, AbstractTable a potomci. |
Observer | SpreadSheet + CellReference, CellReferenceRange (jako observer) - Oznámení o změně indexů buněk |
Test-Cases
Test-Case | Seznam testovaných tříd |
---|---|
ArrayedTableTests | AbstractTable - některé zděděné metody ArrayedTable ArrayedTableRow |
CellReferenceTests | CellReference + test detekce rekurzivni definice CellReferenceRange SpreadSheet - test observeru |
ExpressionTests | Expr*, CellExpression - výpočet hodnot ze stromů výrazů, test sumy z CellReferenceRange |
OperatorTests | metody přidané k typům Date, Integer, Number, Time, String při různých kombinacích operandů |
SpreadSheetExporterCSVTests | SpreadSheetExporterCSV |
SpreadSheetImporterCSVTests | SpreadSheetImporterCSV |
SpreadSheetTests | SpreadSheet |
Poznámky
Hlavní třída SpreadSheet, ačkoli tomu název moc nenapovídá, představuje pouze jednu tabulku. Pro sestavení sešitu ala Calc nebo Excel stačí vkládat do kolekcí. Reference fungují bez problémů mezi více objekty SpreadSheet.