FunctionalAndroidReference
所属分类:Kotlin编程
开发工具:kotlin
文件大小:253KB
下载次数:0
上传日期:2019-08-05 08:54:54
上 传 者:
sh-1993
说明: 展示Android上使用RxJava的功能 React编程项目。
(Showcase project of Functional Reactive Programming on Android, using RxJava.)
文件列表:
.travis.yml (613, 2019-08-05)
LICENSE.md (861, 2019-08-05)
app (0, 2019-08-05)
app\build.gradle (2950, 2019-08-05)
app\proguard-rules.pro (675, 2019-08-05)
app\src (0, 2019-08-05)
app\src\main (0, 2019-08-05)
app\src\main\AndroidManifest.xml (1924, 2019-08-05)
app\src\main\java (0, 2019-08-05)
app\src\main\java\com (0, 2019-08-05)
app\src\main\java\com\pacoworks (0, 2019-08-05)
app\src\main\java\com\pacoworks\dereference (0, 2019-08-05)
app\src\main\java\com\pacoworks\dereference\features (0, 2019-08-05)
app\src\main\java\com\pacoworks\dereference\features\cache (0, 2019-08-05)
app\src\main\java\com\pacoworks\dereference\features\cache\CacheScreen.java (7692, 2019-08-05)
app\src\main\java\com\pacoworks\dereference\features\draganddrop (0, 2019-08-05)
app\src\main\java\com\pacoworks\dereference\features\draganddrop\DragAndDropScreen.java (3726, 2019-08-05)
app\src\main\java\com\pacoworks\dereference\features\global (0, 2019-08-05)
app\src\main\java\com\pacoworks\dereference\features\global\BaseController.java (5685, 2019-08-05)
app\src\main\java\com\pacoworks\dereference\features\global\DereferenceApplication.java (1419, 2019-08-05)
app\src\main\java\com\pacoworks\dereference\features\global\Injector.java (2888, 2019-08-05)
app\src\main\java\com\pacoworks\dereference\features\global\MainActivity.java (6440, 2019-08-05)
app\src\main\java\com\pacoworks\dereference\features\global\MainNavigator.java (4727, 2019-08-05)
app\src\main\java\com\pacoworks\dereference\features\global\MainOrchestrator.java (1219, 2019-08-05)
app\src\main\java\com\pacoworks\dereference\features\home (0, 2019-08-05)
app\src\main\java\com\pacoworks\dereference\features\home\HomeScreen.java (6301, 2019-08-05)
app\src\main\java\com\pacoworks\dereference\features\list (0, 2019-08-05)
app\src\main\java\com\pacoworks\dereference\features\list\ListExampleAdapter.java (3223, 2019-08-05)
app\src\main\java\com\pacoworks\dereference\features\list\ListExampleVH.java (1636, 2019-08-05)
app\src\main\java\com\pacoworks\dereference\features\list\ListScreen.java (5256, 2019-08-05)
app\src\main\java\com\pacoworks\dereference\features\pagination (0, 2019-08-05)
app\src\main\java\com\pacoworks\dereference\features\pagination\PaginationScreen.java (4284, 2019-08-05)
app\src\main\java\com\pacoworks\dereference\features\rotation (0, 2019-08-05)
app\src\main\java\com\pacoworks\dereference\features\rotation\RotationScreen.java (4293, 2019-08-05)
app\src\main\java\com\pacoworks\dereference\widgets (0, 2019-08-05)
... ...
# FunctionalAndroidReference
FunctionalAndroidReference is a showcase project of Functional Reactive Programming on Android, using RxJava.
It's a companion app to the presentation ["Fully Reactive Apps"](https://speakerdeck.com/pakoito/fully-reactive-apps-extended) at Droidcon UK 2016.
[![Build Status](https://travis-ci.org/pakoito/FunctionalAndroidReference.svg?branch=master)](https://travis-ci.org/pakoito/FunctionalAndroidReference) [![codecov](https://codecov.io/gh/pakoito/FunctionalAndroidReference/branch/master/graph/badge.svg)](https://codecov.io/gh/pakoito/FunctionalAndroidReference)
It is not meant to be a canonical reference, but as an example of how far functional programming can be taken. It's also a collection of patterns and ideas about how to express use cases, business features, and UX on a FRP paradigm.
The project has multiple self-imposed limitations:
### Full separation between UI and business logic.
The project is split into several modules. Every module has its own README file.
#### app
The UI layer is written purely in Java 7 with Android dependencies.
It depends on all modules below.
#### liblogic
The business logic that controls the views. It doesn't contain any Android dependency.
It is written in Kotlin for convenience, but it could be rewritten in Java 7 with ease, although it will be a bit verbose without lambdas (see [retrolambda](https://github.com/orfjackal/retrolambda)).
It depends on the modules below.
#### libservices
Any network services, POJOs, and communications that aren't in the Android framework. Again, it's not dependent on any Android.
Written in Kotlin too.
It depends on the module below.
#### libcore
Helpers and common general types. No Android.
Written in Kotlin, with no Android dependencies.
### Pragmatically functional
* liblogic and libservices must contain as few classes as pragmatically possible. Favour functions instead.
* Every function must be written as an expression body.
* Every function must be as pure as possible.
* Every parameter in a function must be passed explicitly. No globals, no fields.
* Prefer encapsulating variables in closures rather than fields. If using fields, final fields will be mandated whenever possible.
* Collections must be immutable.
* No nullable types outside the UI and service layers.
* Use functional patterns like unions, laziness, or higher order functions, instead of classic OOP Gang of Four patterns.
### Fully reactive
The architecture is reminiscent of [Flux](https://facebook.github.io/flux/docs/overview.html), [Redux](http://redux.js.org/), or [Elm](https://guide.elm-lang.org/architecture/). This is no coincidence.
Every method in the **UI layer** is either:
* a stream/signal, represented by a method returning an `rx.Observable`.
* a new UI state: new text value, new element on a RecyclerView, show a dialog... represented by a void/`Unit` method.
Every function in the **business layer** is:
* a `rx.Subscription` encompassing all the behaviour for one or many use cases.
### Testable
Every use case must be accompanied of a test suite covering its complete behaviour.
### Moderately documented
Every public function must be documented.
Inlined comments only when intent isn't clear.
### No lifecycle
Separate the business logic from the Android lifecycle at the earliest layer possible.
### No magic
Avoid DI frameworks like Dagger, and hand-roll injection instead.
Avoid code generation outside Kotlin helpers.
## License
Copyright (c) pakoito 2016
The Apache Software License, Version 2.0
See LICENSE.md
近期下载者:
相关文件:
收藏者: