Strugglin' with MVP

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
2 messages Options
Reply | Threaded
Open this post in threaded view
|

Strugglin' with MVP

Roy Coatman
Hi All,

I'm about half way through the OU M206 course and enjoying every
second..................

This has nothing to do with that, it was just a pointer (C++ bah! humbug!)
to my level of ability with ST.

I have been reading this group, the archive (thanks to Ian) and the examples
provided with Dolphin Pro and have finally managed to make a little sense of
MVP but.............

My model, a Shipwreck class, has several instance variables holding (such
as) the name of a ship, its gross tonnage, depth etc.
I have managed after lots of frustrating effort to get an initialized
instance of Shipwreck to appear in a ShipwreckShell presenter and to add:
itself to a Class/Instance variable (Wreck) which holds a ListModel to
collect the Shipwrecks entered by means of Prompters. This is fired by
pressing a button to create the new instance and the add itself to the
Collection held by Wreck.

The Problem.

Although the above seems to work fine is it a good way of achieving this,
and more importantly, how do I interate through the collection held by Wreck
and display it in the presenter? Also the presenter only ever seems to show
the initial instance created on startup of the Shell. How do I perform an
update.

I realize this has something to do with triggers but
what.............how............

Please give me some pointers (it took me a long time to understand these
too!) before I end up as a Yul Bryner lookalike.

Thanks for your time and patience with a beginner,

Cheers,

Roy


Reply | Threaded
Open this post in threaded view
|

Re: Strugglin' with MVP

Ian Bartholomew-4
Roy,

Welcome.

> My model, a Shipwreck class, has several instance variables holding (such
> as) the name of a ship, its gross tonnage, depth etc.
> I have managed after lots of frustrating effort to get an initialized
> instance of Shipwreck to appear in a ShipwreckShell presenter and to add:
> itself to a Class/Instance variable (Wreck) which holds a ListModel to
> collect the Shipwrecks entered by means of Prompters. This is fired by
> pressing a button to create the new instance and the add itself to the
> Collection held by Wreck.

First of all I think you might be having problems because your example above
is a bit too simple (_not_ a criticism, just an observation!) for an MVP
example. The MVP overhead, when applied to something that is basically a
Shell displaying a Collection, may be going to obscure more that it
illustrates. Have a look at the attached "Shipwreck1" which just uses two
classes

- Shipwreck - just containing the date for one Shipwreck and a display
method, nothing else.
- ShipwreckShell1. The main Shell which has an instance variable
"shipwrecks" containing a collection of your defined Shipwrecks (instances
of the Shipwreck class) and the, minimal, logic to maintain this collection.
The Shell class also contains the code to interface to the other three MVP
triads involved (the three display widgets). Note that this shell presenter
has no explicit model!  I've added a few comments in the code which may help
to see how it fits together.

Changing it into an application that does use a shell MVP triad will involve
moving the "collection" aspect (the shipwrecks instance variable in the
above) out of the Shell and into a Model - NB. this Model will not contain
any individual Shipwreck data, just a collection of Shipwreck instances. We
should now have

-ShipwreckShell2 - A Shell subclass and your top level presenter. Has a
ListView showing all the entered shipwrecks and one button, "add" that sends
#addWreck  It asks it's Model (a Shipwrecks instance) to inform it when the
collection of shipwrecks changes.

-Shipwrecks - A Model subclass that acts as ShipwreckShell2's model. This
contains a private collection that holds a list of shipwrecks. All access to
this collection is via messages, usually from ShipwreckShell.

-Shipwreck - As above except that it now has a method to get the information
about the shipwreck it represents from the user.

So how does it work together?

-ShipwreckShell2 show
Opens up and displays the shell. Also initialises a default (empty) model.
File save/load will come later <g>. When the shell is ready (#onViewOpened)
it asks the model for a list (initially empty in this case) of shipwrecks
and displays them in a list view

-User presses "add"
The shell just informs the model that it needs to obtain and add a new
Shipwreck. Normally the shell or model would do this using a dialog but here
we will ask the Shipwreck to get the information itself.  The model adds the
new shipwreck to the collection and fires a trigger event,
#shipwrecksUpdated. The shell, which has previously registered an interest
in this event with the model, responds to the event by getting an updated
list from the model and displaying it.

-User selects a item in the list
As the list contains instances of Shipwreck (not Strings but the actual
instances) we can just interrogate the selected item for the list for the
information. _If_ we did just have Strings in the displayed list we would
have to ask the model for the Shipwreck appertaining to the selected String.

Final point. This may well not be the way I would do it "in real life" (tm)
but, hopefully, it shows the separation of some of the responsibilities

-Shipwrecks (a Model)  maintains a collection of shipwrecks and looks after
any additions (or other changes) and notifies interested parties when
anything occurs.

-Shipwreck (a Data wrapper class) just maintains the information for a
single shipwreck and, in this case, how to obtain information from the user.

-ShipwreckShell (the Presenter) knows about Shipwrecks and Shipwreck
instances and how to obtain information from them. Is the connection point
for all the other MVP triads.

> Thanks for your time and patience with a beginner,

We've all been there <g>

You might also like to check the archive for a thread that started just
before Christmas last year (and never resurfaced after the break) which went
through another MVP example - a Library. It started on 20/12/200 in a thread
entitled "Specific MVP troubles (long)"

Ian



































begin 666 Shipwrecks.zip
M4$L#!!0````(`-U5V"K8X@'MY1 ```1@```.````4VAI<'=R96-K<RYP86/M
M6FUSVS82_IS,Y#_0Z@<Y-U7*=TKNW,U(E)3VIDD\=9I^N+G.T!(ML:9)E:3L
MN-?[[[>[`/@"DGJUW=S4:&.)!+!8+)Y]=@'H#V7ES:Z]A:_\\>JE^'KV=^6<
M?XV\&_],Z5XL@]5=XL^NT^Z;HMW*^_S)3](@CLX4]=M7+U]<>FDP<^.;&S_*
MRKTNEGX8:DJZC.]>O7SULOI>I_<HMY!,@K@.^1!=UJ8SG,^5;.GGFJ>S)%AE
M::=2.0N]-"7UTZ^5,(Y37[GQLV4\%^\687SIA>(I\=-XG<S8A%&4$$YRWN-+
MF)\WGY\I7^7J?UM_E3:\8[-OJ]"QXAX&3_WPJF($IJ\8N[$)F\3&)F)FC8TZ
MHR#RDGOE+3/&>VGREU3[MACD3#F]\#,E\N]*DEZ#J,Z/PH"R#"\,?RRK4!'1
M:"FE]P^E._:OO'68*;>!?]=MM5UST[)B9;PD?N+_M@[2(*NO<^IGYZ5Z5//[
M.< XR.XE=;OC.%PM@ZAA*"[LA(9U"8&@7! %&0`X[=#[#Y>_^K-,2=>7!*WR
MG$!>$*69%\W\3UX2>)>A,%D7U57F_BI;*ED<13!(%UJ3!+DI5JSB.!P',QP6
M:O/7U/[[EB&ZH-Z[>.Z'C;JE&Y1+"W9X#*5HJ1N58GC923.%?9P+\YTS:Y[_
M&1KK&S1^2C4[/Q OOB.>X?#L3**Y$E_EY#K/\<OJ*_RMS'*N[YY4:Q;K`'SE
M].U/WX^5JR2^N<B2(%I P__HVM12]:'=T_N6WC/'ZJ37-YQQKS^R==O0Q@-W
M,/UO]S7).RD-Y67^(L;I3>.$?.ODIXBF&%P%_OQ$.:DT9^2);4D061%LTCE/
M@EN0I/24893>^0DQPZT7KGV<-3Y =S^X]9-N"K.B?MVN(I8+FC([OJ%P\^(7
M:E ,<:9X$?/PZF#((0>.!%"@UEZR6*.QO\Z'X#HP6H"@+=Z3.@L_&WN9AVI\
MB,)[99WZ<^4J3A0)BR .++5>+*4*#19W'<Z5I7<+*(@CGY1(`3YL5&0]GAZ<
MGL,"KS(PYHJ^P"K_3(N U5VD1M::8QHZO%_?7$+S,C :A'SD3/>Z$,&-O*.
M,=F4NI--4)\#0$#3V( !K,_E'XZ MF&V`H""@[S^*[!*]@'2)@\,Y'LWJ U$
M0@`!B ,+W09S$(FPN%J'8%>618&?$TA\;[;,-8&NI&^0LG3HC?(1O\/_.:A0
MOS!(61!F6O%Q(71^SL[7V3 ,SY0<-*0BQ\,!*R)BX(9%X4W*`QV^-!O&V[HZ
MO&]E@22RJG ;A M&*MYLY@.[18N3%5-UIVYG^_?C5''RM]ZZS*BK]648S+9U
MIM7<>TCRE/V["5 ?IJJ Q-[#"ORT])2B8MH>%M,-<=&RU9%F#]3>4!VJ/5,;
M6;W1R-!Z(V,\<H9N7^^/1O6XF.X9&%,Y,D).2V2-+N&"PV;("I#N*GGN!+"=
M*PON(W,`"GE\D'60E NYE!P7-D01'%B4&[_H?,2DR(ON,9; ,D*RG69(1TN/
MB4[+!@Q#GQ(:B#_PN/2BA3_OY($D"18+'U>FZ..R-C0GREB\,/C=KZH(+O@A
MF</ <[<8`!2E3D4[5'8<1]U,"6'67&.*@_$:GF?9&O9*)15[RJ]KH#X/WJWN
MD3^"C%.D%Z8Q4N%M',Q3O@F)@31NE+L`8C;?2:3*#T"=L/U(?32+$BRB&%'!
MYYUR1JO89W5?6U@9M6)E=W*6>O?"B <**/3=($#RG3SU:'$@7M_N10YXD.TZ
MPYXQ,J<]TU8'O4'?<'O:R'&'DU%_I*G#NA>)8?=R)=YI@S]]A* `".('#R).
MXL(HJW6ZO%QGP"R8V[PM1Z"46C(GI('>*.]'ROL8X(".=>-!X,86,XQ#88A
MP0@-N(EF<9+@[I++Z8F4BUR8Y8DW"-5+V !3!L6Q]0<;" ^!7K!OX"H57WZ3
MU^R<\['FQR5]3,;!61_+?GWECOMOR:CX#BR(M 7^BE$<G;ODU>#'#+TY[<AD
MQQ:'C3($`Z]7<Z1/HLD@787>/= ;9459O(*$X@I%LV1A/F=[JKIHSF.$3_PS
M(TYV86[ 0E&&Y)2N5S!?N4(H`O/)J23-09<M$]^G[(R49VD@8UW $$,!4^ <
MUYZ4HDE6J0G-QP# =ZIX)B=2'*DG6ZW&OB*?PLYL@[MS5[9/*IGF`MSBQLN"
MV<\!0D*RCU3+C809WWH%*Y[@^1@8,&4N=;?T([(*)+:)H%]F)E_@(HCR;!=$
M!6_\-_0LC/?NT[ERZI'9Z#3E&_PVBC]_4S'D:W19'L;8`%_E(W $*/XM-*VN
M#.IWUM 4A.+I6!R1#U[(U5G,4F^R6DLCB04Z$W"F>_()U [H+X0(=@J3GWDI
M.53B9^L$S %,/0_ TK#']*XRGKICTJ]D$. [97@0+4&20+XK6(6O?U,=ZO'.
MNP;KKY.R$^?S[Y3Y2A@IK_V0O _"@D6"%!Z5X.IC@@/]ZQ>TR+]+@" WN8N1
M&?TDF+$YY^G]"O@%DCYT<,'20#@E;("=:9RF&5>HL#[I$LLUI"*E'5%SBM13
MX$\]L0$"*RA<[%N0)E[\X/T>P'(5$5XYO?1G'H >J! V/+Z7!H!1OM$OQI0L
MN$-FA?8M9R[2] KL=3[ND@$J:5QF6?1!' #"(W:G] NRKLCWD>#$E, .GDBU
ME-_607*-?I3@7)5Y[*>0Z($,+M9CA'U#!Z'!%84&Z'?-G'0=P1S#>\K-*@IB
MLLAU1(5^2ED3T <\?AUF*=(&BSZECJ?$'O/@Z@K4B3+EXL8+P\P+KY68]HG$
M$G?+`/;B,6Q%(2LB-H(I\C2RR@ZH.=]C2[DB-&I.7H[*&5MDR('I>%D2B1\C
ML(7]CA&Y4YZ[AY3M*C4ES?J6I%G?M/5TQY9KJ!/8<$[&/=,=#WI#IS_N6>;4
MGHS,L>Y8_9:D63\D:=8W)<W_I+U4>DT.Q_P0.!C3M%+VEB=.K$$.V^>,Z3EC
M>LB,B<_^9Y^V\AR%%0,P4-+(+"- $W'8XLD&D#77FN)<;J_F6%?L^,OP%I.0
M*:*8Q46M2LKY:@UH6D*9N@9YMH6^!\Y8S$KX!TX;E[3SJC$"L<92Y(^C3^!/
M'U9^1 HPV)5?BJ,BD$])"%#!G7>/2O@1)8$X,L<';6JY_R_05WL,:7A,[:5Y
M>%>B&.*YEZ%70":!VOK*=13?88.[( QQ-^Q3MGO)LUTF] 8&ABIQR.NMLYC\
M`F(TAO4P]N9T')8O5H.5GS/N+S_C;@Q0QR=&=1F')[hidden email]"F\![E+C"
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
I@0````!3:&EP=W)E8VMS+G!A8U!+!08``````0`!`#P````1$0``````
`
end