Zurück   Flashforum > Flash > ActionScript > Softwarearchitektur und Entwurfsmuster

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 09-05-2003, 16:21   #1 (permalink)
querdenker
 
Benutzerbild von kelor
 
Registriert seit: Jun 2001
Ort: formel1-stadt hockenheim
Beiträge: 4.731
Cool Mitarbeitersuche mal anders....

hey..hatte da gerade was gebastelt gehabt, dass einem suchergebnisse liefert...

damit sich niemand beschweren kann, hab ich´s leserlich gehalten...

pflegt mitarbeiter in ein array ein und lässt es nach vorkommen, wie name, oder adresse, durchsuchen...

ActionScript:
  1. function coWorker(){
  2.         this.coworkerArr=[];
  3. }
  4. o= coWorker.prototype;
  5.  
  6. //
  7. o.addWorker=function(fName,sName,street,cit,post){
  8.         var obj={firstName: fName, name: sName, street: street, city: cit, postal: post};
  9.         return this.coworkerArr.push(obj);
  10. }
  11.  
  12. //
  13. o.checkElemByArg=function(str){
  14.         var arr=this.coworkerArr; this.str=str;
  15.         for(var i =0; i<arr.length; i++){
  16.                 var tmp= arr[i];
  17.                 for(var elem in tmp){
  18.                         this.checkElemToArg(tmp,tmp[elem]);
  19.                 }
  20.         }
  21.         return;
  22. }
  23.  
  24. //
  25. o.checkElemToArg=function(obj,elem){
  26.         var res;
  27.         res= (elem == this.str) ? true : false;
  28.         if( res){ return this.setResult(obj);} else { return false};
  29. }
  30.  
  31. //
  32. o.setResult=function(obj){
  33.         var result;
  34.         for( var i in obj){
  35.                 result+='\t'+i+': '+obj[i]+'\n';
  36.         }
  37.         result+='\n';
  38.         return this.showResult(result);
  39. }
  40.  
  41. //
  42. o.showResult=function(result){
  43.         return trace('Suchergebniss für '+this.str+' :\n'+result);
  44. }
  45.  
  46. ////////////  ende class coworker  /////////////////////////
  47.  
  48. controller= new coWorker();
  49.  
  50. // bsp...
  51.  
  52. controller.addWorker('dieter', 'meier', 'hofgasse 12', 'musterstadt', '99231');
  53. controller.addWorker('franz', 'müller','burggasse 10','musterdorf', '99999');
  54. controller.addWorker('marta','schuster','dorfweg 3','musterort', '00032');
  55. controller.addWorker('marta','schmitt','amadeusstrass 13','musterland', '66666');
  56.  
  57. controller.checkElemByArg('marta');

und?


greetz

kelor

[edit]

arghhh..das schließende tag vergessen, ich dussel...*g*

Geändert von kelor (09-05-2003 um 16:32 Uhr)
kelor ist offline   Mit Zitat antworten
Alt 09-05-2003, 18:10   #2 (permalink)
querdenker
 
Benutzerbild von kelor
 
Registriert seit: Jun 2001
Ort: formel1-stadt hockenheim
Beiträge: 4.731
hier noch ne erweiterung, um auch nach allen straßen, vornamen, etc...zu suchen:

ActionScript:
  1. function coWorker(){
  2.     this.coworkerArr=[];
  3. }
  4. o= coWorker.prototype;
  5.  
  6. /* addWorker
  7. erstellt ein objekt mit den daten und pusht es in das coworker-array
  8. */
  9. o.addWorker=function(fName,sName,street,cit,post){
  10.    var obj={firstName: fName, name: sName, street: street, city: cit, postal: post};
  11.    return this.coworkerArr.push(obj);
  12. }
  13.  
  14. /*  checkElemByArg
  15. durchsucht zunächst das array nach objekten und ruft für jedes
  16. element im object die fkt. checkElemToArg um weiter zu prüfen.
  17. übergeben wird das object und ein element im object
  18. */
  19. o.checkElemByArg=function(str){
  20.          var arr=this.coworkerArr; this.str=str;
  21.          for(var i =0; i<arr.length; i++){
  22.                 var tmp= arr[i];
  23.                 for(var elem in tmp){
  24.                      this.checkElemToArg(tmp,tmp[elem]);
  25.                 }
  26.          }
  27.          return;
  28. }
  29.  
  30. /* checkPropertyByArg
  31. nimmt den suchstring entgegen, durchläuft array nach objekten.
  32. danach drchläuft es die einzelnen objekte.
  33. ruft für jedes vorkommen in object die fkt checkPropToArg
  34. übergabe ist das object und ein identifier des object.
  35. */
  36. o.checkPropertyByArg=function(str){
  37.          var arr=this.coworkerArr; this.str=str;
  38.          for(var i =0; i<arr.length; i++){
  39.                 var tmp= arr[i];
  40.                 for(var elem in tmp){
  41.                      this.checkPropToArg(tmp,elem);
  42.                 }
  43.          }
  44.          return;
  45. }
  46.  
  47. /* checkPropToArg
  48. erwartet das object und ein identifier innerhalb des objectes.
  49. prüft ob identifier = suchstring ist. wenn ja legt es ein temp.array
  50. an und pusht den identifier in das array.
  51. ruft fkt setResult und übergibt array
  52. */
  53. o.checkPropToArg=function(obj,elem){
  54.         var res; var propArr=[];
  55.         res= (elem == this.str) ? true : false;
  56.         if( res){ propArr.push(obj[elem]); return this.setResult(propArr);} else { return false};       
  57. }
  58.  
  59. /* checkElemToArg
  60. erwartet das objekt und ein element im object als params
  61. prüft, ob element = dem suchstring ist.
  62. wenn ja, dann ruft es die fkt setResult auf, wenn nein dann return false.
  63. übergeben wird das object
  64. */
  65. o.checkElemToArg=function(obj,elem){
  66.          var res;
  67.          res= (elem == this.str) ? true : false;
  68.          if( res){ return this.setResult(obj);} else { return false};
  69. }
  70.  
  71. /* setResult
  72. erwartet das object und durchläuft es.
  73. füllt 'result' mit allen vorkommen.
  74. ruft danach showResult. übergabe ist 'result'.
  75. */
  76. o.setResult=function(obj){
  77.        var result;
  78.        for( var i in obj){
  79.             result+='\t'+i+': '+obj[i]+'\n';
  80.        }
  81.        result+='\n';
  82.        return this.showResult(result);
  83. }
  84.  
  85. /*showResult
  86. gibt ergebniss aus
  87. */
  88. o.showResult=function(result){
  89.         return trace('Suchergebniss für '+this.str+' :\n'+result);
  90. }     
  91.  
  92. ////////////  ende class coworker  /////////////////////////
  93.  
  94. controller= new coWorker();
  95.  
  96. // bsp...
  97.  
  98. controller.addWorker('dieter', 'meier', 'hofgasse 12', 'musterstadt', '99231');
  99. controller.addWorker('franz', 'müller','burggasse 10','musterdorf', '99999');   
  100. controller.addWorker('marta','schuster','dorfweg 3','musterort', '00032');   
  101. controller.addWorker('marta','schmitt','amadeusstrass 13','musterland', '66666');
  102.  
  103.  
  104. controller.checkElemByArg('marta');
  105.  
  106. trace('***************************\n');
  107.  
  108. controller.checkPropertyByArg('city');


greetz

kelor
kelor ist offline   Mit Zitat antworten
Alt 09-05-2003, 18:14   #3 (permalink)
◘ ◘
 
Benutzerbild von beachmeat
 
Registriert seit: Dec 2001
Ort: Amsterdam
Beiträge: 6.126
Ganz schön viel Code für die Aufgabe oder?

Mit Xml liesse sich das ja mit ein bis 2 Methoden realisieren, denke mal das wäre hier sinnvoller oder?
__________________
jeden Tag frisch
beachmeat ist offline   Mit Zitat antworten
Alt 09-05-2003, 18:21   #4 (permalink)
helpQLODhelp
 
Benutzerbild von bokel
 
Registriert seit: Feb 2002
Ort: Köln
Beiträge: 8.505
Ja mach mal beachmeat

mfg r.
bokel ist offline   Mit Zitat antworten
Alt 09-05-2003, 18:23   #5 (permalink)
querdenker
 
Benutzerbild von kelor
 
Registriert seit: Jun 2001
Ort: formel1-stadt hockenheim
Beiträge: 4.731
ja klar kann man das auch anders lösen, beachmeat

iss doch aber ein schönes bsp. wie man es in AS lösen könnte...

greetz

kelor
kelor ist offline   Mit Zitat antworten
Alt 09-05-2003, 19:12   #6 (permalink)
God made me funky..
 
Registriert seit: Apr 2003
Ort: Bremen
Beiträge: 1.067
Hier mal meine Variante deiner Idee, hoffe sie gefällt :

ActionScript:
  1. function Searcher() { ; }
  2. o = Searcher.prototype;
  3.  
  4. o.init = function(objectToSearchTrough, valuesToSearchFor, fieldsToSearchTrough) {
  5.     this.objToSearch = objectToSearchTrough;
  6.     this.valueList = valuesToSearchFor;
  7.     this.fieldList = fieldsToSearchTrough;
  8.     this.results = [];
  9. }
  10.  
  11. o.search = function() {
  12.     for (var i = 0; i < this.objToSearch.length; i++) {
  13.         this.searchInElement(i)
  14.     }
  15.     return this
  16. };
  17.  
  18. o.searchInElement = function(i) {
  19.     for(var j = 0; j < this.valueList.length; j ++) {
  20.         if(this.isAMatch(i, this.valueList[j])) {
  21.             this.results.push(this.objToSearch[i])
  22.         }
  23.     }
  24. }
  25.  
  26. o.isAMatch = function(currElement, str) {
  27.     for(var i  = 0; i < this.fieldList.length; i++) {
  28.         if(this.objToSearch[currElement][this.fieldList[i]] == str) {
  29.             return true
  30.         }
  31.     }
  32.     return false;
  33. }
  34.            
  35.  
  36. o.getResults = function() { return this.results; }
  37.  
  38. delete o
  39.  
  40. function coWorker() {
  41.     this.coworkerArr = [];
  42.     this.Searcher = new Searcher();
  43. }
  44.  
  45. o = coWorker.prototype;
  46. //
  47. o.addWorker = function(fName, sName, street, cit, post) {
  48.     var obj = {firstName:fName, name:sName, street:street, city:cit, postal:post};
  49.     return this.coworkerArr.push(obj);
  50. };
  51.  
  52. o.searchArbitrary = function(valuesToSearchFor, fieldsToSearchTrough) {
  53.     this.Searcher.init(this.coworkerArr, valuesToSearchFor, fieldsToSearchTrough);
  54.     return this.Searcher.search().getResults();
  55. }
  56.  
  57. o.searchByLastName = function(valuesToSearchFor) {
  58.     this.Searcher.init(this.coworkerArr, valuesToSearchFor, ["name"]);
  59.     return this.Searcher.search().getResults();
  60. }
  61.  
  62. o.searchByFirstName = function(valuesToSearchFor) {
  63.     this.Searcher.init(this.coworkerArr, valuesToSearchFor, ["firstName"]);
  64.     return this.Searcher.search().getResults();
  65. }
  66.  
  67. delete o
  68.  
  69. //dummy funktion zum ausgeben
  70.  
  71. function show(results) {
  72.     for(var i = 0; i < results.length; i++) {
  73.         var result = '';
  74.        for( var entry in results[i]){
  75.             result+='\t'+ entry +': '+ results[i][entry] +'\n';
  76.         }   
  77.         trace(result)
  78.     }
  79.     trace("-----------------------");
  80. }
  81.  
  82.  
  83.    
  84. controller = new coWorker();
  85. // bsp...
  86. controller.addWorker('dieter', 'meier', 'hofgasse 12', 'musterstadt', '99231');
  87. controller.addWorker('franz', 'müller', 'burggasse 10', 'musterdorf', '99999');
  88. controller.addWorker('marta', 'schuster', 'dorfweg 3', 'musterort', '00032');
  89. controller.addWorker('marta', 'schmitt', 'amadeusstrass 13', 'musterland', '66666');
  90.  
  91. res = controller.searchArbitrary(["marta", "meier"], ["firstName", "name"]);
  92. show(res)
  93.  
  94. res = controller.searchByFirstName(["marta"]);
  95. show(res)
  96.  
  97. res = controller.searchByLastName(["meier"]);
  98. show(res)
__________________
Kunst ist in erster Linie eine Frage der Form und nicht des Inhalts
Paul Rand
e2e4 ist offline   Mit Zitat antworten
Alt 09-05-2003, 19:29   #7 (permalink)
querdenker
 
Benutzerbild von kelor
 
Registriert seit: Jun 2001
Ort: formel1-stadt hockenheim
Beiträge: 4.731
huch...


des muss ich erst mal genauer lesen...


gibt´s sonst noch irgendwelche unterschiede, außer dass du arrays übergeben kannst [multiple search] und die ergebnisse nicht temp. speicherst, zu meinem script...?

mal lesen muß...

aber sieht heiß aus...


greetz

kelor
kelor ist offline   Mit Zitat antworten
Alt 09-05-2003, 19:33   #8 (permalink)
God made me funky..
 
Registriert seit: Apr 2003
Ort: Bremen
Beiträge: 1.067
Es gibt IMHO einen wichtigen Unterschied, der Searcher ist ein extra Objekt, welches halt in "Hashes" sucht, den kann ich a) mehrfach benutzen, da er nicht an den coWorker gekoppelt ist und b) viel leichter optimieren oder austauschen.
__________________
Kunst ist in erster Linie eine Frage der Form und nicht des Inhalts
Paul Rand
e2e4 ist offline   Mit Zitat antworten
Alt 09-05-2003, 21:04   #9 (permalink)
www.kruesch.de
 
Benutzerbild von flory
 
Registriert seit: Feb 2002
Beiträge: 1.057
ich plädiere auch dafür, Daten und Funktion zu trennen.

Wenn Du die Mitarbeiter einfach als Elemente in ein Array legst, kannst
Du z.B. sehr bequem über meine Array-Erweiterungen (Flory Function Prototype)
suchen, filtern, mappen usw.

Beispiel:

ActionScript:
  1. ASSetPropFlags(Array.prototype,["reduce","filter","map"],1);
  2.  
  3. function coWorker(fName,sName,street,cit,post){
  4.         this.firstName=fName;
  5.         this.name=sName;
  6.         this.street=street;
  7.         this.city=cit;
  8.         this.postal=post;            
  9. }
  10.  
  11. Object.getPropertyHasValueFunction=function(prop,val) {
  12.     return function(obj) {
  13.         return obj[prop]==val; 
  14.     }
  15. }
  16.  
  17. workers=[
  18.     new coWorker('dieter', 'meier', 'hofgasse 12', 'musterstadt', '99231'),
  19. new coWorker('franz', 'müller','burggasse 10','musterdorf', '99999'),
  20. new coWorker('marta','schuster','dorfweg 3','musterort', '00032'),
  21. new coWorker('marta','schmitt','amadeusstrass 13','musterland', '66666')
  22. ];
  23.  
  24. martas=workers.filter(Object.getPropertyHasValueFunction("firstName","marta"));
  25.  
  26. for (var i in martas) trace(martas[i].firstName);
komische Einrückung, macht der automatisch.

schönen Abend
Florian
__________________
www.planet-xaml.net
flory ist offline   Mit Zitat antworten
Alt 09-05-2003, 21:19   #10 (permalink)
God made me funky..
 
Registriert seit: Apr 2003
Ort: Bremen
Beiträge: 1.067
@flory:
Das war es auch worum es mir bei meinem Beispiel ging, funktional würde ich das Teil aus Geschwindigkeitsgründen nicht in der Form einsetzen wollen.
__________________
Kunst ist in erster Linie eine Frage der Form und nicht des Inhalts
Paul Rand
e2e4 ist offline   Mit Zitat antworten
Alt 09-05-2003, 21:23   #11 (permalink)
helpQLODhelp
 
Benutzerbild von bokel
 
Registriert seit: Feb 2002
Ort: Köln
Beiträge: 8.505
Wow Flory,
kürzer geht es wohl kaum.


Für Trennung bin ich auch und ausserdem dafür, dass die Objekte selbst feststellen, ob sie gleich sind oder nicht.

ActionScript:
  1. _global.CoWorkerClass = function( psForename, psSurname, psStreet, psCity, psPostcode) {
  2.     this.sForename = psForename;
  3.     this.sSurname = psSurname;
  4.     this.sStreet = psStreet;
  5.     this.sCity = psCity;
  6.     this.sPostcode = psPostcode;
  7. };
  8. //
  9. o = CoWorkerClass.prototype;
  10. //
  11. o.compare = function(poCmp) {
  12.     for (var i in poCmp) {
  13.         if (poCmp[i] != this[i]) {
  14.             return false;
  15.         }
  16.     }
  17.     return true;
  18. };
  19. //
  20. o.onCompare = function(poCmp, aResult) {
  21.     if (this.compare(poCmp)) {
  22.         aResult.push(this);
  23.     }
  24. };
  25. //
  26. o.toString = function() {
  27.     return this.sForename + " "
  28.                         + this.sSurname + ", "
  29.                         + this.sStreet + ", "
  30.                         + this.sPostcode + " "
  31.                         +  this.sCity;
  32. };
  33. //
  34. // -------------------------------------
  35. //
  36. _global.CoWorkerListClass = function() {
  37.     ASBroadcaster.initialize(this);
  38. };
  39. //
  40. o = CoWorkerListClass.prototype = new Array();
  41. //
  42. o.addWorker = function(psForename, psSurname, psStreet, psCity, psPostcode) {
  43.     this.addListener(new CoWorkerClass(psForename, psSurname, psStreet, psCity, psPostcode));
  44. };
  45. //
  46. o.search = function(psForename, psSurname, psStreet, psCity, psPostcode) {
  47.     var aResult = [];
  48.     if (typeof (psForename) == 'object') {
  49.         var oCmp = psForename;
  50.     } else {
  51.         var oCmp = new Object();
  52.         this.addStringProp(oCmp, "sForename", psForename);
  53.         this.addStringProp(oCmp, "sSurname", psSurname);
  54.         this.addStringProp(oCmp, "sStreet", psStreet);
  55.         this.addStringProp(oCmp, "sCity", psCity);
  56.         this.addStringProp(oCmp, "sPostcode", psPostcode);
  57.     }
  58.     this.broadcastMessage("onCompare", oCmp, aResult);
  59.     return aResult;
  60. };
  61. //
  62. o.addStringProp = function(obj, prop, value) {
  63.     if (typeof (value) == 'string' && value.length > 0) {
  64.         obj[prop] = value;
  65.     }
  66. };
  67. //
  68. // -------------------------------------
  69. //
  70. // Test
  71. //
  72. cwl = new CoWorkerListClass();
  73. cwl.addWorker('dieter', 'meier', 'hofgasse 12', 'musterstadt', '99231');
  74. cwl.addWorker('franz', 'müller', 'burggasse 10', 'musterdorf', '99999');
  75. cwl.addWorker('marta', 'schuster', 'dorfweg 3', 'musterort', '00032');
  76. cwl.addWorker('marta', 'schmitt', 'amadeusstrass 13', 'musterland', '66666');
  77. //
  78. // Hilfsfunktion für die Ausgabe
  79. function show ( res){
  80.       trace("-------------\n" + res.join("\n"));
  81. }
  82. //
  83. res = cwl.search("marta", "meier");
  84. show(res);
  85. //
  86. res = cwl.search("marta");
  87. show(res);
  88. //
  89. res = cwl.search({sSurname: "meier"});
  90. show(res);
  91. //
  92.  

Schöner Thread übrigens,
danke schön.

mfg r.
bokel ist offline   Mit Zitat antworten
Alt 10-05-2003, 01:29   #12 (permalink)
querdenker
 
Benutzerbild von kelor
 
Registriert seit: Jun 2001
Ort: formel1-stadt hockenheim
Beiträge: 4.731
absolut, ralf....stimme ich dir zu...so macht kommunikation spaß!
interessante lösung, im übrigen, von dir...
gefällt mir persönlich sehr...

wobei ich sagen muß, dass dein script schon ein intensives eintauchen in das script verlangt, um zu verstehen, was da passiert...oder sehe ich das nur, persönlich, so?

@flory: geile idee...werde ich mir auf jeden fall nochmals genauer ansehen...


@e2e4: ja, das war mir bereits klar...allerdings ist der code schon um einiges länger, als z.bsp. meiner... und, wie du bereits selbst gesagt hast, u.U. performance-lastiger...dennoch eine sehr schöne idee...

gefällt mir der threat....


greetz

kelor
kelor ist offline   Mit Zitat antworten
Alt 10-05-2003, 02:23   #13 (permalink)
God made me funky..
 
Registriert seit: Apr 2003
Ort: Bremen
Beiträge: 1.067
@Kelor: Das war wirklich nur ein Beispiel für ein anderes Prinzip, wobei ich ohne weiteres zugebe, das ich der letzte bin der 100% optimierten Code in AS schreiben kann, da Mx für mich eher Freizeitvertreib ist als Einkommensquelle(Da liegt mir Java und traurigerweise selbst PHP näher), aber dagegen hilft ja das Forum hier

Codelänge ist für mich nicht das auschlaggebende Argument, da halt ich mich lieber an Fowler mit seinem "Pack auch eine Zeile Code in eine Routine wenn es die Lesbarkeit fördert", wobei mein Beispiel sicher nicht den Preis für gute Lesbarkeit gewinnt.

Ansonsten wirklich schöner Thread, ich mag diesen Vergleich von verschiedenen Ansätzen, und bokel, die Nummer mit dem ASBroadcaster gefällt, wobei mir das Coupling schon zu hart ist, aber da las ich mich auch vom Gegenteil überzeugen.

gruß
e2e4
__________________
Kunst ist in erster Linie eine Frage der Form und nicht des Inhalts
Paul Rand
e2e4 ist offline   Mit Zitat antworten
Alt 10-05-2003, 02:44   #14 (permalink)
querdenker
 
Benutzerbild von kelor
 
Registriert seit: Jun 2001
Ort: formel1-stadt hockenheim
Beiträge: 4.731
um gottes willen, e2e4...wollte das nicht missverstanden haben...

ich finde die idee ausgesprochen interessant...
[vielfalt fördert die entwicklung...*gg*]

und java iss doch ein gutes los, zum geld verdienen, finde ich...

und der punkt iss ja der, dass es in jeder sprsche zig wege gibt, ans ziel zu kommen...daher ist der 100% optimierte code eh ein sehr subjektives erlebnis...*gg*

greetz

kelor
kelor ist offline   Mit Zitat antworten
Alt 10-05-2003, 03:08   #15 (permalink)
God made me funky..
 
Registriert seit: Apr 2003
Ort: Bremen
Beiträge: 1.067
@Kelor: Nee, hatte ich auch nicht als bösgemeinte Kritik verstanden, war nur als Darstellung meiner Motivationsgründe gedacht

So und nu aber ins Bett, ich hab eh schon ein Bier zuviel intus...
__________________
Kunst ist in erster Linie eine Frage der Form und nicht des Inhalts
Paul Rand
e2e4 ist offline   Mit Zitat antworten
Antwort

Lesezeichen

Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind an
Pingbacks sind an
Refbacks sind an



Alle Zeitangaben in WEZ +1. Es ist jetzt 15:34 Uhr.

Domains, Webhosting & Vserver von Host Europe
Unterstützt das Flashforum!
Adobe User Group


Copyright ©1999 – 2012 Marc Thiele