Sorry Dont mean to be a dick but i gotta be #393

Closed
ghost opened this Issue Mar 24, 2013 · 16 comments

Comments

Projects
None yet
8 participants
@ghost

ghost commented Mar 24, 2013

RAC is the most tightly coupled bullshit I have ever seen and provides no benefit I can see. Sorry. This is exactly the kind of DICK framework that would come from C# and Microsoft.

Its stupid.

@ghost ghost closed this Mar 24, 2013

@dannygreg

This comment has been minimized.

Show comment
Hide comment
@dannygreg

dannygreg Mar 24, 2013

Member

What exactly did you not like? Which parts are tightly coupled?

I feel we have already documented the benefits of the framework well, however if you still don't understand them I recommend you read around the topic of Functional Reactive Programming. It essentially boils down to reducing the complexity of programs by minimising state.

This is exactly the kind of DICK framework that would come from C# and Microsoft.

For what it's worth, Microsoft have been doing fantastic work in this area of computer science of late. Their ReactiveExtensions framework is excellent.

Have you got any constructive feedback for us? As opposed to just abuse that is.

Member

dannygreg commented Mar 24, 2013

What exactly did you not like? Which parts are tightly coupled?

I feel we have already documented the benefits of the framework well, however if you still don't understand them I recommend you read around the topic of Functional Reactive Programming. It essentially boils down to reducing the complexity of programs by minimising state.

This is exactly the kind of DICK framework that would come from C# and Microsoft.

For what it's worth, Microsoft have been doing fantastic work in this area of computer science of late. Their ReactiveExtensions framework is excellent.

Have you got any constructive feedback for us? As opposed to just abuse that is.

@seivan

This comment has been minimized.

Show comment
Hide comment
@seivan

seivan Mar 24, 2013

I think the value relies in

Signals can also be used to derive state, which is a key component of FRP. Instead of observing properties and setting other properties in response to the new values, RAC makes it possible to express properties in terms of signals and operations:

That's a very common thing to do, observing a property, and taking action on change. It mostly boils down to a matter of taste, in this case you don't like this particular flavour, no need to be an ass about it when expressing your distaste in the RAC flavour (it sorta tastes like BBQ :-)

seivan commented Mar 24, 2013

I think the value relies in

Signals can also be used to derive state, which is a key component of FRP. Instead of observing properties and setting other properties in response to the new values, RAC makes it possible to express properties in terms of signals and operations:

That's a very common thing to do, observing a property, and taking action on change. It mostly boils down to a matter of taste, in this case you don't like this particular flavour, no need to be an ass about it when expressing your distaste in the RAC flavour (it sorta tastes like BBQ :-)

@croath

This comment has been minimized.

Show comment
Hide comment
@croath

croath Dec 13, 2013

Contributor

So sorry to reply here but i am not here to abuse like bullshit or anything like that...

The real truth is : The learning costs of the project made me crazy.

I have got a new project which uses lots of this framework, and I need to add some features to the App. Then the headache came: I read the code and found the way to add a feature is very easy, adding a viewcontroller, get something from some storage instance...BUT here, everytime I found I just need a very simple NSArray from an async thread, the method/function I found to do that thing returns a RACSignal* or RACSubject or something like that...Okay I will get into what did other programmers do...Oh my...:

what's createSignal?
what's sendNext?
what's sendComplete?
replayLazily?
return?
subscribe?
RACStream?
flattenMap?
requence?
reduce?

......

Then I open the ReactiveCocoa's page and start reading documents...
I can't remember what all the methods mean in a short time!

Always facing problems such as: "oh there is a signal ... and another signal... oh 5 blocks created by that signals... oh what's the combineLatest mean why not just appending the array but using a combining function?...okay go to the doc and go back... which block I am in??? ok restart reading from the very beginning..."

I don't know what the real problem is, but I do not know how to handle the framework. I feel I really don't like it.

Contributor

croath commented Dec 13, 2013

So sorry to reply here but i am not here to abuse like bullshit or anything like that...

The real truth is : The learning costs of the project made me crazy.

I have got a new project which uses lots of this framework, and I need to add some features to the App. Then the headache came: I read the code and found the way to add a feature is very easy, adding a viewcontroller, get something from some storage instance...BUT here, everytime I found I just need a very simple NSArray from an async thread, the method/function I found to do that thing returns a RACSignal* or RACSubject or something like that...Okay I will get into what did other programmers do...Oh my...:

what's createSignal?
what's sendNext?
what's sendComplete?
replayLazily?
return?
subscribe?
RACStream?
flattenMap?
requence?
reduce?

......

Then I open the ReactiveCocoa's page and start reading documents...
I can't remember what all the methods mean in a short time!

Always facing problems such as: "oh there is a signal ... and another signal... oh 5 blocks created by that signals... oh what's the combineLatest mean why not just appending the array but using a combining function?...okay go to the doc and go back... which block I am in??? ok restart reading from the very beginning..."

I don't know what the real problem is, but I do not know how to handle the framework. I feel I really don't like it.

@notxcain

This comment has been minimized.

Show comment
Hide comment
@notxcain

notxcain Dec 13, 2013

Lo!. RAC is the greatest breakthrough in Cocoa app design evolution. Sorry for you that you can't understand it.

Lo!. RAC is the greatest breakthrough in Cocoa app design evolution. Sorry for you that you can't understand it.

@croath

This comment has been minimized.

Show comment
Hide comment
@croath

croath Dec 13, 2013

Contributor

@denis-mikhaylov I can understand it, I don't like it after all. The recursive blocks make me confused.

Contributor

croath commented Dec 13, 2013

@denis-mikhaylov I can understand it, I don't like it after all. The recursive blocks make me confused.

@notxcain

This comment has been minimized.

Show comment
Hide comment
@notxcain

notxcain Dec 13, 2013

Where are they recursive?

Where are they recursive?

@notxcain

This comment has been minimized.

Show comment
Hide comment
@notxcain

notxcain Dec 13, 2013

@croath My previous answer was not for you actually. It was for the hysterical topic starter :rage4:

@croath My previous answer was not for you actually. It was for the hysterical topic starter :rage4:

@Coneko

This comment has been minimized.

Show comment
Hide comment
@Coneko

Coneko Dec 13, 2013

Member

@croath We try very hard to make it as easy to pick up and use as something this different from imperative programming can be, but since we all have some familiarity with FRP and related concepts it's sometimes difficult for us to have the right perspective. We appreciate any kind of feedback: feel free to open issues if you encounter problems using RAC, debugging code written with it or if the documentation is unclear about something.

BUT here, everytime I found I just need a very simple NSArray from an async thread, the method/function I found to do that thing returns a RACSignal * or RACSubject or something like that

Objective-C's type system is too inexpressive to properly describe signals (see #732). This is a very big problem when someone needs to use RAC code someone else has written.

I think in general we haven't considered the case of indirect RAC users often enough: users of framework written with RAC that don't use RAC themselves.

Member

Coneko commented Dec 13, 2013

@croath We try very hard to make it as easy to pick up and use as something this different from imperative programming can be, but since we all have some familiarity with FRP and related concepts it's sometimes difficult for us to have the right perspective. We appreciate any kind of feedback: feel free to open issues if you encounter problems using RAC, debugging code written with it or if the documentation is unclear about something.

BUT here, everytime I found I just need a very simple NSArray from an async thread, the method/function I found to do that thing returns a RACSignal * or RACSubject or something like that

Objective-C's type system is too inexpressive to properly describe signals (see #732). This is a very big problem when someone needs to use RAC code someone else has written.

I think in general we haven't considered the case of indirect RAC users often enough: users of framework written with RAC that don't use RAC themselves.

@croath

This comment has been minimized.

Show comment
Hide comment
@croath

croath Dec 13, 2013

Contributor

@denis-mikhaylov @Coneko Thanks a lot for your help.

Sorry for my improper expression, what I mean is 'nested' but not 'recursive'.

for example I need an array of full data:

  1. I need to call server API A to get a simple list
  2. call server API B and C serveral times to get the full data of some elements I need in the list
  3. fill the full data to the original list in 1st step

Then I saw code like that:

- (RACSignal*) getElementById:(NSString*)eId{
//things to do there : a RACSignal instance...get things from API B or Cafter a subscribe calling then a 'replayLazily' call...the some RACSignal sendnext/sendComplete/donext fuctions (what I mean Nested is
}
- (RACSignal*) getElementByIds:(NSArray*) idArray{
// call API A to get the list using a signal instance
//another signal here...and calling '[[elements sequence] map:...]' 'getElementById:'(Nested
//then fill the array using 'subscribeNext'...
// a 'subscribeOn' method to figure out the thread to schedule on finally
}

Will u be confused or not? All I see were lots of RAC apis nested and nested with many and many brackets and blocks.
And after all these steps done, I got a RACSignal * return type, and I have to do the same subscribe or some works to get my array.

And during the operations, although I got things done, I didn't know something about the logic in the RAC beacause I copied code from other similar method for the reason I didn't wanna break things.Such as:

I use flattenMap: ,why not just use map:?...
And so many questions here that I should check all the documents to get the answer.

And then I remember from the beginning I just wanna a very simple array with some simple opreations. But to adapt to former programmers code, I feel like being inhaled in a black hole :(

Contributor

croath commented Dec 13, 2013

@denis-mikhaylov @Coneko Thanks a lot for your help.

Sorry for my improper expression, what I mean is 'nested' but not 'recursive'.

for example I need an array of full data:

  1. I need to call server API A to get a simple list
  2. call server API B and C serveral times to get the full data of some elements I need in the list
  3. fill the full data to the original list in 1st step

Then I saw code like that:

- (RACSignal*) getElementById:(NSString*)eId{
//things to do there : a RACSignal instance...get things from API B or Cafter a subscribe calling then a 'replayLazily' call...the some RACSignal sendnext/sendComplete/donext fuctions (what I mean Nested is
}
- (RACSignal*) getElementByIds:(NSArray*) idArray{
// call API A to get the list using a signal instance
//another signal here...and calling '[[elements sequence] map:...]' 'getElementById:'(Nested
//then fill the array using 'subscribeNext'...
// a 'subscribeOn' method to figure out the thread to schedule on finally
}

Will u be confused or not? All I see were lots of RAC apis nested and nested with many and many brackets and blocks.
And after all these steps done, I got a RACSignal * return type, and I have to do the same subscribe or some works to get my array.

And during the operations, although I got things done, I didn't know something about the logic in the RAC beacause I copied code from other similar method for the reason I didn't wanna break things.Such as:

I use flattenMap: ,why not just use map:?...
And so many questions here that I should check all the documents to get the answer.

And then I remember from the beginning I just wanna a very simple array with some simple opreations. But to adapt to former programmers code, I feel like being inhaled in a black hole :(

@croath

This comment has been minimized.

Show comment
Hide comment
@croath

croath Dec 13, 2013

Contributor

It feels like...yeah ReactiveCocoa is good, but looks like a dialect or DSL-like language, encapsulating everthing. Is that right to leave these complex code to others?

Contributor

croath commented Dec 13, 2013

It feels like...yeah ReactiveCocoa is good, but looks like a dialect or DSL-like language, encapsulating everthing. Is that right to leave these complex code to others?

@joshaber

This comment has been minimized.

Show comment
Hide comment
@joshaber

joshaber Dec 13, 2013

Member

@croath RAC code certainly has a learning curve to it. We try to lessen it as much as we can, but a lot of it is unavoidable. It is, unapologetically, a different way of writing code.

We're always happy to answer questions, so feel free to open new issues with whatever questions you have.

Member

joshaber commented Dec 13, 2013

@croath RAC code certainly has a learning curve to it. We try to lessen it as much as we can, but a lot of it is unavoidable. It is, unapologetically, a different way of writing code.

We're always happy to answer questions, so feel free to open new issues with whatever questions you have.

@kastiglione

This comment has been minimized.

Show comment
Hide comment
@kastiglione

kastiglione Dec 13, 2013

Member

@croath You'll need to choose between learning ReactiveCocoa, or ditching most or all of the code that uses ReactiveCocoa. As pointed out, there is a learning curve, and in all honesty, you need to be motivated to learn RAC in order to be successful with it. You may not be able to learn it in a "short time", but you can learn it quicker by asking questions, the community is dedicated and helpful.

Member

kastiglione commented Dec 13, 2013

@croath You'll need to choose between learning ReactiveCocoa, or ditching most or all of the code that uses ReactiveCocoa. As pointed out, there is a learning curve, and in all honesty, you need to be motivated to learn RAC in order to be successful with it. You may not be able to learn it in a "short time", but you can learn it quicker by asking questions, the community is dedicated and helpful.

@croath

This comment has been minimized.

Show comment
Hide comment
@croath

croath Dec 14, 2013

Contributor

Thanks a lot for your help and encouragement.

I think I will get enrolled into the community soon. After learning the whole framework maybe I would have a new impression of RAC.

Thanks, all, again :)

Contributor

croath commented Dec 14, 2013

Thanks a lot for your help and encouragement.

I think I will get enrolled into the community soon. After learning the whole framework maybe I would have a new impression of RAC.

Thanks, all, again :)

@jspahrsummers

This comment has been minimized.

Show comment
Hide comment
@jspahrsummers

jspahrsummers Mar 25, 2014

Member

/cc #392 for the lulz

Member

jspahrsummers commented Mar 25, 2014

/cc #392 for the lulz

@kastiglione

This comment has been minimized.

Show comment
Hide comment
Member

kastiglione commented Mar 25, 2014

🎂

@notxcain

This comment has been minimized.

Show comment
Hide comment
@notxcain

notxcain Mar 25, 2014

Let it be official I hate RAC thread ;)

Let it be official I hate RAC thread ;)

This issue was closed.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment