TE
TechEcho
Home24h TopNewestBestAskShowJobs
GitHubTwitter
Home

TechEcho

A tech news platform built with Next.js, providing global tech news and discussions.

GitHubTwitter

Home

HomeNewestBestAskShowJobs

Resources

HackerNews APIOriginal HackerNewsNext.js

© 2025 TechEcho. All rights reserved.

MVC is dead, it's time to MOVE on

487 pointsby cirwinalmost 13 years ago

72 comments

scramealmost 13 years ago
This sure looks like MVC, but they call the Controller "operations".<p>The MVC abstraction has an issue with web applications, since the request-response cycle doesn't provide feedback as directly as the hardware-monitor-software cycle that the pattern was originally designed around.<p>However, if the problem is that you are putting too much "logic" into your controllers, you should probably find a better place for it.<p>In Java/Spring-MVC, there is a typical class hierarchy of Controller -&#62; Manager/Service -&#62; DAO. The extra level of indirection is a very handy place to put business logic, then each class in the tier has a dedicated function:<p><pre><code> Controller -- Parses input, delegates the action and returns the response (rendered by the view). Manager -- Handles sanitized data, encapsulates business logic and makes calls into the Model / Data layer. DAO -- Interfaces with the data store, makes sure only good data goes in, and appropriate responses are returned. </code></pre> This approach doesn't seem to offer anything more than that, except for putting a label on the messaging between subsystems, but those operations are not well defined (at least in this piece), and seem like another nebulous way to bury logic.<p>It seems like this problem has arisen from a rather narrow reading of what an MVC system should be, as in, not having utility libraries because they aren't strictly an M a V or a C.<p>*edit: formatting.
评论 #4190784 未加载
评论 #4191101 未加载
评论 #4190567 未加载
评论 #4194859 未加载
nicholassmithalmost 13 years ago
You know it's nice reading a criticism of something that has an alternative solution offered rather than just going "hey MVC is terrible and you're an idiot for using it".<p>I do however think there's still great benefits to MVC, if you're shovelling code into controllers and can't make it work like it should then MVC is not the right design pattern for the project. Like every other pattern it'll only work when it works, but MOVE sounds like an interesting addition that I might have a play with.
评论 #4190096 未加载
评论 #4190336 未加载
评论 #4190036 未加载
评论 #4191745 未加载
jaaronalmost 13 years ago
MVC, more than other design patterns, is horribly abused. Developers should keep in mind its GUI roots. Here's my "is it MVC?" litmus test:<p>How much of my code survives if I drastically change the view?<p>For example, if I want to switch to a new desktop, web or text console interface, can I reuse much of the application? Of course, architecture changes this significantly (particularly web architecture), but still, if I cannot swap out the view, then I'm losing out on one of the significant advantages of an MVC architecture. One way to make sure this works is to start with 2 views from the beginning - the view you're actually going to ship, and a headless view for tests.
评论 #4190604 未加载
评论 #4190390 未加载
评论 #4193071 未加载
评论 #4190774 未加载
gueloalmost 13 years ago
The best practices I've seen for MVC apps isn't to put all the logic in the controllers. What you do is to create a "services" or "managers" layer that is called on by the controllers. A userService, for example, might have a function<p><pre><code> user = userService.login(name, password) </code></pre> It's also nice to abstract this service layer with some clean interfaces so that you can replace the underlying implementation, for example to move from MySQL to Memcached.<p>Using events for everything has appeal but my experience is that the added synchronicity problems creates unneeded complexity and makes reasoning through the logic and debugging hard.
评论 #4190215 未加载
评论 #4190495 未加载
评论 #4190501 未加载
评论 #4193090 未加载
Androsynthalmost 13 years ago
Are you talking about pure mvc's like sproutcore? faux mvc's like backbone? model2 patterns like rails and most other server side architectures? I think what you mean is 'Model2 is dead...'. MVC is great for any environment where the observer pattern can be implemented (eg web front-end).<p>The biggest problems I've seen in model 2 architectures is weak models. The side effect of this is everything gets stuffed in the controllers. This is understandable because there is no observer pattern and therefore the models don't have nearly the power they do in real MVC.<p>Heres a great explanation of the MVC[1]:<p><i>In a nutshell the classic MVC architecture work like this. There is a model that is at the heart of the whole thing. If the model changes, it notifies its observers that a change occurred. The view is the stuff you can see and the view observes the model. When the view is notified that the model has changed, the view changes its appearance. The user can interact with the view (e.g. clicking stuff) but the view doesn’t know what to do. So the view tells the controller what the user did and assumes the controller knows what to do. The controller appropriately changes the model. And around and around it goes.</i><p>[1] <a href="http://michaux.ca/articles/mvc-architecture-for-javascript-applications" rel="nofollow">http://michaux.ca/articles/mvc-architecture-for-javascript-a...</a>
评论 #4191071 未加载
评论 #4191241 未加载
alttabalmost 13 years ago
This is certainly interesting. I like the event based model. Here are my thoughts:<p>If your controllers are getting fat and spaghetti like, I wouldn't blame MVC. There are many patterns one can use that are compatible with MVC without going to a completely different architecture. For instance, if you need to encapsulate multi-model interaction you can create a presenter abstraction that the controller simply calls into. Just because there is a bunch of code that ends up in the controller because "you don't know where to put it" doesn't mean there isn't a better place to put it without re-designing the entire application.<p>Another thing is while I love the data-binding event deal, this really only works for client-side frameworks like Backbone. Server-side kinda goes at the window, but I suppose you could add a framework that piped event signals in the response from changes that occurred in the ORM layer (although this further couples components).<p>I'm not convinced that separating the data from the methods that operate is a great idea unless you want to go purely functional. Doing this clearly breaks encapsulation, throws any notion of OOP out the window, and still binds the "operations" too closely to the data. Generally speaking, the data is useless without the operations and vice versa.<p>So the real difference between MOVE and MVC, at least according to this article, is that models are no longer useful on their own, the controllers aka "operations" know everything about how to manipulate models (it shouldn't), and models generate events which are only consumed by views, which makes no sense if you wanted to use the model on its own (but you can't without your operations).<p>Generally speaking, the model should <i>MODEL</i> something. That includes data and behavior. Without both, you have a database, and a set of operations kinda like a C library but only because OOP hadn't been invented yet.<p>In my mind this further couples all of the components because it actually increases the reliance on each other for them to be useful.<p>MVC isn't dead. There is a good chance you are using it wrong. I highly suggest Rails Antipatterns. While it is specific to Rails, it works for MVC in general. <a href="http://www.amazon.com/Rails-AntiPatterns-Refactoring-Addison-Wesley-Professional/dp/0321604814" rel="nofollow">http://www.amazon.com/Rails-AntiPatterns-Refactoring-Addison...</a><p>edit: spelling
评论 #4190121 未加载
评论 #4190190 未加载
评论 #4190090 未加载
moealmost 13 years ago
It's amusing how the agile crowd slowly goes through the same learning curve that the java-guys rode 10 years ago.<p>That's a good thing, though. They're at the verge of rediscovering SOA now and there's hope this incarnation will be less plagued by IOC-fluff and boilerplate, simply because the involved people have more of a hacking and less of an engineering background.<p>I, for one, am looking forward to the "great shattering of Rails".
评论 #4190555 未加载
martianalmost 13 years ago
This pattern is fantastic.<p>We use a similar pattern that we internally call "Actions". An Action, in our parlance, is similar to the Command pattern from the Gang of Four. It can be invoked from anywhere and performs a single state change on a single model, or even multiple models (if several need to be updated at the same time, in the same transaction).<p>Separating Actions from Models was a huge step in writing readable code, and it's immediately clear what is happening in the system at any given time. Any Action can invoke any number of "child" actions, as well, to maintain encapsulation. For example: when a user registers on the site, we trigger a RegisterUser action, which in turn calls a CreateUser action and a LoginUser action.<p>Basically, we took any complicated method on our models and turned them into Action classes. Common concepts like database transactions, logging, event tracking, and so forth, can now be abstracted away, and don't need to be re-implemented in each model class. It's a huge productivity increase and a real win for software engineering.<p>I highly recommend this general approach to any large software system, and I'm grateful that we're all experimenting with things beyond MVC.
drostiealmost 13 years ago
If your controller has too much logic you should really consider putting more of it in your model and view.<p>Maybe I don't understand MVC, and you all can tell me How Wrong I Am, but here's how I understand MVC at present:<p>Your Model is a public API, a Service Gateway -- and it should do a couple of things in principle. The first is that it should be able to manage a list of subscribed view/controllers, and push updates out to them -- this was difficult with Web 2.0 but we're now moving to systems where this is considered normal. The second is that it should define a set of API commands which change that state and push out those subscriptions. That second bit is crucial, it's the difference between writing assembly and Python. If you have logic in your controller then it's probably because your model does not expose certain high-level concepts which your controller would use directly, so you're taking data from the model and building a higher-order model in your controller, before you operate on it.<p>It helps me to remember that in Smalltalk the idea was to always have &#60;view|controller&#62; pairs. They were always the same object split in two; each view had its own controller and vice versa. The controller is supposed to be input-oriented and the view is supposed to be output-oriented; the model says "hey, X changed" and the view updates what X looks like; the user clicks on X and the controller sends a signal to the view to change some more, the user erases X and the controller sends this request to the model, which will update the view when the request is complete.<p>Viewed this way it's really hard to see what the difference is supposed to be between MVC and MOVE. Clearly the messages in MVC are the Events in MOVE. Most of the controller logic has been pushed into the View, which should now handle input actions. Data cannot be dynamically pushed from the Model to the View because this is of course a Web 2.0 technology (pre-cometcasting, pre-websockets). The Operation sits in a grey area, implementing higher-order abstractions from the lower-order model.<p>Maybe we could do better with a hybrid, because the idea of decoupling subscriptions from the public API might actually be a good idea, in line with the Clojure philosophy that things should be de-complected into their simplest representations. But if I understand MVC right, then I don't see why you've got all your business logic in your controller. Heck, the View is supposed to be client-side, why isn't your Controller client side? Or if it is, and you have all this business logic in it, why are you trusting the client to do your business logic? Your gripes with MVC don't make sense to me.
评论 #4190625 未加载
评论 #4194285 未加载
kenperkinsalmost 13 years ago
I prefer the term "Services" over "Operations".<p>Services is where the logic of your application should live, and services should be HTTP (or any protocol) agnostic. They should only speak in models and native types, and should abstract all of your logic away from your controllers and models.<p>This leaves the controllers as a thin http handling layer that parses inputs and then lets the service handle the work.<p>The response from the service is then transformed appropriately (JSON, HTML, etc) and sent back to the caller.<p>Just my $0.02
评论 #4190050 未加载
Alexandervnalmost 13 years ago
Addy Osmani has a nice excercition [1] on the history of MVC in Developing Backbone.js Applications, where he states:<p>"Developers are sometimes surprised when they learn that the Observer pattern (nowadays commonly implemented as a Publish/Subscribe system) was included as a part of MVC's architecture decades ago. In Smalltalk-80's MVC, the View and Controller both observe the Model: anytime the Model changes, the Views react."<p>So, not really new actually.<p>[1]: <a href="http://addyosmani.github.com/backbone-fundamentals/#mvc" rel="nofollow">http://addyosmani.github.com/backbone-fundamentals/#mvc</a>
Erwinalmost 13 years ago
An interesting new pattern here (from the creator of MVC) is DCI: <a href="http://en.wikipedia.org/wiki/Data,_Context,_and_Interaction" rel="nofollow">http://en.wikipedia.org/wiki/Data,_Context,_and_Interaction</a><p>Essentially it's a way to move code where multiple objects collaborate to achieve something into its own separate class (Context). However when executing in a context, each involved object takes on a "Role" which grants its additional methods specific to this context.
评论 #4193883 未加载
zacharyvoasealmost 13 years ago
&#62; I don't wish to be misunderstood as implying that MVC is bad […] Since it was invented however, new programming techniques have become popular.<p>This doesn't make any sense to me.<p>The first problem is the blatant <i>argumentum ad populum</i>—just because other things are popular <i>right now</i> doesn't mean they're better.<p>The second problem is: I simply do not agree that we have new technologies that are so radically different and empowering from those that were available when MVC was invented. Indeed, Smalltalk (the language in which MVC was conceived) has late binding, dynamic typing and code blocks. I still think ‘modern’ scripting languages are playing catch-up with Smalltalk and LISP in terms of power, performance and clarity of expression.<p>Trygve Reenskaug (the inventor of MVC) later went on to develop DCI, a system which complements MVC, rather than replacing it wholesale. I'd recommend reading the Wikipedia page for more info, it's a coherent proposal and it seems to require the creation of far fewer classes and objects: <a href="http://en.wikipedia.org/wiki/Data,_context_and_interaction" rel="nofollow">http://en.wikipedia.org/wiki/Data,_context_and_interaction</a>
TylerEalmost 13 years ago
For the web, I find Lift's "View-First" setup much compelling, and easier.<p>The issue I have with traditional web-framework MVC is that it assumes that each URL associates with one controller, which I've found to be very straightjacket-esque. Often the pages I'm building have many separate bits of functionality present, from simple stuff like a login box, numerous widgets, and then the main thing the page is about.<p>In lift, each URL maps onto a view, which will contain the templating code for that page, including perhaps inheritance to pull in an overall template, and then will contain one or more (and perhaps MANY) snippet invocations.<p>A snippet in Lift is kind of sort of like a controller method. It takes the contents of it's template tag as input, and as output returns a transformed document tree, using what ever resources (models, web service calls, calling out to other classes, etc) it wants to do that.<p>If you write the snippets in a general way, binding text off of IDs, this allows you to get different outputs for the same data, depending on how you call the snippet - it's like passing a partial template in as a closure. Very different but powerful - the snippet handles the LOGIC, but only abstractly the templating.<p>It's a very powerful paradigm - it frees you from the MVC straightjacket, since you can arrange and organize your code however you like, but forces very strict separation of concerns - it forces you to compartmentalize your business logic, but doesn't force you to do it a certain way. Lift does really cool stuff with your xHTML/HTML5 templates too - it's truly operating on a server-side DOM tree, none of this is textual substitution.<p><a href="http://www.assembla.com/spaces/liftweb/wiki/Templates_and_Binding" rel="nofollow">http://www.assembla.com/spaces/liftweb/wiki/Templates_and_Bi...</a> for more info.
评论 #4191849 未加载
twelvechairsalmost 13 years ago
&#62; In a MOVE application models only wrap knowledge. That means that, in addition to getters and setters, they might contain functions that let you check "is this the user's password?", but they don't contain functions that let you save them to a database or upload them to an external API. That would be the job of an operation.<p>I cant understand the distinction between a 'setter' (stated here as part of the MOVE 'model') and 'functions that let you save... to a database or upload... to an external API' (stated here as part of the MOVE 'operations').<p>I would understand the logic a lot more if the 'model' excluded 'setters' entirely and just included 'queries' (which don't change the underlying data set) as opposed to 'commands'/'setters' (which do...). As it is I'm not sure where the line is between 'operations' and 'model' except for the use-cases that have been explicitly stated.
pkaleralmost 13 years ago
In the Objective-C/Cocoa world, Operations are encapsulated using the Receptionist Pattern. <a href="http://developer.apple.com/library/mac/#documentation/General/Conceptual/CocoaEncyclopedia/ReceptionistPattern/ReceptionistPattern.html" rel="nofollow">http://developer.apple.com/library/mac/#documentation/Genera...</a><p>And Events are handled with a combination of Key-Value Observing and UI binding. <a href="http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/KeyValueObserving/KeyValueObserving.html" rel="nofollow">http://developer.apple.com/library/mac/#documentation/Cocoa/...</a><p>Controllers still exist but the design of a program is easier to reason about if everything that mutates data is pulled out of the controller.<p>UI changes must be made on the main queue, but the above design helps pull out model changes, network requests, etc on to background queues.
Spearchuckeralmost 13 years ago
Interesting post.<p>I've spent the last few years on an piece of software where the model and controller must be reusable between desktop, phone and tablet.<p>I started with a layered approach. Then I moved to MVC. After that I discovered MVVM. I finally ended up with an MVVM/Naked Objects hybrid.<p>The result is views that make changes to the model via command bindings, and respond to changes in the model via event bindings. The application (aka controller) is similarly bound to the model, and contains all business logic. It's clean, easy to maintain, and easy to test against and debug.<p>The views are different for each platform (desktop, phone and tablet), the model and application are re-used as-is.<p>I guess my point is that none of these approaches (MVC/MVVM/MVP/etc.) are bad. Each is good within a pretty small scenario window. The trick, probably learnt through experience, is knowning when to use which.
vascoalmost 13 years ago
This looks like a really good way to stop putting all your messy code into Controllers and start putting it into Operations.<p>The problem with messy code or where it lives will not go away because you think about it differently, you just have to either hire better people or spend more time and money refactoring.
评论 #4189984 未加载
specialistalmost 13 years ago
There is no MVC.<p>A design pattern is a reusable solution to problem, given a certain context (set of constraints).<p>My design pattern study group iterated over the Gang of Four book 3 times, please many others. The MVC sessions were the least constructive.<p>No two people could agree on what is and isn't MVC.<p>Or MVP. No, you're not doing it right. Oh, MVC can only be done "correctly" using Smalltalk.<p>Yadda yadda yadda.<p>I can't even begin to discuss "MVC web frameworks". Huh? Methinks the only reason for "MVC" is to justify Spring, inversion of control, containers, dependency injection, annotations, and all that other useless enterprisey J2EE-esque shovelware.<p>I agree with jerf's statement (upthread) that devs should worry more about DRY than MVC.
评论 #4191711 未加载
评论 #4191858 未加载
tieTYTalmost 13 years ago
Is there something structured like hacker news that focuses on articles with content like this? I find this a lot more interesting than threads about entrepreneurship but I don't know where to go to read about things like this.
评论 #4191315 未加载
rickmbalmost 13 years ago
"you end up stuffing too much code into your controllers, because you don't know where else to put it"<p>And that wouldn't happen to have anything to do with the fact that "you" either don't know any other patterns or solutions besides MVC, or are under the impression that using MVC somehow forbids you to use other patterns?<p>Not to mention the fact that the definition of MVC that the author uses is false (in a way that describes MVC as more simplistic and limited than it truly is), but after so many years I'm not even going to argue with that any more. Just fucking Google it.<p>tl;dr: Those who cannot learn from history are doomed to repeat it.
评论 #4193096 未加载
pmbalmost 13 years ago
Show me the code. Before I believe this, I'll need to see a codebase that uses MOVE and not MVC and manages to do things which are not easy in MVC. It's find to rant and rail against old patterns, but patterns are <i>de</i>scriptive, not <i>pre</i>scriptive. Once you see a solution that has the same "shape" in a few different contexts, you might have found a pattern. This puts the cart before the horse by proposing the pattern before it has been actually used.
namankalmost 13 years ago
Umm...what?<p>What do you think helpers are in PHP MVC frameworks? They are code blocks that should not go in controllers but are required; like a password generator or reformatting for print command.<p>Go use Symfony to see how events and MVC mash up together. They do a good job in there.<p>Author's next post will be about including services for controllers/helpers/actions that are called more frequently. Once again, Mr. Author, check the PHP framework called Symfony.
jaybillalmost 13 years ago
I don't know. This is essentially saying that the way to solve problems is to add additional layers of abstraction. If you want to see a bunch of examples of why that's a bad idea, take a look at any J2EE application.<p>RAPHT (<a href="https://github.com/DanielWaterworth/Raphters/blob/master/RAPHT" rel="nofollow">https://github.com/DanielWaterworth/Raphters/blob/master/RAP...</a>) attempts to something similar (adding more layers of abstraction to MVC) but I have the same problem with that.<p>If we were really understood the problem we'd have come up with a way to make things simpler, not more complicated.<p>I think the real problem is that MVC is understood by different people to mean different things but they think they're talking about the SAME thing. Back end developers tend to think of the view layer as a trivial thing ("It's just HTML and Javascript! How hard can that be?") and front end developers tend to think of the model layer as trivial. ("Look, my backbone.js code is handing out and consuming JSON, how hard can it be to persist that?")
sakopovalmost 13 years ago
Isn't this what CQRS attempts to do?<p>[CQRS]: <a href="http://martinfowler.com/bliki/CQRS.html" rel="nofollow">http://martinfowler.com/bliki/CQRS.html</a>
评论 #4190092 未加载
stcredzeroalmost 13 years ago
I'm going to go out on a limb here.<p>With a pattern like MVC, where developers implement it again and again, and many of these are junior devs, it's highly likely that people who don't entirely understand the pattern are going to be adding code. The correct use of the pattern is going to get diluted, and certain classes are going to get overstuffed with code that often turns into spaghetti code.<p>I'm not so sure this is the fault of the junior developers. If there is one "obvious" place to expediently stuff code to implement new functionality then this is actually the fault of original designers. I don't know of any pattern for building applications that doesn't fall into this trap, but I think that one which escapes it is possible through some trick of code organization and programming language technology.
shadowmintalmost 13 years ago
meh.<p>Doesn't address any of the actual issues with writing an MVC web application.<p>MVC -&#62; Views are templates, Controllers are HTTP server end point bindings and Model is everything else.<p>Rookie mistake; put logic in controller actions. No! This is a terrible idea: your controller should never do more than: parse input, apply update to some model object, generate response view model.<p>'Model' does not mean 'Something that serializes and goes into a database'. It means everything else. The entire state and <i>associated classes that manipulate that state</i>. That's where these operations from MOVE exist.<p>I mean, if you want to critize MVC (especially some popular frameworks...), go for it, but I'd be much more interested to hear how a new approach addresses:<p>- What about all that javascript / flash / etc? Where does that fit in?<p>- How do you effectively test controllers and views?
Avalaxyalmost 13 years ago
The author probably never heard about the 'service layer' pattern. The problem that 'MOVE' is trying to solve is a non-existing one. If you're stuffing all your logic in your controller, you're doing it wrong. The logic should be in the service layer, that's how it has always been.
ap22213almost 13 years ago
I'm willing to try it out.<p>I usually get around the cited issues through dependency injection into the model. That is, instead of placing large amounts of logic in the controller, I let the model hold the logic.<p>In a naive implementation, this may couple the model to things it shouldn't be coupled to. So, to avoid the model coupling to infrastructure resources (say, storage), I let the controller inject those objects into the model, as needed.<p>But, I realize that that's an architect-y, OO kind of way to do it that requires some background knowledge which can may obfuscate the code. So, I'm all about making things easier for everyone.<p>As others have mentioned, it'd be useful to have a more sophisticated example.
jasimalmost 13 years ago
MVC is not dead. It has its warts, but there still is a strong developer community who build applications using MVC - through MVC based frameworks, and also by handrolling implementations that are an approximation of MVC. As long as there are enough people using it, MVC can't be pronounced 'dead'.<p>As to MOVE, the issue that the author points as the problem with Controllers in MVC is that'controllers are nice self-contained bits of.. what?'. At some point people will start asking these questions about 'Operations' and 'Events'. What would you classify as an 'event' vs an 'operation'. Some mature Rails projects that I've seen already uses this paradigm - there is an internal synchronous pub/sub event listener to which messages can be pushed by both the controller and the model. Even then, there is always a question of where to put what. Some answers are very clear - like an audit log which is only a side effect. But it is not the case always.<p>The author is trying to solve this 'classification' problem by giving us a more granular model. This can help to a certain degree - but there will be some point where even this wont help us. At that point we can choose go to a finer granularity, or ask the question whether all this extra organization is worth the hassle?<p>Abstractions are not without a cost. Some abstractions are too essential for any project. Some abstractions are nice to have. But all of them have a cost. In the case of MVC, the cost of the extra organization is paid many times over by the increased maintainability of the application. But given the number of components the MOVE paradigm advocates, I'm doubtful whether the added organization will be worth the cost.<p>I agree with what DHH said on a recent podcast - it is easy to talk about concepts in abstract and they can look really good. But what changes the game is a real implementation and being able to contrast the code 'before' the change and 'after' the change. This is not feasible all the time - some things have to go through the ideation and a slow testing phase. But at the least, I'm looking forward to see a non-trivial application that uses this paradigm. I'm ready to try imagining how it would have looked in MVC and decide whether the extra organization is worth it.
smoodyalmost 13 years ago
I've replaced MVC with VAM -- View-&#62;API-&#62;Model. I believe it's best to always code the "operations" layer as an API layer. The API always acts on models. Very similar to operations in MOVE, but it clarifies the goals of the layer.
beberleialmost 13 years ago
Very spot on explanation of what is circulating in my head for months now. This seems to relate to the Data-Context-Interaction movement and what Bob Martin calls Entity-Boundary-Interactor pattern in his latest talks.
armsalmost 13 years ago
I'd be interested to know what language(s) the author is using for these MOVE applications.<p>I primarily use PHP, and have gotten in the habit of using a service layer to handle business operations. I've found that it's worked extremely well, and so far does not seem restrictive. It's let me clean up my controllers and models quite nicely.<p>It's been awhile since I've used the RobotLegs Actionscript framework, but its 'implementation' of the MVC pattern seems awfully close to MOVE.<p>Overall, I think the author makes a good case of how to improve MVC application development, regardless of whether the name should change or not :)
semerdaalmost 13 years ago
MVC is nothing more then a pattern for component interactions allowing the separation of information. How you implement it is really up to the developer but this is the "starting" point for some and for many a guide.<p>Look at Django, it is often called MVT but yet it follows the MVC conventions. Maybe the language you are using is forcing you to add beef into your controllers hence the negative view of this pattern. But ultimately if your coding in Python you would be abstracting logic code out into your Models and Modules and only making references to them in the Controller.
rossjudsonalmost 13 years ago
The interesting part of this is the resemblance of hierarchical operations to Erlang supervisor hierarchies, without explicitly pointing that out. In fact, the whole thing feels kind of Actor-like.
modartsalmost 13 years ago
How is this different from MVVM? His "events" are basically a ViewModel that is "observable" (generates an event when the underlying data changes, which the View listens for.)
peter_l_downsalmost 13 years ago
Are there any MOVE frameworks yet? I very much like the idea, but one of my favorite tests for "correctness" in a program is to use it to build something. Although it could be (and probably is) a reflection on my lack of knowledge, I find myself "fighting" with MVC frameworks like backbone whenever I try to use them. I would love to see if MOVE would be any better.
评论 #4190009 未加载
评论 #4189975 未加载
评论 #4189918 未加载
评论 #4190137 未加载
评论 #4189954 未加载
dougabugalmost 13 years ago
I agree that the controller abstraction is a bit ambiguous, certainly to the degree that MVC means different things to different people. I thought that the article would be pure flamebait, but actually it does seem to be more precise in its terminology, and captures more closely how I generally design software systems.
cbsmithalmost 13 years ago
&#62; Without closures (or anonymous blocks) event binding can be very tedious; and without deferrables (also known as deferreds or promises) the idea of treating individual operations as objects in their own right doesn't make much sense.<p>Of course, MVC was developed and popularized on Smalltalk.... which had both of these notions...
serbrechalmost 13 years ago
"the "currentUser" model will emit an event to notify your application that it has changed"<p>That sounds like more than just wrapping knowledge to me.<p>Also, why do you absolutely want to fit everything into a framework? Or a pattern? Business logic goes into your domain models. Don't mix your business logic with your framework, that's about it...
j_colalmost 13 years ago
With regard to the "is dead" proclamation in this title, this comment from a previous commenter sums up my feeling perfectly:<p><a href="http://news.ycombinator.com/item?id=554397" rel="nofollow">http://news.ycombinator.com/item?id=554397</a><p>Once I see "X is dead" in a article title, I stop reading.
aryalmost 13 years ago
Arguably Cocoa and Cocoa Touch already have this with the responder chain and notifications.
azylmanalmost 13 years ago
Does anyone else think that it's weird for the model to be sending events directly to the view and have the view listening for those? That seems like something that should be going to the "operation tree" and having that push changes to the view.
arunodaalmost 13 years ago
There is no new here. You have a point here mvc need some upgrades. But it is not dead.<p>You simply divide controller into 2 parts.<p>1. Events 2. Operations<p>I too find event also can be think as a router. The title is bad. This is not new. But a good useful practise.
lectrickalmost 13 years ago
&#62; but the problem with MVC as given is that you end up stuffing too much code into your controllers, because you don't know where else to put it.<p>What the hell is he talking about? Has he never worked with Fat Model™ design?
agumonkeyalmost 13 years ago
For the curious, read the original papers from R.Trygve : <a href="http://heim.ifi.uio.no/~trygver/themes/mvc/mvc-index.html" rel="nofollow">http://heim.ifi.uio.no/~trygver/themes/mvc/mvc-index.html</a>
grandalfalmost 13 years ago
Operations are just a temporary stop on the road to functional programming.
azat_coalmost 13 years ago
Old issues: where to put business logic. Controller, Model, maybe even view? Why just don't use abstraction layer for business logic? Most people do it already. Should we call it Operations?
rdudekulalmost 13 years ago
As a Node.js developer and a former Rails/MVC developer, MOVE does make a lot of sense. I will be waiting for a MOVE Node.js framework with good examples to emulate/use in my Node apps.
mempkoalmost 13 years ago
The inventor of MVC Trygve Reenskaug understood the problem a long time ago and invented DCI as a complement <a href="http://j.mp/MskKMx" rel="nofollow">http://j.mp/MskKMx</a>
emmettalmost 13 years ago
When I read suggested code where each class has one "process" or "run" method, I think that someone who lives in an object-oriented world has reinvented functional programming.
netghostalmost 13 years ago
Seems like a reasonable way to structure an application. It would be great to see a concrete example or two. The login example that is sketched out gets you partway there.
评论 #4190034 未加载
blakecaldwellalmost 13 years ago
In addition, operations fit nicely into queues, and make undo easier. That is, a rename operation can queue up an inverse rename operation for its undo.
brendoncrawfordalmost 13 years ago
This seems to be pretty much the same as MVC, where "Operations" are controllers and "Events" are essentially routes. Am I missing something?
rco8786almost 13 years ago
Honestly it seems nearly identical with MVC except you call Controllers Events and Operations are just your business/data layer logic.
joshonthewebalmost 13 years ago
I think this is a really interesting idea, it would be cool to have a sample app to look at implementing your ideas.
jhailealmost 13 years ago
My controllers have one function for each operation. Oh yeah, and they talk to each other using events...um...
arunodaalmost 13 years ago
I say MVC is not dead. I just said it :) <a href="http://goo.gl/kvs7t" rel="nofollow">http://goo.gl/kvs7t</a>
notspamguyalmost 13 years ago
MOVE sounds an awful lot like JSF.
EGregalmost 13 years ago
So basically Controller has Operations and Events<p>Kind of like in MacOS it has methods and delegates?
tree_of_itemalmost 13 years ago
Does anyone else not really get "MVC"? It seems like every person has their own idea of what it is and no two frameworks can agree on what the necessary parts are. I get the feeling MVC is mostly a bunch of handwaving about separation of concerns, motherhood, and apple pie.
评论 #4190413 未加载
评论 #4190140 未加载
评论 #4190533 未加载
评论 #4190129 未加载
评论 #4190073 未加载
rorrralmost 13 years ago
So you renamed "controllers" to "operations".
评论 #4190026 未加载
评论 #4190068 未加载
评论 #4190066 未加载
评论 #4190081 未加载
评论 #4190011 未加载
shastyalmost 13 years ago
Sorry, composable operations and models firing events is bullshit. The article is somewhat correct in that true MVC is dead in practice, however, service oriented architectures have already filled this void.<p>Eventing is HORRIBLE. Regardless of the source, but models especially are not the place to be firing events.<p>This was all tried years ago. Before writing an article purporting to replace a foundational concept in application development maybe do a little more research into what the actual practical solutions to these factoring problems are.
benihanaalmost 13 years ago
Seems like the Operation layer is a combination of controllers and business logic, which feels like a bad idea to me. If the models only wrap knowledge, but don't do any work, then it's the part of the Operation to both decide what to show and also get it in the correct format to show. This seems like it's doing too much and is analogous to the MVC problem of really fat controllers.
评论 #4190130 未加载
评论 #4190201 未加载
wissleralmost 13 years ago
I've always thought MVC was a joke played on gullible software engineers, kinda like this:<p><a href="http://en.wikipedia.org/wiki/Sokal_affair" rel="nofollow">http://en.wikipedia.org/wiki/Sokal_affair</a>
michaelochurchalmost 13 years ago
I like this. I'm not a UI expert in the least, but I've always felt that the "controllers" component was a bit ill-defined. It seems that the MVC division comes from a time when GUIs were for single-agent, deterministic desktop apps like calculators.<p>In a world where "social" apps are increasingly important (and this time I use "social" non-pejoratively, because even if 99% of "social" is crap, the other 1% is damn important) and notifications need a first-class status, MOVE (the separation between operations, which are agent-initiated, and events, which are observed and can come from anywhere) makes sense.
tubboalmost 13 years ago
Can't wait for the first MOVE framework to come out: "Mumia"
vtryalmost 13 years ago
Try AngularJS, that's MVC done right.
hmansalmost 13 years ago
lol, objectify.
detayalmost 13 years ago
<a href="http://xkcd.com/927/" rel="nofollow">http://xkcd.com/927/</a>
Producealmost 13 years ago
I stopped reading right around here:<p>&#62;the problem with MVC as given is that you end up stuffing too much code into your controllers, because you don't know where else to put it.<p>What was that? You stuff all of your logic into controllers then claim that MVC is broken? Your ugly face is broken. Uglyface.
rgloveralmost 13 years ago
Wow. As a designer who recently took the plunge into learning MVC (via Ruby/Rails), this is incredibly easy to understand. It took a bit of thinking to understand MVC but for some reason, separating out the concept of operations/events makes it blatantly obvious.<p>Now an important question: how would you practically implement this? Would this dicate a separate framework/language altogether or something else (I have a cursory knowledge of development, so play nice)?<p><i>Edit</i> Just noticed the footnote at the bottom of the article linking to these: <a href="https://github.com/bitlove/objectify" rel="nofollow">https://github.com/bitlove/objectify</a> and <a href="http://collectiveidea.com/blog/archives/2012/06/28/wheres-your-business-logic/" rel="nofollow">http://collectiveidea.com/blog/archives/2012/06/28/wheres-yo...</a>